TEORİ
John F. Canny tarafından 1986'da geliştirildi. Çok aşamalı bir algoritması vardır ve Biz her aşamayı inceleyeceğiz.
1)Gürültü Azaltma
Canny Kenar algılama algoritması çok hassas çalıştığından görüntüdeki istenmeyen gürültüleride kenar olarak algılayabilir.Bunun için yapılması gereken ilk adım "Gaussian Filtresi" uygulanarak resimdeki istenmeyen gürültülerin kaldırılmasıdır.
2)Görüntünün Yoğunluk Derecesini Bulma
Filtre uygulanarak düzeltilmiş resim yatay yönde(Gx) ve dikey yönde (Gy) türevler elde edilmesi için "Sobel" kerneliyle süzülür. Yatay ve Dikey yöndeki iki resim için kenareğimi ve yönü aşağıdaki gibi bulunur.
Gradiant yönü herzaman kenarlara diktir.Dikey, yatay ve iki diyagonal yönde dört açıdan birine yuvarlanır.
3)Maksimum Bastırma
Eğim büyüklüğü ve yönü alındıktan sonra kenar oluşturmayan,istenmeyen pikselleri kaldırmak için görüntünün tam bir taraması yapılır.Bunun için her bir pikselin eğim yönündeki alanında yer maksimumluğu kontrol edilir.
Yukarıdaki resim ile açıklayacak olursa "A" noktası kenardaki bir noktadır. Gradiant Direction(Gradiant yönü) kenara dik gelir."B" ve "C" boktaları ise Gradiant yönü içerisindedir.Bu nedenle A noktasının yerel maksimum oluşturup oluşturmadığının öğrenilmesi için B ve C noktalarıyla kontrol edilir. Eğer oluşturuyorsa diğer aşamaya geçilir.Kısacası Bu aşamada ince kenarlı bir Binary(Siyah beyaz) resim elde edilir.
4)Histerisiz Eşikleme
Bu noktada tüm kenarların gerçekten kenar olup olmadığına karar verilir.Bunun için iki eşik değeri olan "minVal" ve "maxVal" ihtiyaç duyulur.Yoğunluk Gradiantı maxVal'dan daha büyük olan kenarlar kesinlikle kenar olarak kabul edilir.Yoğunluk Gradiantı minVal'den küçük olan kenarlar ise kesinlikle kenar olarak kabul edilmez.Bu iki eşik değeri arasına giren kenarlar ise bağlantılarına bağlı olarak kenar kabul edilir veya edilmezler.Bu aradaki kenarlar kesin kenar tanımına yani uyan maxVal'dan yüksek olan kenarlara bağlıysa kenar kabul edilir.Aksi taktirde onlarda kenar kabul edilmez.Bir Örnekler açıklarsak;
Yukarıdaki resimde iki adet kenar gösterilmiştir bu iki kenar minVal ve MaxVal ile kıyaslanırsa;
➞A kısmı maxVal'den büyük olduğu için kesin kenardır.
➞C kısmı iki değer arasında kalmış fakat kesin kenara bağlı
devam ettiği için oda kesin kenar kabul edilir.
➞B kısmı iki değer arasında kalmış fakat herhangi bir kesin
kenara bağlı olmadığı için kesin kenar kabul edilmemiştir.
Bu Aşamadan sonra Canny edge işlemi tamamen bitmiş ve resimde istenilen kenarlar bulunmuştur.
ÖRNEK
Kenar Bulunacak Resim:
Kod:
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('X.jpg',0)
edges = cv2.Canny(img,100,200)
plt.subplot(121),plt.imshow(img,cmap = 'gray')
plt.title('Original Image'), plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(edges,cmap = 'gray')
plt.title('Canny Edge'), plt.xticks([]), plt.yticks([])
plt.show()
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('X.jpg',0)
edges = cv2.Canny(img,100,200)
plt.subplot(121),plt.imshow(img,cmap = 'gray')
plt.title('Original Image'), plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(edges,cmap = 'gray')
plt.title('Canny Edge'), plt.xticks([]), plt.yticks([])
plt.show()
Sonuç:
File "C:\python36\lib\site-packages\matplotlib\image.py", line 222, in __init__
YanıtlaSilcm.ScalarMappable.__init__(self, norm, cmap)
File "C:\python36\lib\site-packages\matplotlib\cm.py", line 204, in __init__
self.cmap = get_cmap(cmap)
File "C:\python36\lib\site-packages\matplotlib\cm.py", line 169, in get_cmap
% (name, ', '.join(sorted(cmap_d))))
ValueError: Colormap Gri is not recognized. Possible values are: Accent, Accent_r, Blues, Blues_r, BrBG, BrBG_r, BuGn, BuGn_r, BuPu, BuPu_r, CMRmap, CMRmap_r, Dark2, Dark2_r, GnBu, GnBu_r, Greens, Greens_r, Greys, Greys_r, OrRd, OrRd_r, Oranges, Oranges_r, PRGn, PRGn_r, Paired, Paired_r, Pastel1, Pastel1_r, Pastel2, Pastel2_r, PiYG, PiYG_r, PuBu, PuBuGn, PuBuGn_r, PuBu_r, PuOr, PuOr_r, PuRd, PuRd_r, Purples, Purples_r, RdBu, RdBu_r, RdGy, RdGy_r, RdPu, RdPu_r, RdYlBu, RdYlBu_r, RdYlGn, RdYlGn_r, Reds, Reds_r, Set1, Set1_r, Set2, Set2_r, Set3, Set3_r, Spectral, Spectral_r, Vega10, Vega10_r, Vega20, Vega20_r, Vega20b, Vega20b_r, Vega20c, Vega20c_r, Wistia, Wistia_r, YlGn, YlGnBu, YlGnBu_r, YlGn_r, YlOrBr, YlOrBr_r, YlOrRd, YlOrRd_r, afmhot, afmhot_r, autumn, autumn_r, binary, binary_r, bone, bone_r, brg, brg_r, bwr, bwr_r, cool, cool_r, coolwarm, coolwarm_r, copper, copper_r, cubehelix, cubehelix_r, flag, flag_r, gist_earth, gist_earth_r, gist_gray, gist_gray_r, gist_heat, gist_heat_r, gist_ncar, gist_ncar_r, gist_rainbow, gist_rainbow_r, gist_stern, gist_stern_r, gist_yarg, gist_yarg_r, gnuplot, gnuplot2, gnuplot2_r, gnuplot_r, gray, gray_r, hot, hot_r, hsv, hsv_r, inferno, inferno_r, jet, jet_r, magma, magma_r, nipy_spectral, nipy_spectral_r, ocean, ocean_r, pink, pink_r, plasma, plasma_r, prism, prism_r, rainbow, rainbow_r, seismic, seismic_r, spectral, spectral_r, spring, spring_r, summer, summer_r, tab10, tab10_r, tab20, tab20_r, tab20b, tab20b_r, tab20c, tab20c_r, terrain, terrain_r, viridis, viridis_r, winter, winter_r
(Bu tip uzun bir hata alıyorum. Sizce bunun sebebi nedir?)
File "C:\python36\lib\site-packages\matplotlib\image.py", line 222, in __init__
Silcm.ScalarMappable.__init__(self, norm, cmap)
File "C:\python36\lib\site-packages\matplotlib\cm.py", line 204, in __init__
self.cmap = get_cmap(cmap)
File "C:\python36\lib\site-packages\matplotlib\cm.py", line 169, in get_cmap
% (name, ', '.join(sorted(cmap_d))))
çok özür diliyorum yazdığım koddaki hatadan kaynaklı plt.imshow(img,cmap = 'Gri')
Silplt.imshow(edges,cmap = 'grey')
komutlarındaki "cmap" komutu color map yani renk haritasını beritmeye yarar burasını "Gri" ve"grey" olarak yazdığım için matplotlib kütüphanesi böyle bir komut bulamıyor her iki satırdada cmap='gray' diye düzeltirseniz problem ortadan kalkacaktır. konu anlatımındada hemen kodu düzenliyorum.
Opencv dökümantasyonundan daha açıklayıcı ve faydalı olmuş. Teşekkür ederim.
YanıtlaSil