Merhabalar değerli okurlar ,
bugün sizlerle birlikte biraz resim işleme durumlarını inceleyeceğiz. Senaryomuz, hepimizin bildiği captcha yani resim doğrulama kodlarını otomatik olarak çözümleyip içerisindeki karakterlerin neler olduğunu bize veren bir uygulama hazırlamak olacak. İlk olarak sonuca ulaşmamız için captcha resmindeki kirliliği temizlememiz gerekecek. Kirlilik derken aslında resim içerisindeki karakterlerin zor okunması için hazırlanan desenlerden bahsediyorum. Desen dediğim için gözünüz korkmasın sakın, çünkü aslında desen dediğimiz şey temelinde pixel. Peki aslında her şey resim üzerinde pixel ise, harfler de pixeldir. Harf ve desenleri nasıl ayıracağız ? Bu sorunun çözümü aslında kişiden kişiye değişir. Bunun sebebi de bu soruna çözüm algoritmik olarak verilmektedir. Belirli hazır olan algoritmalar var elbet, fakat her captcha için geçerli değil. Peki bizim yapacağımız da her captcha için geçerli olacak mı ? Ağırlıklı olarak evet geçerli olacak. Çünkü zor bir captcha üzerinde çalıştım. Ama çözümlemeye çalıştığımız captcha'dan daha zor bir captcha verirseniz çözemeyebilir. Baştan söyleyim hazırlıklı olun :)
Gelelim resim üzerindeki deseni nasıl temizleyeceğiz ? Bu duruma çözüm olarak benim kurmuş olduğum algoritma şu şekildedir.
1-) Resmi siyah beyaz yap
2-) Resmin 0,0 noktasından başlayarak 3*3 pixel (yani her bir zıplamada 9 pixel) tara.
3-) Alınan 3*3 pixellerin ortalaması belirli bir ortalamadan küçük ise tüm hepsini beyaz yap
4-) Büyük ise orjinal pixel değerlerini koru.
Bu algoritmada şu sonuç ortaya çıkıyor. Resmi tamamen tarıyorum ve aslında benim için önemli olarak bir mean belirliyorum. Eğer pixellerin ortalama değeri benim belirlediğim ortalama değerden düşük ise o bölgeyi beyaza çevirerek temizlemiş oluyorum. Bu yönteme Image Processing alanı içerisinde Mean Filtering deniliyor. Farklı filtreleme yöntemleri de mevcut. Siz farklı şekilde uygulayabilirsiniz.
Peki gelelim kod kısmına. Resmi siyah beyaz yapan kod parçacıklarını rahatlıkla bulabilirsiniz. Fakat ben gene de sizinle paylaşıyorum .
using (var original = new Bitmap(pb1.Image))
{
using (var resized = new Bitmap(original/*, new Size(pb1.Image.Width * 8, pb1.Image.Height * 8)*/))
{
original.Dispose();
using (var bmp = new Bitmap(resized))
{
for (int y = 0; y < bmp.Height; y++)
{
for (int x = 0; x < bmp.Width; x++)
{
Color eski = bmp.GetPixel(x, y);
int ortalama = (eski.R + eski.G + eski.B) / 3;
Color yeni = eski;
if (ortalama > 213)
yeni = Color.White;
else
yeni = Color.Black;
bmp.SetPixel(x, y, yeni);
}
}
}
}
}
Resmi siyah beyaz yaptıktan sonra sıra geldi kurmuş olduğumuz algoritmanın kodlarına. İşte bu kodlar ,
private void Maskeleme(Image image, string filename, int size, int ortalama)
{
using (var bmp = new Bitmap(image))
{
using (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;
}
//renkler.Add(bmp.GetPixel(x, y));
}
y += (size - 1);
if (bitisy == bmp.Height)
{
break;
}
}
yenibmp.Save(Application.StartupPath + "\\" + filename);
}
}
}
Maskeleme methodumuzu uyguladıktan sonra bir de Median Filtre uygularsak eğer daha temiz sonuç alırız. Bunun için Aforge kütüphanesi içerisinde bulunan Median filtresini uygulayacağız. Kodlar ;
private void MedianFilterUygula(string sourceFile, string destinationFile)
{
System.Drawing.Bitmap imageX = new Bitmap(Image.FromFile(sourceFile));
System.Drawing.Bitmap image = AForge.Imaging.Image.Clone(imageX, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
AForge.Imaging.Filters.Median filter = new Median();
Bitmap newImage = filter.Apply(image);
newImage.Save(destinationFile);
pb1.Image = newImage;
}
Peki şimdi resmi siyah beyaz yaptık, maskeleme methodumuz ile desenleri de temizledik. Peki harfleri resim içerisinden nasıl tanıyacağız ? Bu durumda kullanılan en yaygın yöntem her bir karakterin 1 ve 0 olarak haritası ile resim içerisinde eşleştirme yapmak. Fakat bu yöntem ile resim içerisinde karakterler yatay oldukça, sonuç alma ihtimali de azalıyor. Fakat bir çok hazır kütüphane bu yöntemi kullandığı için ve Amerika'yı yeniden keşfetmemek için biz de bu yöntemi kullanacağız.Bu yöntemi kullanan hazır kütüphaneler ise , Aforge , Microsoft Office Document Imaging (MODI) , tesseract , ... Daha gelişmiş olarak ise EmguCV'yi kullanabilirsiniz.
Biz bu kütüphaneler içerisinden tesseract' ı kullanacağız. Bunun için kodlar aşağıdaki şekilde olmalıdır.
public Form1()
{
InitializeComponent();
// aşağıdaki kod ile indirmiş olduğumuz tessdata klasörü ile tesseract engine i başlatıyoruz.
_ocr.Init("tessdata", "eng", Tesseract.OcrEngineMode.OEM_DEFAULT);
_ocr.SetVariable("tessedit_char_whitelist", "0123456789");
}
private void DoOcr(string file)
{
var result = "";
try
{
Image<Bgr, Byte> image = new Image<Bgr, byte>(file);
_ocr.Recognize(image);
var characters = _ocr.GetCharactors();
foreach (var c in characters)
{
result += c.Text;
}
image.Dispose();
result = Regex.Replace(result, "[^0-9]+", "").Replace('o', '0');
}
catch (Exception exception)
{
MessageBox.Show(exception.Message);
}
label1.Text = result;
}
Yukarıdaki DoOcr fonksiyonumuz , verilen captcha resim yolundaki resim içerisindeki harfler detect edip sonuç olarak verir.
Tüm işlemler tamamlandıktan sonra kırmaya çalıştığımız captcha resmi ;
Siyah beyaz yaptıktan ve maskeleme methodunu uyguladıktan sonra ki hali
Median filtre uyguladıktan sonraki hali ,
Programın çalışmış ve sonucu vermiş hali ise ,
Referans etmeniz gereken kütüphaneler ise ;
Umarım faydalı olmuştur değerli okurlar. Bir sonraki makalede görüşmek dileğiyle esen kalın, teknoloji ile kalın.
Koray Düzgün
MCTS
2 Ocak 2015 Cuma
3 Eylül 2014 Çarşamba
Entity Framework Tablo Bağımsız CRUD İşlemleri - dbContext.Entry(Entity).State = System.Data.EntityState.Added;
Entity Framework Tablo Bağımsız CRUD İşlemleri tr-TR
Merhabalar ,
Entity Framework kullanarak database uygulaması geliştirirken herhangi bir tablo üzerinde Crud(Create-Update-Delete) işlemleri yaparken ilk olarak hangi tablo üzerinde işlem yapılacağının bilinmesi gerekir. Daha sonra Update ve Delete işlemlerinde silinecek veya düzenlenecek olan kaydı bulup hangi tabloda ise gerekli işlemleri yapmamız gerekir.Geniş çaplı bir projeniz olduğunu düşünün ve tüm bu işlemleri her bir tablo işlemi için yaptığınızı düşünün. Tüm bu işlemleri tablo ayırt etmeden tek bir class içerisinde yaptığımızda kazanılacak zaman ve hız ciddi anlamda önem kazanmaktadır. Hoş genelde bu tarz klasik ve kolay olan işlemleri genelde junior developper lar yapar ama olsun :)
Şimdi tablo farketmeksizin CRUD işlemlerini nasıl yapacağımızı görelim.
public string Add(System.Data.Entity.DbContext dbContext,object Entity)
{
try
{
dbContext.Entry(Entity).State = System.Data.EntityState.Added;
dbContext.SaveChanges();
return "Başarılı";
}
catch
{
return "Hatalı";
}
}
public string Edit(System.Data.Entity.DbContext dbContext, object Entity)
{
try
{
dbContext.Entry(Entity).State = System.Data.EntityState.Modified;
dbContext.SaveChanges();
return "Başarılı";
}
catch
{
return "Hatalı";
}
}
public string Delete(System.Data.Entity.DbContext dbContext, object Entity)
{
try
{
dbContext.Entry(Entity).State = System.Data.EntityState.Deleted;
dbContext.SaveChanges();
return "Başarılı";
}
catch
{
return "Hatalı";
}
}
Entity Framework kullanarak database uygulaması geliştirirken herhangi bir tablo üzerinde Crud(Create-Update-Delete) işlemleri yaparken ilk olarak hangi tablo üzerinde işlem yapılacağının bilinmesi gerekir. Daha sonra Update ve Delete işlemlerinde silinecek veya düzenlenecek olan kaydı bulup hangi tabloda ise gerekli işlemleri yapmamız gerekir.Geniş çaplı bir projeniz olduğunu düşünün ve tüm bu işlemleri her bir tablo işlemi için yaptığınızı düşünün. Tüm bu işlemleri tablo ayırt etmeden tek bir class içerisinde yaptığımızda kazanılacak zaman ve hız ciddi anlamda önem kazanmaktadır. Hoş genelde bu tarz klasik ve kolay olan işlemleri genelde junior developper lar yapar ama olsun :)
Şimdi tablo farketmeksizin CRUD işlemlerini nasıl yapacağımızı görelim.
- İlk olarak tabi ki Entity Database Model'imizi oluşturmamız gerekmektedir.
- Daha sonrasında kodlarını hazır olarak vereceğim class'ın kullanılacağı projenin içerisine Entity Framework 5.0.0.0 versiyonunu kurmamız gerekmektedir. Bunun için yapmamız gereken ise ilk olarak resimdeki yerden Package Manager Console'u açmamız gerekir.
- Daha sonra açılan pencerede : install-package entityframework -version 5.0.0.0 yazıp, entity framework paketinin hangi projeye yukleneceği secildikten sonra Enter'a basıp yüklemeyi tamamlayabiliriz.
- Entity Framework kurulumlarını yaptıktan sonra bir Class oluşturup aşağıdakı kodları kullanabiliriz.
public string Add(System.Data.Entity.DbContext dbContext,object Entity)
{
try
{
dbContext.Entry(Entity).State = System.Data.EntityState.Added;
dbContext.SaveChanges();
return "Başarılı";
}
catch
{
return "Hatalı";
}
}
public string Edit(System.Data.Entity.DbContext dbContext, object Entity)
{
try
{
dbContext.Entry(Entity).State = System.Data.EntityState.Modified;
dbContext.SaveChanges();
return "Başarılı";
}
catch
{
return "Hatalı";
}
}
public string Delete(System.Data.Entity.DbContext dbContext, object Entity)
{
try
{
dbContext.Entry(Entity).State = System.Data.EntityState.Deleted;
dbContext.SaveChanges();
return "Başarılı";
}
catch
{
return "Hatalı";
}
}
- Son olarak da aşağıda bu methodları nasıl kullanacağımızın kodları mevcuttur.
var service = new Service.BaseCrudService();
var kategori = new Data.Category
{
CategoryID = 11,
CategoryName = "deneme1",
Description = "acıklama1",
Picture = null
};
service.Add(new Data.NorthwindEntities(), kategori);
Yapacağımız işlemlerin hepsi bu kadar. Böylelikle CRUD işlemlerini tek bir Class içerisinde sadece bir kez yazmış olduk ve daha güzel olan tüm tablo ve tüm modeller için geçerli oldu.
Şuan Dynamic Lambda Expression üzerinde çalışıyorum.Her türlü search işlemlerini kabul eden ve gene model ve tablo bağımsız çalışan bir Class yazmayı hedefliyorum.Bitti anda hemen sizlerle paylaşacağım.
Görüşmek üzere.
Koray Düzgün.
var kategori = new Data.Category
{
CategoryID = 11,
CategoryName = "deneme1",
Description = "acıklama1",
Picture = null
};
service.Add(new Data.NorthwindEntities(), kategori);
Yapacağımız işlemlerin hepsi bu kadar. Böylelikle CRUD işlemlerini tek bir Class içerisinde sadece bir kez yazmış olduk ve daha güzel olan tüm tablo ve tüm modeller için geçerli oldu.
Şuan Dynamic Lambda Expression üzerinde çalışıyorum.Her türlü search işlemlerini kabul eden ve gene model ve tablo bağımsız çalışan bir Class yazmayı hedefliyorum.Bitti anda hemen sizlerle paylaşacağım.
Görüşmek üzere.
Koray Düzgün.
26 Ağustos 2014 Salı
Sql Tablo Owner Değiştirme ( How to change ownership table Sql)
Merhaba arkadaşlar,
Bugün sizlere database üzerinde önceden farklı kullanıcı bilgileri ile oluşturduğumuz tabloların kullanıcı owner bilgisini nasıl değiştireceğimizi göstereceğim. Tek yapmamız gereken ilgili database üzerinde çalışacak yeni bir query penceresi açıp içerisine,
sql komutunu yazıp çalıştırmak. Bu komutla sadece tablo owner bilgisini değil database üzerinde var olan nesnelerin owner bilgilerini de değiştirebilirsiniz.
Bir sonraki makale veya ipuçlarında görüşmek dileğiyle.
Bugün sizlere database üzerinde önceden farklı kullanıcı bilgileri ile oluşturduğumuz tabloların kullanıcı owner bilgisini nasıl değiştireceğimizi göstereceğim. Tek yapmamız gereken ilgili database üzerinde çalışacak yeni bir query penceresi açıp içerisine,
sql komutunu yazıp çalıştırmak. Bu komutla sadece tablo owner bilgisini değil database üzerinde var olan nesnelerin owner bilgilerini de değiştirebilirsiniz.
Bir sonraki makale veya ipuçlarında görüşmek dileğiyle.
17 Haziran 2014 Salı
Chromium Embeded Framework Cookie İşlemleri (SetCookie,DeleteCookie)
Merhabalar arkadaşlar CEF ( Chromium Embeded Framework) ile ilgili önceki makalelerimde embed yapmayı ve User agent bilgisinin değiştirilmesini paylaşmıştım.Bu makalemde ise Cef kullanarak Cookie oluşturma ve silme işlemlerinin nasıl yapıldığından bahsedeceğim.
Cef kullanarak Cookie oluşturmak için ,
CefSharp.CEF.SetCookie("Cookie oluşturan url", "Cookie oluşturan url in domaini", "cookie name", "cookie value",CookieExpriedTime);
Cef kullanarak Cookie silmek için ise ,
CefSharp.CEF.DeleteCookies("Oluşturulan cookienin url i", "cookie name");
Sadece bu kadar. Bir sonraki makalemde görüşmek üzere.
Cef kullanarak Cookie oluşturmak için ,
CefSharp.CEF.SetCookie("Cookie oluşturan url", "Cookie oluşturan url in domaini", "cookie name", "cookie value",CookieExpriedTime);
Cef kullanarak Cookie silmek için ise ,
CefSharp.CEF.DeleteCookies("Oluşturulan cookienin url i", "cookie name");
Sadece bu kadar. Bir sonraki makalemde görüşmek üzere.
Chromium Embeded Framework User Agent Değiştirme(Change)
Merhabalar arkadaşlar ,
Bir önceki makalemde sizlerle .net ortamında windows form application içerisine Chromium Embeded Framework'u nasıl embed edildiğini paylaşmıştım. Bu makalemde ise embed ettiğimiz CEF üzerinden bağlantı sağlanırken User-Agent bilgisini nasıl değiştirildiğini paylaşacağım.
CEF'i başarılı bir şekilde embed ettikten sonra yapmanız gereken global değişken olarak ,
private readonly CefSharp.WinForms.WebView CefBrowser;
CefSharp.Settings ayar = new CefSharp.Settings();
tanımlamak.Daha sonrasında ise IRequestHandler interface ini formunuza implemente etmeniz gerekmektedir.Ve son olarak Form'unuzun constructure kısmına aşağıdaki kodları yazmanız yeterli olacaktır.
ayar.UserAgent = "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0)";
CEF.Initialize(ayar);
CefBrowser= new WebView();
CefBrowser.Dock = DockStyle.Fill;
CefBrowser.RequestHandler = this;
CefBrowser.Address = "www.google.com";
this.Controls.Add(CefBrowser);
Umarım faydali olmuştur.Bir sonraki makalemde görüşmek üzere.
Bir önceki makalemde sizlerle .net ortamında windows form application içerisine Chromium Embeded Framework'u nasıl embed edildiğini paylaşmıştım. Bu makalemde ise embed ettiğimiz CEF üzerinden bağlantı sağlanırken User-Agent bilgisini nasıl değiştirildiğini paylaşacağım.
CEF'i başarılı bir şekilde embed ettikten sonra yapmanız gereken global değişken olarak ,
private readonly CefSharp.WinForms.WebView CefBrowser;
CefSharp.Settings ayar = new CefSharp.Settings();
tanımlamak.Daha sonrasında ise IRequestHandler interface ini formunuza implemente etmeniz gerekmektedir.Ve son olarak Form'unuzun constructure kısmına aşağıdaki kodları yazmanız yeterli olacaktır.
ayar.UserAgent = "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0)";
CEF.Initialize(ayar);
CefBrowser= new WebView();
CefBrowser.Dock = DockStyle.Fill;
CefBrowser.RequestHandler = this;
CefBrowser.Address = "www.google.com";
this.Controls.Add(CefBrowser);
Umarım faydali olmuştur.Bir sonraki makalemde görüşmek üzere.
Kaydol:
Kayıtlar (Atom)