Domanda

ho letto in un video in Visual Studio utilizzando OpenCV e convertito in scala di grigi poi utilizzato la funzione CV_THRESH_BINARY per convertirlo in un'immagine binaria. Tuttavia, ci sono buchi e il rumore nelle cornici. Che è un modo semplice per rimuovere il rumore oi fori? Ho letto sul erodere e funzioni dilatano in OpenCV, ma io non sono troppo chiare su come usarli. questo è il mio codice finora. Se qualcuno mi può mostrare come incorporare la rimozione del rumore nel mio codice, che sarebbe molto apprezzato.

#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;
}
È stato utile?

Soluzione

NOTA BENE: E 'difficile dare una buona risposta, perché hai fornito informazioni molto poco. Se avete inviato la vostra immagine prima e dopo la binarizzazione, sarebbe molto più facile. Tuttavia, cercherò di dare alcuni suggerimenti.

Se i fori sono piuttosto grandi, allora probabilmente valore di soglia è sbagliato, provare ad aumentare o diminuire e controllare il risultato. Si può provare

cv::threshold(gray_frame, gray_frame, 0, 255, CV_THRESH_BINARY | CV_THRESH_OTSU);

Questo valore di soglia calcolare volontà automaticamente. Se non è possibile trovare un valore di soglia buona, quindi provare alcuni algoritmi soglia adattativa, OpenCV ha funzione adaptiveThreshold (), ma non è così buono.

Se i fori e il rumore sono piuttosto piccole (pochi pixel ciascuno), si può provare alcuni dei seguenti:

  • Utilizzo di apertura (erosione, vicino la dilatazione) per rimuovere il rumore bianco e la chiusura (dilatazione, prossimo erosione) per il piccolo rumore nero. Ma ricordate, che l'apertura, durante la rimozione di rumore bianco, sarà anche rafforzare il rumore bianco e viceversa.

  • sfocatura mediana dopo ti thresholding. Si potrà cancellare piccolo rumore, sia in bianco e nero, pur conservando i colori (immagine sarà Stil essere binario) e, con piccoli errori posssible, forme. L'applicazione di sfocatura mediana PRIMA binarizzazione può anche contribuire a ridurre il piccolo rumore.

Altri suggerimenti

Si potrebbe provare a utilizzare un Smooth funzione con CV_MEDIAN prima di te il thresholding.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top