Comment recadrer l'intérieur de la zone du contour?
Je suis en train de travailler sur la Rétine du fond d'œil des images.L'image se compose d'une circulaire de la rétine sur un fond noir. Avec OpenCV, j'ai réussi à obtenir un contour qui entoure l'ensemble de la circulaire de la Rétine. Ce dont j'ai besoin est de découper la circulaire de la rétine de l'arrière-plan noir.
- qu'entendez-vous par la culture? les images sont toujours rectangulaires, de sorte que vous pouvez faire est de créer un masque et de faire vos opérations suivantes (traitement de rendu) que sur les pixels masqués. Ou vous pouvez recadrer l'image, de sorte qu'il est représenté par la boîte englobante de la rétine, ce qui peut être beaucoup plus petite que l'image d'origine, mais encore un peu les parties noires (depuis la rétine n'est pas rectangulaire). Ou vous pouvez rogner au maximum une zone rectangulaire à l'INTÉRIEUR de la rétine, qui wouldnt ont tout noir pixel d'arrière-plan à gauche, mais va supprimer les parties de la rétine trop. Lequel voulez-vous?
- Si c'est le dernier scénario, s'il vous plaît essayer stackoverflow.com/questions/21410449/...
Vous devez vous connecter pour publier un commentaire.
Il n'est pas clair dans votre question si vous souhaitez réellement supprimer les informations définies à l'intérieur du contour ou le masque de l'information qui n'est pas pertinent pour le contour choisi. Je vais explorer ce faire dans les deux situations.
En masquant les informations
En supposant que vous avez exécuté
cv2.findContours
sur votre image, vous avez reçu une structure qui répertorie tous les contours disponible dans votre image. Je suis aussi en supposant que vous connaissez les indice de la courbe qui a été utilisé pour entourer l'objet que vous voulez. En supposant que cela est stocké dansidx
, la première utilisationcv2.drawContours
pour dessiner un rempli version de ce contours sur une image vide, puis utiliser cette image pour l'indice dans votre image pour en extraire de l'objet. Cette logique masques toute l'information non pertinente et ne conserve que ce qui est important - qui est définie à l'intérieur du contour que vous avez sélectionné. Le code pour faire cela ressemblerait à quelque chose comme ce qui suit, en supposant que votre image est en niveaux de gris d'une image stockée dansimg
:Si vous voulez vraiment des cultures...
Si vous voulez culture l'image, vous devez définir le minimum couvrant la zone de délimitation de la zone délimitée par le contour. Vous pouvez trouver en haut à gauche et du coin inférieur droit de la boîte englobante, puis utiliser l'indexation de découper ce dont vous avez besoin. Le code sera le même qu'avant, mais il y aura un recadrage étape:
Le recadrage code fonctionne de telle manière que lorsque nous définissons le masque à extraire de la zone délimitée par le contour, nous avons en outre trouver le plus petit coordonnées horizontales et verticales qui définissent le coin en haut à gauche du contour. De même, nous trouvons la plus grande coordonnées horizontales et verticales qui définissent le coin en bas à gauche du contour. Nous utilisons ensuite l'indexation avec ces coordonnées pour recadrer ce que nous avons réellement besoin. Notez que cela effectue un recadrage sur le masqué image - c'est l'image qui supprime tout, mais les informations contenues dans le plus grand contour.
Note avec OpenCV 3.x
Il convient de noter que le code ci-dessus suppose que vous êtes en utilisant OpenCV 2.4.x. Prenez note que dans OpenCV 3.x, la définition de
cv2.drawContours
a changé. Plus précisément, la sortie est de un à trois éléments d'un tuple de sortie lorsque la première image est la source de l'image, tandis que les deux autres paramètres sont les mêmes que dans OpenCV 2.4.x. Par conséquent, il suffit de modifier lecv2.findContours
énoncé dans le code ci-dessus pour ignorer la première sortie:np.where
offre des emplacements de ligne dansx
et des emplacements de colonne dansy
qui sont non nuls. Par conséquent, l'indexation dans le tableau est correct. S'il vous plaît réellement tester vos modifications avant de proposer une modification.x
représente l'emplacement des colonnes ety
pour les emplacements de ligne, c'est pourquoi elles peuvent sembler être échangé.np.where
. Vous êtes très bien avec la première approche dans ce cas, mais pas le second.