Frage

Ich hatte in einem Video mit OpenCV in ein Video in Visual Studio gelesen und es in Graustufen konvertiert und dann die Funktion cv_thresh_binary verwendet, um es in ein binäres Bild umzuwandeln. Es gibt jedoch Löcher und Geräusche in den Rahmen. Was ist ein einfacher Weg, um Geräusche oder Löcher zu entfernen? Ich habe die Erode- und Dilatfunktionen in OpenCV gelesen, aber ich bin nicht allzu klar, wie ich sie verwenden soll. Dies ist mein Code bisher. Wenn mir jemand zeigen kann, wie man die Rauschentfernung in meinen Code einbezieht, wäre dies sehr geschätzt.

#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;
}
War es hilfreich?

Lösung

Haftungsausschluss: Es ist schwierig, eine gute Antwort zu geben, da Sie nur sehr wenig Informationen gegeben haben. Wenn Sie Ihr Bild vor und nach der Binarisierung gepostet haben, wäre es viel einfacher. Ich werde jedoch versuchen, einige Hinweise zu geben.

Wenn die Löcher ziemlich groß sind, dann ist der Schwellenwert wahrscheinlich falsch, versuchen Sie, ihn zu erhöhen oder zu verringern und das Ergebnis zu überprüfen. Du kannst es versuchen

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

Dies berechnet den Schwellenwert automatisch. Wenn Sie keinen guten Schwellenwert finden, probieren Sie einige adaptive Schwellenwertalgorithmen aus, OpenCV hat eine adaptivethreshold () -Funktion, aber es ist nicht so gut.

Wenn die Löcher und das Geräusch ziemlich klein sind (jeweils nur wenige Pixel), können Sie einige der folgenden Aussagen ausprobieren:

  • Unter Verwendung des Öffnens (Erosion, nächster Dilatation) zum Entfernen von weißem Rauschen und Schließen (Dilatation, nächste Erosion) bis zu kleinen schwarzen Rauschen. Aber denken Sie daran, dass das Öffnen, während das Entfernen von weißem Rauschen auch das schwarze Rauschen stärkt und umgekehrt.

  • Median Unschärfe nach dem Schwellenwert. Es kann ein kleines Rauschen entfernen, sowohl schwarz als auch weiß, während die Farben (Bild nur binär sein wird) und, mit possiblen kleinen Fehlern, Formen. Das Auftragen der medianen Unschärfe vor der Binarisierung kann auch dazu beitragen, kleine Geräusche zu verringern.

Andere Tipps

Sie könnten versuchen, eine zu verwenden Glatt Funktion mit CV_MEDIAN Bevor Sie den Schwellenwert machen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top