Bir sisteme otomatik giriş yapacak olan bir yazılım hazırlıyorsunuz fakat sisteme giriş yapabilmek için sistem güvenlik açısından karşınıza CAPTCHA resmi çıkarıyor, bu durumda sisteme otomatik olarak giriş yapabilmek mümkün değildir. Peki, Captcha’yı nasıl çözeriz? Yani geliştirdiğimiz yazılım Captcha içerisindeki resmi nasıl anlar? Bu durumu çözebilmek için kullanabileceğimiz bir kaç kütüphane bulunuyor. Bunlardan bazıları, Microsoft Office Document Imaging (MODI), Aforge, Scott Clayton Captcha Breaker.
Resim-1
Fakat aşağıdaki gibi bir resmi MODI’ye verirseniz size cevap veremeyecektir.
Resim-2
Bunun nedeni ise MODI sizden neredeyse çok temiz bir resim istemektedir. Çok temizden kastım şu ki örnekteki resimde gördüğünüz üzere yazının rengi ile arka olanda kullanılan noktaların rengi aynı tonlarda. Öncelikle bu noktaları kaldırmamız gerekecek ve bu noktaları kaldırırken tabi ki yazıdan olabildiğince az götürmemiz gerekecek.
Resimdeki desenleri kaldırabilmek için uyguladığımız algoritma temelde Image Processing işlemlerinde kullanılan bir algoritmadır. Resmin 0,0 koordinatından başlayarak, 3×3 boyutunda pixeller alıyoruz. Daha sonra bu pixellerin renk değerlerinin ortalamasını alıyoruz ve eğer bu bulduğumuz ortalama belirli bir değerin üzerinde ise o bölgeyi transparan yapıyoruz. Eğer istediğimiz değerden düşük ise kendi orijinal değerlerini bırakıyoruz. Böylelikle kullandığımız 3×3 maskeyinin boyutunu ve ortalama değeri değiştirerek istediğimiz seviyeye gelene kadar bu işlemleri tekrarlayabiliriz. Bu algoritmanın kodları aşağıdaki gibidir.
private
void Maskeleme(Image image, string filename, int size, int ortalama)
{
using (var bmp = new
Bitmap(image))
{
var yenibmp = new
Bitmap(bmp.Width, bmp.Height, PixelFormat.Format32bppRgb);
for (int y = 0; y < bmp.Height; y++)
{
var baslangicy = y;
var bitisy = y + size;
if (bmp.Height < bitisy)
{
bitisy = bmp.Height;
}
for (int x = 0; x < bmp.Width; x++)
{
var baslangicx = x;
var bitisx = x + size;
if (bmp.Width < bitisx)
{
bitisx = bmp.Width;
}
var kucukbmp = bmp.Clone(new
Rectangle(baslangicx, baslangicy, bitisx – baslangicx, bitisy – baslangicy), System.Drawing.Imaging.PixelFormat.Format32bppRgb);
int ortalamaKucuk = 0, toplamRenk = 0;
for (int i = 0; i < kucukbmp.Width; i++)
{
for (int j = 0; j < kucukbmp.Height; j++)
{
toplamRenk += (kucukbmp.GetPixel(i, j).R + kucukbmp.GetPixel(i, j).G + kucukbmp.GetPixel(i, j).B) / 3;
}
}
ortalamaKucuk = toplamRenk / (kucukbmp.Height * kucukbmp.Width);
if (ortalamaKucuk > ortalama)
{
for (int i = 0; i < kucukbmp.Width; i++)
{
for (int j = 0; j < kucukbmp.Height; j++)
{
yenibmp.SetPixel(baslangicx + i, baslangicy + j, Color.White);
}
}
}
else
{
for (int i = 0; i < kucukbmp.Width; i++)
{
for (int j = 0; j < kucukbmp.Height; j++)
{
yenibmp.SetPixel(baslangicx + i, baslangicy + j, kucukbmp.GetPixel(i, j));
}
}
}
x += (size – 1);
if (bitisx == bmp.Width)
{
break;
}
}
y += (size – 1);
if (bitisy == bmp.Height)
{
break;
}
}
yenibmp.Save(Application.StartupPath + “\\” + filename);
}
}
Bu methodu çağırdıktan sonra yukarıdaki resim aşağıdaki hale gelecektir.
Resim-3
Resimde de görüldüğü üzere oldukça başarılı bir şekilde etraftaki desenleri yok edip yazıdan minimum düzeyde götürmüş.
Artık bu resmi MODI için hazırladıktan sonra gelelim resmi çözümleme işlemine. MODI’yi kullanabilmek için Office kurulum sihirbazı aracılığı ile Microsoft Office Document Imaging Feature’ı bilgisayarına kurmanız gerekmektedir. Gelelim MODI ile resmi nasıl okuruz? Aşağıdaki kodları kullanarak bu işlemi yapabiliriz.
MODI.Document modiDocument = new MODI.Document();
public
string Kir(string CaptchaFilePath)
{
try
{
string returnString = “”;
modiDocument.Create(CaptchaFilePath);
modiDocument.OCR(MODI.MiLANGUAGES.miLANG_ENGLISH, true, true);
foreach (MODI.Image insImage in modiDocument.Images)
{
MODI.Layout insLayout = insImage.Layout;
returnString = insLayout.Text;
}
modiDocument.Close(false);
returnString = Regex.Replace(returnString, “[^0-9a-zA-Z]+”, “”);
return returnString;
}
catch
{
return
“”;
}
}
Evet değerli MsHowto okurları, Aforge kütüphanesini kullanabilmek için .Net 2.0 ile projemizi derlememiz gerekiyor. Dolayısıyla ondan şuan uzak durmaya çalışıyorum. Fakat bu günlerde Scott.Clayton.CAPTCHA.CAPTCHABreaker kütüphanesi üzerinde çalışıyorum. Eğer başarırsam MODI’nin çözümleme olasılığından çok daha yüksek olasılıkla sonuç veriyor. Fakat kullanımı MODI kadar basit değil. Bizden resmi çözümleyebilmesi için MAP istemekte. Başarılı bir şekilde sonuç alır almaz bununla ilgili hemen bir makale ile sizinle paylaşacağım.
Umarım faydalı olmuştur. Bir sonraki makalemizde buluşmak dileğiyle.
Bu konuyla ilgili sorularınızı alt kısımda bulunan yorumlar alanını kullanarak sorabilirsiniz.
Referanslar