Je n'ai pas trouvé d'explication détaillée de la version Python d'OpenCV findcontours sur le net, alors j'aimerais noter ce que j'ai essayé. Si vous faites une erreur, veuillez la signaler.
Si vous souhaitez extraire le contour d'une image avec OpenCV, utilisez une fonction appelée findContours. L'image d'entrée est utilisée comme premier argument, le mode d'extraction est utilisé comme deuxième argument et la méthode d'approximation est utilisée comme troisième argument.
fonction findcontours
image, contours, hierarchy = cv2.findContours(Image d'entrée,Mode d'extraction,Méthode approximative)
Cet article n'explique pas la méthode d'approximation. Nous utilisons une méthode d'approximation unifiée appelée
cv2.CHAIN_APPROX_SIMPLE```.
Blob signifie «bloc» et fait référence à une masse de pixels noirs ou blancs. Dans l'extraction de contour, il semble que la méthode d'extraction du contour diffère entre le contour de la goutte blanche et le contour de la goutte noire, je vais donc l'expliquer ci-dessous.
Le contour de la goutte noire semble extraire les sommets de la matrice la plus externe de la goutte dans le sens antihoraire.
Le contour de la goutte blanche semble extraire l'extérieur de la matrice la plus externe de la goutte dans le sens des aiguilles d'une montre, comme illustré dans la figure ci-dessous.
Lors de la détection du contour de l'extérieur, le noir est détecté en premier. Ainsi, si vous avez une goutte noire sur fond blanc, la goutte noire sera détectée en premier, mais si vous avez un fond noir, l'arrière-plan noir sera détecté en premier. La prudence est de mise.
--La matrice de couche la plus externe de l'image n'est pas extraite en tant que contour.
Les couches les plus externes de l'image (0 ligne, 9 lignes, 0 colonne, 9 colonnes dans l'image ci-dessus) n'ont pas été extraites en tant que contours. Dans l'image ci-dessus, par exemple, lorsque l'extraction de contour est effectuée dans le mode d'extraction
RETR_EXTERNAL```, la sortie est la suivante.
production
[array([[[1, 1]],
[[1, 8]],
[[8, 8]],
[[8, 1]]])]
L'ordre dans lequel les contours des taches sont détectés semble être dans l'ordre décroissant de la valeur y des coordonnées du point de départ de l'extraction du contour. Si les valeurs y sont égales, l'ordre des valeurs x les plus élevées est antérieur.
Il existe au moins quatre modes d'extraction:
RETR_EXTERNAL, `` `` RETR_LIST
,
RETR_CCOMP, et `` `` RETR_TREE
.
RETR_EXTERNAL RETR_EXTERNAL est un mode qui extrait uniquement le contour le plus à l'extérieur du contour. Même s'il y a un contour à l'intérieur du contour, il ne sera pas extrait. Par conséquent, le contour de la goutte blanche n'est pas détecté.
production
[array([[[7, 7]],
[[7, 8]],
[[8, 8]],
[[8, 7]]]), array([[[1, 1]],
[[1, 5]],
[[5, 5]],
[[5, 1]]])]
RETR_TREE RETR_TREE est une représentation parfaite des contours imbriqués. En d'autres termes, détectez d'abord les taches noires dans l'ordre expliqué dans "Ce que j'ai remarqué", et quand je trouve une goutte avec une structure imbriquée, j'extraire le contour de la goutte dans cette goutte.
production
[array([[[7, 7]],
[[7, 8]],
[[8, 8]],
[[8, 7]]]), array([[[1, 1]],
[[1, 5]],
[[5, 5]],
[[5, 1]]]), array([[[1, 2]],
[[2, 1]],
[[4, 1]],
[[5, 2]],
[[5, 4]],
[[4, 5]],
[[2, 5]],
[[1, 4]]]), array([[[3, 3]]])]
RETR_LIST RETR_LIST obtient les contours dans la même hiérarchie quel que soit le contour blanc, le contour noir, à l'intérieur ou à l'extérieur. Par conséquent, l'ordre d'acquisition des contours est l'ordre expliqué dans "・ Ce que j'ai remarqué".
production
[array([[[7, 7]],
[[7, 8]],
[[8, 8]],
[[8, 7]]]), array([[[3, 3]]]), array([[[1, 2]],
[[2, 1]],
[[4, 1]],
[[5, 2]],
[[5, 4]],
[[4, 5]],
[[2, 5]],
[[1, 4]]]), array([[[1, 1]],
[[1, 5]],
[[5, 5]],
[[5, 1]]])]
RETR_CCOMP RETR_CCOMP extrait d'abord tous les contours des blobs noirs, puis extrait les contours des blobs blancs. La commande sera la commande expliquée dans "・ Ce que j'ai remarqué".
production
[array([[[7, 7]],
[[7, 8]],
[[8, 8]],
[[8, 7]]]), array([[[3, 3]]]), array([[[1, 1]],
[[1, 5]],
[[5, 5]],
[[5, 1]]]), array([[[1, 2]],
[[2, 1]],
[[4, 1]],
[[5, 2]],
[[5, 4]],
[[4, 5]],
[[2, 5]],
[[1, 4]]])]
Recommended Posts