Comment déterminer une région d'intérêt et puis de recadrer une image à l'aide d'OpenCV
J'ai posé une question similaire ici mais qui est plus axé sur l'tesseract.
J'ai une image de l'échantillon ci-dessous. Je voudrais faire le carré blanc de ma Région de l'Intérêt et de rogner la partie (carré) et créer une nouvelle image. Je vais travailler avec des images différentes de sorte que le carré ne sera pas toujours au même endroit dans toutes les images. Donc j'ai besoin de quelque façon détecter les bords de la place.
Quels sont les pré-méthodes de traitement, je peux effectuer pour obtenir le résultat?
OriginalL'auteur birdy | 2013-03-28
Vous devez vous connecter pour publier un commentaire.
À l'aide de votre image de test, j'ai pu supprimer tous les bruits avec un simple l'érosion opération.
Après, une simple itération sur les
Mat
à trouver pour le coin pixels est trivial, et j'en ai parlé sur cette réponse. Pour des fins de test, nous pouvons tirer vert lignes entre les points pour afficher la zone qui nous intéresse dans l'image d'origine:À la fin, je définir le retour sur investissement dans l'image d'origine et de culture qu'une partie.
Le résultat final est affiché sur l'image ci-dessous:
J'ai écrit un exemple de code qui effectue cette tâche à l'aide de la interface C++ de OpenCV. Je suis confiant dans vos compétences pour traduire ce code en Python. Si vous ne pouvez pas le faire, oubliez le code et le coller avec le feuille de route j'ai partagé sur cette réponse.
Pas besoin de me remercier, tout en haut de voter la réponse. Envisager cliquant sur la case à cocher près d'elle pour la sélectionner comme la réponse officielle. En faisant ces choses vous seront d'aider les futurs visiteurs.
ce ne la ligne
if (*it)
ne/?if (pixel != 0)
Je suis vraiment confus. J'ai mis un if/else bloc sur la ligne de code. c'est à dire
if (*it) { std::cout << "if" << std::endl; std::cout << it.pos() << std::endl; } else { std::cout << "else" << std::endl; std::cout << it.pos() << std::endl; }
mais par exemple je reçois le texte suivant dans la sortieif [411, 280] else [412, 280]
. Quelle est la différence entre les deux? les points ne sont pas 0 dans l'un ou l'autre..OriginalL'auteur karlphillip
De voir que le texte est la seule grosse goutte, et tout le reste est à peine plus grand qu'un pixel, une simple morphologiques ouverture devrait suffire
Vous pouvez le faire dans opencv
ou avec imagemagick
Ensuite le rectangle blanc devrait être la seule chose à gauche dans l'image. Vous pouvez le trouver avec opencvs findcontours, avec la CvBlobs bibliothèque opencv pour ou avec imagemagick -en fonction des cultures
Ici est votre image avec les 2 étapes de l'érosion suivie par 2 étapes de dilatation appliquée:
Il suffit de brancher cette image dans le opencv findContours de la fonction que dans le Carrés tutoriel pour obtenir la position
Quand vous avez rectangle (même pas rempli), il est très facile à utiliser findContours fonction(docs.opencv.org/doc/tutorials/imgproc/shapedescriptors/...) pour trouver le contour du rectangle(probablement, vous trouverez plus d'un profil - il suffit de prendre la plus grosse) et le remplir avec la couleur blanche. Vous aurez un rectangle plein, alors maintenant, utilisez simplement au niveau du bit(docs.opencv.org/modules/core/doc/...) sur cette image et sur la photo d'origine.
OriginalL'auteur HugoRune