la suppression du bruit dans une image binaire à l'aide d'openCV
J'avais lu dans une vidéo dans Visual Studio à l'aide d'openCV et convertie en niveaux de gris puis utilisé la fonction CV_THRESH_BINARY à la convertir en une image binaire. Cependant, il y a des trous et le bruit dans les images. Ce qui est un moyen simple pour supprimer le bruit ou les trous? J'ai lu sur le miner et de Dilater les fonctions d'openCV, mais je ne suis pas trop clair sur la façon de les utiliser. c'est mon code jusqu'à présent. Si quelqu'un peut me montrer comment intégrer la suppression du bruit dans mon code, il serait grandement apprécié.
#include "cv.h"
#include "highgui.h"
int main( int argc, char* argv ) {
CvCapture *capture = NULL;
capture = cvCaptureFromAVI("C:\\walking\\lady walking.avi");
if(!capture){
return -1;
}
IplImage* color_frame = NULL;
IplImage* gray_frame = NULL ;
int thresh_frame = 70;
int frameCount=0;//Counts every 5 frames
cvNamedWindow( "Binary video", CV_WINDOW_AUTOSIZE );
while(1) {
color_frame = cvQueryFrame( capture );//Grabs the frame from a file
if( !color_frame ) break;
gray_frame = cvCreateImage(cvSize(color_frame->width, color_frame->height), color_frame->depth, 1);
if( !color_frame ) break;//If the frame does not exist, quit the loop
frameCount++;
if(frameCount==5)
{
cvCvtColor(color_frame, gray_frame, CV_BGR2GRAY);
cvThreshold(gray_frame, gray_frame, thresh_frame, 255, CV_THRESH_BINARY);
cvShowImage("Binary video", gray_frame);
frameCount=0;
}
char c = cvWaitKey(33);
if( c == 27 ) break;
}
cvReleaseImage(&color_frame);
cvReleaseImage(&gray_frame);
cvReleaseCapture( &capture );
cvDestroyWindow( "Grayscale video" );
return 0;
}
OriginalL'auteur sue-ling | 2012-02-17
Vous devez vous connecter pour publier un commentaire.
AVERTISSEMENT: Il est difficile de donner une bonne réponse, parce que vous a fourni que très peu d'info. Si vous avez posté votre image avant et après binarisation, il serait beaucoup plus facile. Cependant, je vais essayer de vous donner quelques conseils.
Si les trous sont assez gros, alors probablement la valeur de seuil est mauvaise, essayez d'augmenter ou de la diminuer et de contrôler le résultat. Vous pouvez essayer de
Cela permettra de calculer la valeur de seuil automatiquement.
Si vous ne trouvez pas un bon seuillage de la valeur, alors essayez de certains algorithmes de seuillage adaptatif, opencv a adaptiveThreshold() de la fonction, mais ce n'est pas si bon.
Si les trous et le bruit sont plutôt de petite taille (quelques pixels), vous pouvez essayer certains des éléments suivants:
À l'aide de l'ouverture (érosion, à côté de la dilatation) pour supprimer le bruit blanc et de clôture(dilatation, à côté de l'érosion) de petit noir bruit. Mais rappelez-vous, que l'ouverture, tout en supprimant le bruit blanc, permettra également de renforcer le bruit noir et vice versa.
Flou médian APRÈS seuillage. Il peut enlever le petit bruit, à la fois noir et blanc, tout en préservant les couleurs (image stil être binaire) et, avec possible des petites erreurs, des formes. L'application de flou médian AVANT de binarisation peut également aider à réduire petit bruit.
Vous pouvez toujours fournir: -)) Vous pouvez utiliser l'un d'eux ou les deux, l'un après l'autre, ça dépend de ce que vous essayez de ahieve. Il suffit de vérifier les résultats et de l'expérience.
J'ai vérifié les résultats et a décidé que les meilleurs résultats ont été obtenus avec les deux érosion et la Dilatation des fonctions donc je vais utiliser, l'une après l'autre. En tout cas, je ne sais pas comment faire pour fournir les images comme je suis nouveau sur stackoverflow:/ je suis vraiment désolé. Je suis actuellement en train de travailler sur un projet de traitement d'image qui consiste à C++ et openCV. Il est basé sur la motion de reconnaissance, donc si je poste plus de questions, je vous en serais très reconnaissante si vous pouviez fournir de l'aide que vous avez été très utile déjà. Merci:)
Seriez-vous en mesure de voter à ma question, donc je peux obtenir plus de 10 points de réputation? Je veux poster des images, pour cette question, stackoverflow.com/questions/9372687/... mais qui nécessite plus de 10 rep qui est l'endroit où je suis actuellement. Ce serait formidable si vous pouvez donner un peu d'aide avec la question aussi 🙂
OriginalL'auteur Tomasz Niedabylski
Vous pouvez essayer en utilisant un Lisse fonction avec
CV_MEDIAN
avant de faire le seuillage.vous pouvez utiliser d'ouverture et de fermeture (érosion + dilatation et vice-versa), il est clair que vous devez ajuster la taille du noyau
Je peux soit utiliser l'ouverture ou la fermeture de fonctions ou dois-je les utiliser ensemble?
non ce n'est pas le même que le éroder et se dilatent fonctions - c'est une autre façon de réduire le bruit que vous pouvez appliquer avant le seuillage. Il serait gratuit pour éroder et se dilatent, aucune raison que vous ne pouvait pas combiner les approches qui fonctionne le mieux.
merci beaucoup pour l'aide. J'ai essayé les deux érosion et de dilatation ensemble et a obtenu un meilleur résultat, donc je pourrais en tenir à cette approche.
OriginalL'auteur Mark Ransom