2012-02-17 17 views
7

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_THRESH_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 muy 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.eliminando el ruido en una imagen binaria usando openCV

#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; 
} 

Respuesta

9

DESCARGO DE RESPONSABILIDAD: Es difícil dar una buena respuesta, ya que 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 algunos consejos.

Si los orificios son bastante grandes, entonces probablemente el valor del umbral sea incorrecto, intente aumentarlo o disminuirlo y verifique el resultado. Puede probar

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

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

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

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

  • Median blur DESPUÉS de hacer umbrales. Puede eliminar pequeños ruidos, tanto en blanco como en negro, conservando los colores (la imagen seguirá siendo binaria) y, con posibles pequeños errores, formas. La aplicación de desenfoque mediano ANTES de la binarización también puede ayudar a reducir el ruido pequeño.

+0

Lamento no haber proporcionado las imágenes, pero muchas gracias por su ayuda.Usé la función cvErode que eliminó algunos de los agujeros en la imagen, pero también trataré la borrosidad media. Cuando mencionaste usar apertura y cierre, ¿tengo que usarlos juntos o hacer CV_MOP_OPEN o CV_MOP_CLOSE? –

+0

Aún puede proporcionarlos :) Puede usar uno de ellos o ambos, uno después del otro, depende de lo que intente obtener. Solo revise los resultados y experimente. –

+0

Revisé los resultados y decidí que se obtuvieron mejores resultados con las funciones Erode y Dilate, así que las usaré, una después de la otra. En cualquier caso, no sé cómo proporcionar las imágenes ya que soy nuevo en stackoverflow:/Lo siento mucho. Actualmente estoy trabajando en un proyecto de procesamiento de imágenes que involucra C++ y openCV. Se basa en el reconocimiento de movimiento, por lo que si publico más preguntas, agradecería mucho si pudiera proporcionar alguna ayuda, ya que ha sido muy útil. Gracias :) –

1

Usted puede intentar utilizar una función Smooth con CV_MEDIAN antes de hacer el umbral.

+0

¿Conseguiría eso el mismo resultado que las funciones de erosión y dilatación? ¿Estás familiarizado con el uso de esas funciones? –

+0

puede usar apertura y cierre (erosión + dilatación y viceversa), claramente necesita ajustar el tamaño del núcleo – andrea

+0

¿Puedo utilizar las funciones de apertura o cierre o tengo que usarlas juntas? –

Cuestiones relacionadas