Pregunta

Había leído en un video en Visual Studio usando OpenCV y lo convertí a escala de grises, luego usé la función CV_TRESH_BINARY para convertirlo en una imagen binaria. Sin embargo, hay agujeros y ruido en los marcos. ¿Cuál es una forma simple de eliminar el ruido o los agujeros? He leído sobre las funciones Erode y Dilate en OpenCV, pero no tengo demasiado claro cómo usarlas. Este es mi código hasta ahora. Si alguien puede mostrarme cómo incorporar la eliminación de ruido en mi código, sería muy apreciado.

#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;
}
¿Fue útil?

Solución

Descargo de responsabilidad: es difícil dar una buena respuesta, porque proporcionó muy poca información. Si publicó su imagen antes y después de la binarización, sería mucho más fácil. Sin embargo, intentaré dar algunas pistas.

Si los agujeros son bastante grandes, entonces probablemente el valor umbral sea incorrecto, intente aumentar o disminuirlo y verificar el resultado. Puedes probar

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

Esto calculará el valor umbral automáticamente. Si no puede encontrar un buen valor de umbral, intente algunos algoritmos de umbral adaptativos, OpenCV tiene la función adapthreshreshold (), pero no es tan bueno.

Si los agujeros y el ruido son bastante pequeños (pocos píxeles cada uno), puede probar algunos de los siguientes:

  • Usando la apertura (erosión, siguiente dilatación) para eliminar el ruido blanco y el cierre (dilatación, la próxima erosión) al ruido negro pequeño. Pero recuerde que esa abertura, mientras elimina el ruido blanco, también fortalecerá el ruido negro y viceversa.

  • Medio desenfoque después de hacer el umbral. Puede eliminar un ruido pequeño, tanto en blanco como negro, mientras que preservar los colores (la imagen será binario) y, con pequeños errores posees, formas. Aplicar un desenfoque medio antes de la binarización también puede ayudar a reducir el ruido pequeño.

Otros consejos

Podrías intentar usar un Suave función con CV_MEDIAN Antes de hacer el umbral.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top