GÖRÜNTÜ İŞLEME - (7.Hafta) KENAR BELİRLEME ALGORİTMALARI Bu konuda bir çok algoritma olmasına rağmen en yaygın kullanılan ve etkili olan Sobel algoritması burada anlatılacaktır. SOBEL FİLTRESİ Görüntüyü siyah beyaza çevirdikten sonra eğer kenar bulma algoritmalarını kullanmak isterseniz bir kaç seçenekten en popüleri sobel kenar bulma filtresidir. Aşağıdaki çekirdek matrisler (konvolüsyon matrisleri) dikey, yatay ve köşegen şeklindeki kenarları bulmak için kullanılır. Sobel operatörü bir resmin kenarlarına karşılık gelen alansal yüksek frekans bölgelerini (keskin kenarları) ortaya çıkarır. Teorik olarak, operatör aşağıda gösterildiği gibi 3 3 konvolüsyon matrisinden oluşur. Şekil. Sobel konvolüsyon matrisi Bu matrisler, yatay ve dikey olarak çalışan kenarlara en üst düzeyde yanıt vermek için tasarlanmıştır. Matrisler giriş görüntüsüne ayrı ayrı uygulanabilir. Böylece her bir yön için pikselin değeri ayrı ayrı ölçülmüş olur. Daha sonra bu değerler her bir noktada mutlak büyüklüğü ve yönü bulmak üzere birleştirilebilir. Piksel değeri şu şekilde verilir. Alışılmış olarak daha hızlı hesaplama için yaklaşık değer şu şekilde de hesaplanabilir. Kenarın yön açısı (piksel ızgarasına göre) alansal piksel değerine bakarak şu şekilde bulunur. Bu durumda 0 derece yönlendirme açısı, resim üzerinde soldan sağa doğru siyahtan beyaza doğru kontras değişimini gösterir. Bunun dışındaki tüm açılar saatin tersi yönüne göre ölçülür. Çoğu zaman, bu mutlak büyüklük kullanıcının gördüğü çıktıyı verir; İki bileşeninin hesaplanması Şekil'de gösterilen temsili konvolüsyon operatörünü kullanarak yapılır ve girdi görüntüsü üzerinden tek bir kez geçilir. Şekil. Yaklaşık piksel değerini hızla hesaplamak için kullanılan temsili konvolüsyon matrisi. 1
Bu çekirdek matris kullanılarak yaklaşık büyüklük şu şekilde hesaplanır: Sobel operatörü Roberts Coross operatörüne benzer fakat ondan daha yavaş hesaplar. Sobelde çekirdek matris daha büyük olduğu için gürültüden daha az etkilenir. Operatör aynı zamanda Roberts Cross'a kıyasla benzer kenarlar için daha yüksek çıkış değerleri üretir. Görüntülerdeki doğal kenarlıklar, Sobel operatörünün yumuşatma etkisinden dolayı çıkıştaki birkaç piksellik hatlara neden olur. Buna karşı koymak için biraz inceltme arzulanabilir. Başarısız olursa Canny operatöründe olduğu gibi bir çeşit histeresis sırtının izlenmesi de kullanılabilir. Programlama (Sobel Filtresi) private void sobeltoolstripmenuitem_click_1(object sender, EventArgs e) { Bitmap GirisResmi, CikisResmi; GirisResmi = new Bitmap(pictureBox1.Image); int ResimGenisligi = GirisResmi.Width; int ResimYuksekligi = GirisResmi.Height; CikisResmi = new Bitmap(ResimGenisligi, ResimYuksekligi); int SablonBoyutu = 3; int ElemanSayisi = SablonBoyutu * SablonBoyutu; int x, y; for (x = (SablonBoyutu - 1) / 2; x < ResimGenisligi - (SablonBoyutu - 1) / 2; x++) //Resmi taramaya şablonun yarısı kadar dış kenarlardan içeride başlayacak ve bitirecek. { for (y = (SablonBoyutu - 1) / 2; y < ResimYuksekligi - (SablonBoyutu - 1) / 2; y++) { Color Renk; int P1, P2, P3, P4, P5, P6, P7, P8, P9; Renk = GirisResmi.GetPixel(x -1, y -1); P1 = Renk.R; 2
Renk = GirisResmi.GetPixel(x, y - 1); P2 = Renk.R; Renk = GirisResmi.GetPixel(x + 1, y - 1); P3 = Renk.R; Renk = GirisResmi.GetPixel(x - 1, y ); P4 = Renk.R; Renk = GirisResmi.GetPixel(x, y ); P5 = Renk.R; Renk = GirisResmi.GetPixel(x + 1, y ); P6 = Renk.R; Renk = GirisResmi.GetPixel(x - 1, y + 1); P7 = Renk.R; Renk = GirisResmi.GetPixel(x, y + 1); P8 = Renk.R; Renk = GirisResmi.GetPixel(x + 1, y + 1); P9 = Renk.R; //Hesaplamayı yapan Sobel Temsili matrisi ve formülü. int RenkDegeri = Math.Abs((P1 + 2 * P2 + P3) - (P7 + 2 * P8 + P9)) + Math.Abs((P3 + 2 * P6 + P9) - (P1 + 2 * P4 + P7)); } //Renkler sınırların dışına çıktıysa, sınır değer alınacak. if (RenkDegeri > 255) RenkDegeri = 255; CikisResmi.SetPixel(x, y, Color.FromArgb(RenkDegeri, RenkDegeri, RenkDegeri)); } } picturebox2.image = CikisResmi; 3
Örnek başka bir çalışma: 4
5
6