2017-06-17 2 views
0

J'ai deux images binaires et j'essaie de détecter les contours des taches blanches (le contour rose dans la partie droite du collage est le résultat du contour).cv2.findContours impossible de détecter les contours

cv2.contourFind() fonctionne très bien pour CONTOUR1:

Contour1 Image & Result

Mais pour Contour2 c'est agir bizarre:

Contour2 Image & Result

Voici l'appel de fonction pour elle

#Convert Image to grayscale 
img = cv2.imread(file_name) 
img2gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 
ret, mask = cv2.threshold(img2gray, 0, 255, cv2.THRESH_OTSU + cv2.THRESH_BINARY_INV) 

kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3)) 
dilated = cv2.dilate(mask, kernel, iterations=2) 
image, contours, hierarchy = cv2.findContours(dilated.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE) 

for contour in contours: 
    [x, y, w, h] = cv2.boundingRect(contour) 
    cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 255), 2) 

En utilisant cette variable contours, je dessine des rectangles autour des points trouvés. Je ne comprends pas pourquoi cela fonctionne pour Contour1, mais échoue pour Contour2 quand ils sont assez similaires.

+1

S'il vous plaît modifier votre question pour fournir un [exemple minimal, complet, vérifiable] (https://stackoverflow.com/help/mcve). –

+0

Terminé, @AlexanderReynolds –

+0

Combien de contours sont dans les «contours» pour chaque image? –

Répondre

1

Erreur: L'image binaire avait une fine bordure blanche dans Contour2 mais pas dans Contour1 (mon mauvais!). Depuis que je demandé seulement contours extérieurs, cv2.RETR_EXTERNAL dans

image, contours, hierarchy = cv2.findContours(dilated.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE) 

pour Contour2 avait seulement la boîte extérieure détectée et par conséquent aucun de ses enfants se dessiné. Mais dans Contour1 il n'y a pas de boîte de bordure blanche autour de l'image binaire d'où les taches blanches internes ont été détectées.

Solution: Utilisez cv2.RETR_LIST ou cv2.RETR_CCOMP