使用openCV去除二进制图像中的噪声

sue*_*ing 8 c++ opencv computer-vision noise-reduction

我使用openCV将视频读入Visual Studio并将其转换为灰度,然后使用函数CV_THRESH_BINARY将其转换为二进制图像.但是,框架中存在孔洞和噪音.什么是消除噪音或漏洞的简单方法?我已经阅读了openCV中的Erode和Dilate函数,但我对如何使用它们并不太清楚.到目前为止这是我的代码.如果有人能告诉我如何将噪声消除结合到我的代码中,我们将不胜感激.

#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;
}
Run Code Online (Sandbox Code Playgroud)

Tom*_*ski 9

免责声明:很难给出一个好的答案,因为你提供的信息非常少.如果您在二值化之前和之后发布了图像,那将会更加容易.但是,我会尽量给出一些提示.

如果孔太大,那么可能阈值是错误的,尝试增加或减少它并检查结果.你可以试试

cv::threshold(gray_frame, gray_frame, 0, 255, CV_THRESH_BINARY | CV_THRESH_OTSU);
Run Code Online (Sandbox Code Playgroud)

这将自动计算阈值.如果你找不到一个好的阈值,那么尝试一些自适应阈值算法,opencv有自适应阈值()函数,但它不是那么好.

如果孔和噪声相当小(每个像素几个),您可以尝试以下一些方法:

  • 使用开口(侵蚀,下一次扩张)去除白噪声和关闭(扩张,下一次侵蚀)到小黑噪声.但请记住,在消除白噪声的同时,开口也会增强黑噪声,反之亦然.

  • 在进行阈值处理后,中位数模糊.它可以消除黑色和白色的小噪声,同时保留颜色(图像将是二进制的),并且具有可能的小错误,形状.在二值化之前应用中值模糊也可以帮助减少小噪声.