C++ 用openCV去除二值图像中的噪声

C++ 用openCV去除二值图像中的噪声,c++,opencv,computer-vision,noise-reduction,C++,Opencv,Computer Vision,Noise Reduction,我使用openCV在Visual Studio中读取了一段视频,并将其转换为灰度,然后使用函数CV_THRESH_BINARY将其转换为二进制图像。但是,框架中存在孔洞和噪音。去除噪音或孔洞的简单方法是什么?我已经阅读了openCV中的腐蚀和扩展函数,但我不太清楚如何使用它们。这是到目前为止我的代码。如果有人能告诉我如何将噪声消除融入到我的代码中,我将不胜感激 #include "cv.h" #include "highgui.h" int main( int argc, char* argv

我使用openCV在Visual Studio中读取了一段视频,并将其转换为灰度,然后使用函数CV_THRESH_BINARY将其转换为二进制图像。但是,框架中存在孔洞和噪音。去除噪音或孔洞的简单方法是什么?我已经阅读了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;
}

在进行阈值化之前,您可以尝试使用带有
CV\u MEDIAN
的函数。

免责声明:很难给出一个好的答案,因为您提供的信息很少。如果你在二值化之前和之后发布你的图像,这会容易得多。不过,我将尝试给出一些提示

如果孔相当大,则可能阈值错误,尝试增加或减少它,并检查结果。你可以试试

cv::threshold(gray_frame, gray_frame, 0, 255, CV_THRESH_BINARY | CV_THRESH_OTSU);
这将自动计算阈值。 如果找不到好的阈值,那么尝试一些自适应阈值算法,opencv有adaptiveThreshold()函数,但不是很好

如果孔和噪波非常小(每个像素很少),可以尝试以下操作:

  • 使用打开(腐蚀,下一次膨胀)消除白噪声,关闭(膨胀,下一次腐蚀)消除小的黑噪声。但请记住,在去除白噪声的同时,开口也会增强黑噪声,反之亦然

  • 进行阈值化后的中值模糊。它可以去除小的噪声,包括黑色和白色,同时保留颜色(图像仍然是二值的)和可能的小错误,形状。在二值化之前应用中值模糊也有助于减少小噪声


这会达到与侵蚀和扩张功能相同的效果吗?你熟悉这些函数的使用吗?你可以使用打开和关闭(腐蚀+膨胀,反之亦然),显然你需要调整内核大小。我可以使用打开或关闭函数,还是必须同时使用它们?@user1204698,不,这与腐蚀和扩张功能不同-这是另一种降低噪声的方法,可以在阈值设置之前应用。侵蚀和扩张将是一种补充,如果效果最好的话,你没有理由不能将这些方法结合起来。@Markransem非常感谢你的帮助。我尝试了腐蚀和扩张两种方法,得到了更好的结果,所以我可能会坚持这种方法。很抱歉没有提供图像,但非常感谢您的帮助。我使用了CVE函数去除了图像中的一些空洞,但我也会尝试中值模糊。当您提到使用“打开”和“关闭”时,我是否必须同时使用它们,或者使用“CV_MOP_打开”或“CV_MOP_关闭”?您仍然可以提供它们:)您可以使用它们中的一个或两个,一个接一个,这取决于您尝试使用的内容。只需检查结果和实验。我检查了结果,并决定侵蚀和扩张函数都能获得更好的结果,所以我将一个接一个地使用它们。无论如何,我不知道如何提供图像,因为我是stackoverflow的新手:/I非常抱歉。我目前正在从事一个涉及C++和OpenCV的图像处理项目。这是基于运动识别,所以如果我发布更多的问题,如果你能提供一些帮助,我将不胜感激,因为你已经非常有帮助了。谢谢:)你能投票支持我的问题吗?这样我就可以获得超过10的声誉了?我想发布这个问题的图片,但这需要10个以上的代表,这是我目前所在的位置。如果您也能在这个问题上提供一些帮助,那就太好了:)