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.defects = cv2.convexityDefects(cnt,hull)
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()
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ç: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
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ç: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
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ç: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
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