C# ile Görüntü İşleme – 3
Tarih: June 4th, 2009 | Yazan: Ahmet Kakıcı | Kategori: Programlama | Etiketler: görüntü işleme, image processing, kod | 8 Yorum »İlk iki yazının ardından ( 1 – 2 ) sonunda üçüncü yazıyı da yazabildim. Bu yazıya sadece morfolojik filtreler kaldı. Diğer yazılara gelen yorumlardan sonra açıklamadan çok koda ihtiyaç olduğu anladım, onun için aşağıda genleşme (dilation) ve aşınma (erosion) işlemini yapan fonksiyonları bulacaksınız. Benim kullandığım genleşme ve aşınma maskeleri en basit olanları. Siz kendi maskelerinizi if koşulu içine yazarak dilediğiniz gibi kullanabilirsiniz.
Eğer genleşme ve aşınma hakkında daha fazla bilgi istiyorsanız Dilation – Erosion bağlantılarını takip edebilirsiniz.
void Dilation()
{
if (!dilationDone)
{
dilationPixelArray = new int[imageWidth, imageHeight];
for (int i = 1; i < imageWidth - 1; i++)
{
for (int j = 1; j < imageHeight - 1; j++)
{
if (binaryPixelArray[i, j] == 255)
{
dilationPixelArray[i - 1, j] = 255;
dilationPixelArray[i, j - 1] = 255;
dilationPixelArray[i, j + 1] = 255;
dilationPixelArray[i + 1, j] = 255;
}
}
}
}
else
{
int[,] tempArray = new int[imageWidth, imageHeight];
Array.Copy(dilationPixelArray, tempArray, imageWidth * imageHeight);
for (int i = 1; i < imageWidth - 1; i++)
{
for (int j = 1; j < imageHeight - 1; j++)
{
if (tempArray[i, j] == 255)
{
dilationPixelArray[i - 1, j] = 255;
dilationPixelArray[i, j - 1] = 255;
dilationPixelArray[i, j + 1] = 255;
dilationPixelArray[i + 1, j] = 255;
}
}
}
}
}
void Erosion()
{
if (!erosionDone)
{
erosionPixelArray = new int[imageWidth, imageHeight];
for (int i = 1; i < imageWidth - 1; i++)
{
for (int j = 1; j < imageHeight - 1; j++)
{
if (binaryPixelArray[i, j] == 255)
{
if (binaryPixelArray[i, j - 1] == 0 ||
binaryPixelArray[i - 1, j] == 0 ||
binaryPixelArray[i + 1, j] == 0 ||
binaryPixelArray[i, j + 1] == 0
)
{
erosionPixelArray[i - 1, j] = 0;
erosionPixelArray[i, j - 1] = 0;
erosionPixelArray[i, j + 1] = 0;
erosionPixelArray[i + 1, j] = 0;
erosionPixelArray[i, j] = 0;
}
else
{
erosionPixelArray[i, j] = binaryPixelArray[i, j];
}
}
else
{
erosionPixelArray[i, j] = binaryPixelArray[i, j];
}
}
}
}
else
{
int[,] tempArray = new int[imageWidth, imageHeight];
Array.Copy(erosionPixelArray, tempArray, imageWidth * imageHeight);
for (int i = 1; i < imageWidth - 1; i++)
{
for (int j = 1; j < imageHeight - 1; j++)
{
if (tempArray[i, j] == 255)
{
if (tempArray[i, j - 1] == 0 ||
tempArray[i - 1, j] == 0 ||
tempArray[i + 1, j] == 0 ||
tempArray[i, j + 1] == 0
)
{
erosionPixelArray[i - 1, j] = 0;
erosionPixelArray[i, j - 1] = 0;
erosionPixelArray[i, j + 1] = 0;
erosionPixelArray[i + 1, j] = 0;
erosionPixelArray[i, j] = 0;
}
else
{
erosionPixelArray[i, j] = tempArray[i, j];
}
}
else
{
erosionPixelArray[i, j] = tempArray[i, j];
}
}
}
}
}
Bundan önceki yazılardaki yapıyı kullandığınızı varsayarak yukarıdaki iki fonksiyonu aşağıdaki şekilde çağırmanız gerekli. Bu fonksiyonların yaptığı iş ise eğer resim ikili seviyeye indirgenmemişse (siyah-beyaz) önce bu işlemi yapmak. Tabii ikiliye çevirmek için herhangi bir eşik değeri belirlenmemişse otsu fonksiyonunu çağırarak önce bir eşik değeri hesaplatıyoruz. Binary fonksyionu ise 0-255 arasındaki parametreyi eşik değeri olarak kullanarak resmi ikili seviyeye indirgiyor, parametrenin 256 olması ise otsu ile hesaplanan eşik değerini alması içindir.
public void ShowDilation()
{
if (!dilationDone)
{
if (!binaryDone)
{
if (otsuValue == 0)
Otsu();
Binary(256);
}
Dilation();
dilationDone = true;
}
else
{
Dilation();
}
SetImage(ref dilationPixelArray);
}
public void ShowErosion()
{
if (!erosionDone)
{
if (!binaryDone)
{
if (otsuValue == 0)
Otsu();
Binary(256);
}
Erosion();
erosionDone = true;
}
else
{
Erosion();
}
SetImage(ref erosionPixelArray);
}

Bence bütün bunlarla uğraşmanın Üniversitelerde ödev olması dışında bir anlamı yok
Yine bence doğru olan Bu işlerle uğraşağınız vakti, Bu işlerin zaten kodlandığı hazır kütüphaneleri öğrenmeyle ve belki ondan sonra o kütüphanelerin eksikliklerini tamamlamaya harcamak daha doğru olur.
Hatta yeni baştan daha iyi profesyonel bir görüntü işleme kütüphanesi yazma niyetinde bile olsak. hali hazırdakileri bilmek lazım…
@Bluekid şimdiye kadar yazdığım görüntü işleme kodlarını yazmaya mecburdum, ödev-proje vs.
Direk ‘hazır yapılmışı var’ diyerek kütüphanelere yönelmektense böylesi daha iyi oldu sanırım. Açıkçası bunları yazmak benim için bir zevkti ancak ileride yapacağım herhangi bir projede görüntü işleme amaç değil araç olduğunda kütüphaneleri de gönül rahatlığıyla kullanırım.
makele için teşekkür ederim.Yayınlanmasını bekliyordum.Ufkunuzun açılması için hazır kodlardan ziyade işin temelinide kavramak gerek.Şu halde Amerika’yı yeniden keşfetmeye çalışmak en doğrusu bence.Eğer ticari boyutta bişeyler yapmak istiyorsanız yinede hazır kütüphanelere başvurun ama bunlar sizi ancak belli bir noktaya kadar götürür.
Ahmet Hocam Size Önce Teşekkürlerimi Sunar Daha Sonra Yürekten Kutlarım.İnternette O Kadar Aradım Herhalde Türkçe Kaynaklar içerisinde Tek Yararlandığım senin Görüntü işleme Makalelerin Oldu.Ayrıca Bende Ktü de Okuyan Biri Olarak Gurur duydum Açıkçası.Çok Teşekkürler Bu güzel Paylaşım İçin!!!!!
Güzel olmuş, bu kodların sonucunda doğan bir örnekte olsa ve denesek daha güzel olurdu sanki :)
Koray onları da eklemiştim ama 5 aralık günü sunucuda bir sorun oldu ve bütün dosyalar uçtu. Kalan sağlar arasında o örnekler yok malesef. Bir ara tekrar ekleyeceğim, o zamana kadar google : http://images.google.com.tr/images?q=site%3Aahmetkakici.com :)
sayın kakıcı;
hough transform ile ilgili bilgileriniz varsa paylaşabilir misin?
Hough transform ile ilgili internette bir çok kaynak var ancak bizzat kullanmadığım için detaylı bir yazı yazamıyorum malesef.