8 Haziran 2017 Perşembe

OPENCV DERSLERİ (DERS:16) CANNY KENAR ALGILAMA




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()

    Sonuç:

Ders:15⬅                                                            Ders:17

4 yorum:

  1. File "C:\python36\lib\site-packages\matplotlib\image.py", line 222, in __init__
    cm.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?)

    YanıtlaSil
    Yanıtlar
    1. File "C:\python36\lib\site-packages\matplotlib\image.py", line 222, in __init__
      cm.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))))

      Sil
    2. çok özür diliyorum yazdığım koddaki hatadan kaynaklı plt.imshow(img,cmap = 'Gri')
      plt.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.

      Sil
  2. Opencv dökümantasyonundan daha açıklayıcı ve faydalı olmuş. Teşekkür ederim.

    YanıtlaSil