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;
}
Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top