Contour Detection

Kategori: Computer Vision , 01 Şubat 2020 , JanFranco


Contour detection prensibinde, siyah arkaplan üzerindeki beyaz objeleri tespit edebiliriz. Uygulama üzerinden daha iyi anlaşılır diye düşünerek açıklamayı kısa tutuyorum. OpenCV kütüphanesini kullanarak Python üzerinden görelim. Kütüphaneleri ve resmi alalım:


import cv2
import numpy as np

img = cv2.imread('../data/internal_external.png', 0)
cv2.imshow('img', img)
cv2.waitKey(0)
>>

Contour Detection

Görüyoruz ki resimde 3 ana obje var, üçgen, surat ve pizza. Surat ve pizza içinde de contourlar var. Bu contourları tespit etmek için findContours methodunu kullanacağız. Method parametre olarak input resim, contour manipulasyonu için method ve contour tespit etme methodu alır. Return olarak input resmi, bulduğu contourları ve contour hiyerarşisini döner. Genellikle contour tespiti için CHAIN_APPROX_SIMPLE methodu kullanılır. Ancak RETR_LIST yazılan kısımla biraz oynayacağız:


_, contours, hierarchy = cv2.findContours(img, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)

print(len(contours))
print(hierarchy)

>>

22
[[[ 4 -1  1 -1]
  [ 2 -1 -1  0]
  [ 3  1 -1  0]
  [-1  2 -1  0]
  [21  0  5 -1]
  [ 6 -1 -1  4]
  [ 7  5 -1  4]
  [ 8  6 -1  4]
  [ 9  7 -1  4]
  [10  8 -1  4]
  [11  9 -1  4]
  [12 10 -1  4]
  [13 11 -1  4]
  [14 12 -1  4]
  [15 13 -1  4]
  [16 14 -1  4]
  [17 15 -1  4]
  [18 16 -1  4]
  [19 17 -1  4]
  [20 18 -1  4]
  [-1 19 -1  4]
  [-1  4 -1 -1]]]
Manipülasyon methodları inceleyelim:


cv2.RETR_EXTERNAL: Sadece external contours (Üçgen, surat ve pizza)
cv2.RETR_CCOMP: External contours ve internal contours
cv2.RETR_TREE: External contours ve internal contours, contourlar bir ağaç yapısındaymış gibi sıralı
cv2.RETR_LIST: Tüm contourlar, external ve internal ayrımı yok
Burada cv2.RETR_CCOMP kullanarak, üçgen, surat ve pizza dış contourlarını ve surat, pizza içindeki internal yani iç contourları aldık. Örneğin RETR_EXTERNAL kullansaydık 22 contour yerine sadece 3 contour dönecekti. Contourları bastıralım:


contours1 = np.zeros(img.shape)
for i in range(len(contours)):
    if hierarchy[0][i][3] == -1:
        cv2.drawContours(contours1, contours, i, 255, -1)

cv2.imshow("img", contours1)
cv2.waitKey(0)
>>

Contour Detection


contours2 = np.zeros(img.shape)
for i in range(len(contours)):
    if hierarchy[0][i][3] == 0:
        cv2.drawContours(contours2, contours, i, 255, -1)

cv2.imshow("img", contours2)
cv2.waitKey(0)
>>

Contour Detection


contours3 = np.zeros(img.shape)
for i in range(len(contours)):
    if hierarchy[0][i][3] == 4:
        cv2.drawContours(contours3, contours, i, 255, -1)

cv2.imshow("img", contours3)
cv2.waitKey(0)
>>

Contour Detection


Sonraki Yazı: Feature Matching
Yorumlar

Henüz bir yorum bulunmuyor.
Yorum bırakın