la suppression du bruit dans une image binaire en utilisant OpenCV
-
27-10-2019 - |
Question
J'avais lu dans une vidéo en utilisant Visual Studio OpenCV et converti en niveaux de gris, puis utilisé la fonction CV_THRESH_BINARY pour le convertir en une image binaire. Cependant, il y a des trous et du bruit dans les cadres. Qu'est-ce qu'un moyen simple pour éliminer le bruit ou les trous? J'ai lu sur le Erode et les fonctions dilatent dans 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 incorporer 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;
}
La solution
AVERTISSEMENT: Il est difficile de donner une bonne réponse, parce que vous avez fourni très peu d'informations. Si vous avez publié votre image avant et après binarisation, il serait beaucoup plus facile. Cependant, je vais essayer de donner quelques conseils.
Si les trous sont assez grande, alors la valeur de seuil probablement ne va pas, essayez d'augmenter ou de diminuer et vérifier le résultat. Vous pouvez essayer
cv::threshold(gray_frame, gray_frame, 0, 255, CV_THRESH_BINARY | CV_THRESH_OTSU);
Cette calculera automatiquement la valeur de seuil. Si vous ne trouvez pas une bonne valeur de seuillage, essayez quelques algorithmes de seuillage adaptatif, OpenCV a la fonction adaptiveThreshold (), mais ce n'est pas si bon.
Si les trous et le bruit sont assez faibles (quelques pixels chacun), vous pouvez essayer certains des éléments suivants:
-
En utilisant l'ouverture (l'érosion, la prochaine dilatation) pour éliminer le bruit blanc et fermeture (dilatation, érosion suivante) à petit bruit noir. Mais rappelez-vous, que l'ouverture, tout en supprimant le bruit blanc, également renforcer le bruit noir et vice versa.
-
Flou médian après vous ne seuillage. Il peut retirer petit bruit, à la fois en noir et blanc, tout en conservant des couleurs (image Stil être binaire) et, avec des erreurs posssible petites formes. L'application de flou médian avant binarisation peut également aider à réduire petit bruit.
Autres conseils
Vous pouvez essayer d'utiliser un lisse fonction avec CV_MEDIAN
avant de faire seuillage.