21 Haziran 2017 Çarşamba

OPENCV DERSLERİ (DERS:20) KONTUR PART-3

DİĞER KONTUR FONKİSYONLARI

    1)Dışbükeylik Kusuru
        Kontur derslerinde part 2'de konveks gövde çizgilerinin konturlarla ilgili olduğu gösterilmiştir.Cismin bu gövdeden sapması konveks(dışbükey) kusuru olarak kabul edilebilir.
        OpenCV kütüphanesinde bu kusuru bulmak için hazır bir komut bulunmaktadır.Bu komut cv2.convexityDefects() komutur. Kullanımı ise ;

hull = cv2.convexHull(cnt,returnPoints = False)
defects = cv2.convexityDefects(cnt,hull)
        Konveks gövde kusuru bulunabilmesi için ilk başta konturun konveks gövdesinin bulunması gereklidir. Yukarıdaki kodda ilk satır konveks gövde bulur. ikinci satır ise o gövdeye ait konveks kusurlarını bulur.
        Bir örnekle pekişterecek olursak ;

        Giriş resmi:
       

        Kod:
import cv2
import numpy as np

img = cv2.imread('yildiz.jpg')
img_gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(img_gray, 127, 255,0)
image,contours,hierarchy = cv2.findContours(thresh,2,1)
cnt = contours[0]

hull = cv2.convexHull(cnt,returnPoints = False)
defects = cv2.convexityDefects(cnt,hull)

for i in range(defects.shape[0]):
s,e,f,d = defects[i,0]
start = tuple(cnt[s][0])
end = tuple(cnt[e][0])
far = tuple(cnt[f][0])
cv2.line(img,start,end,[0,255,0],2)
cv2.circle(img,far,5,[0,0,255],-1)

cv2.imshow('img',img)
cv2.imwrite('convexdefects.png',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

        Sonuç:
        

        Kodu açıklayacak olursak;
                1. Resim okunur gri skalya çevrilir ve ardından threshold
                    işleminden geçirilerek binary resime dönüştürülür.
                2. Binary hale getirlen resimin konturu bulunur ve
                    ardından bulunan konturun konveks gövdesi bulunur.
                3. Konveks gövdeye ait konveks kusurları bulunur. ve
                    for döngüsü ile her bir konveks kusur noktaları
                    çizdirilir.

    2)Noktalı Çokgen Testi  
        Bu işlev görüntüdeki bir nokta ile bir kontur arasındaki en kısa mesafeyi bulmaya yarar. Nokta kontur dışındayken negatif olan mesafeyi, nokta kontur içindeyken ise pozitif mesafeyi bulur ve nokta kontur üstünde ise mesafeyi sıfır olarak döndürür.
        Örneğin noktanın(50,50) bölgesinde olduğunu varsayarsak en yakın mesafeyi şu şekilde bulabiliriz;
dist = cv2.pointPolygonTest(cnt,(50,50),True)
        Burada üçüncü argüman çok önemlidir koddaki gibi "True" yazılırsa aradaki mesafeyi bulur fakat "False" yazılırsa noktanın konturun dışında mı içindemi yoksa üstünde mi olduğunu belirtir.
        Üçüncü argümanı False olarak ayarlayıp kodu derlediğinizde çıktının 3 farklı tip olduğunu gözlersiniz Bunlar;
                1. (+1): noktanın konturun dışında olduğunu gösterir.
                2. (-1): noktanın konturun içinde olduğunu gösterir.
                3. (0): noktanın konturun tam üstünde olduğunu gösterir.
        Not: Mesafeyi bulmanıza gerek yok ise False argümanını kullanmaya özellikle dikkat edin mesafe bulma işlemi uzun süren bir işlemdir.False kullanmanız kodunuzun 2,3 kat daha hızlı çalışmasını sağlar.

    3)Şekilleri Karşılaştırma
        OpenCV'de iki şeklin veya iki konturun karşılaştırılmasını sağlayan cv2.matchShapes() kullanılır. Bu komut benzerliği gösteren bir metriği döndürür.Sonuç ne kadar düşükse karşılaştırma işlemi bir o kadar daha iyi sonuç vermiş anlamına gelmektedir.
        cv2.matchShapes() komutu Hu-moments değerlerine dayanarak hesaplanır.
        Bir örnekle pekiştirelim;
                3 farklı resmi kıyaslayalım giriş resimleri ise 2 farklı yıldız ve bir dikdörtgen olsun. önce aynı resmi birbiriyle kıyaslayarak birebir aynılıkta hangi değeri verdiğini gözleyelim.Daha sonra ise diğerlerini birbiriyle gözleyelim

        Kıyaslanacak İki resim:
                                  
       
        KOD:
import cv2
import numpy as np

img1 = cv2.imread('yildiz.jpg',0)
img2 = cv2.imread('yildiz.jpg',0)

ret, thresh = cv2.threshold(img1, 127, 255,0)
ret, thresh2 = cv2.threshold(img2, 127, 255,0)
img,contours,hierarchy = cv2.findContours(thresh,2,1)
cnt1 = contours[0]
img1,contours,hierarchy = cv2.findContours(thresh2,2,1)
cnt2 = contours[0]

ret = cv2.matchShapes(cnt1,cnt2,1,0.0)
print ret
        Sonuç:

        


        Kıyaslanacak İki resim:

                          

        KOD:
import cv2
import numpy as np

img1 = cv2.imread('yildiz.jpg',0)
img2 = cv2.imread('yildiz2.jpg',0)

ret, thresh = cv2.threshold(img1, 127, 255,0)
ret, thresh2 = cv2.threshold(img2, 127, 255,0)
img,contours,hierarchy = cv2.findContours(thresh,2,1)
cnt1 = contours[0]
img1,contours,hierarchy = cv2.findContours(thresh2,2,1)
cnt2 = contours[0]

ret = cv2.matchShapes(cnt1,cnt2,1,0.0)
print ret
        Sonuç:

       


        Kıyaslanacak İki resim:

                          

        KOD:
import cv2
import numpy as np

img1 = cv2.imread('yildiz.jpg',0)
img2 = cv2.imread('dikdortgen.jpg',0)

ret, thresh = cv2.threshold(img1, 127, 255,0)
ret, thresh2 = cv2.threshold(img2, 127, 255,0)
img,contours,hierarchy = cv2.findContours(thresh,2,1)
cnt1 = contours[0]
img1,contours,hierarchy = cv2.findContours(thresh2,2,1)
cnt2 = contours[0]

ret = cv2.matchShapes(cnt1,cnt2,1,0.0)
print ret
        Sonuç:

           

        3 farklı sonucu kıyaslayacak olursak;
                1. İlk örnekte aynı resimler kıyaslanmış ve sonuç 0.0 yani
                    birebir benzerlik bulunmuştur.
                2. İkinci örnekte ise birbirine benzer iki yıldız
                    kıyaslanmış ve sonuç 0.00055 gibi bir değer bulunmuş
                    yani birbirine çok benzer olduğu gözlenmiştir.
                3. Üçüncü örnekte ise sonuç 0.3269 gibi bir değer 
                    ve bu iki resmin birbirine çok az benzediği
                    gözlenmiştir.  



Ders:19⬅                                                            Ders:21              

0 yorum:

Yorum Gönder