OpenCV C++ 如何编写一个与 Matlab 的 bwareaopen 函数相同的函数?

OpenCV C++ How to write a function which does the same Matlab's bwareaopen function?

本文关键字:函数 bwareaopen Matlab 一个 何编写 C++ OpenCV      更新时间:2023-10-16

我正在尝试将bwareaopen函数转换为OpenCV c++…我发现这个代码,但它不能正常工作。

所以如果有人已经解决了这个问题,可以帮助我,我将非常高兴。

void removeSmallBlobs(cv::Mat& im, double size)
{
    // Only accept CV_8UC1
    if (im.channels() != 1 || im.type() != CV_8U)
        return;
    // Find all contours
    std::vector<std::vector<cv::Point> > contours;
    cv::findContours(im.clone(), contours, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE);
    for (int i = 0; i < contours.size(); i++)
    {
        // Calculate contour area
        double area = cv::contourArea(contours[i]);
        // Remove small objects by drawing the contour with black color
        if (area > 0 && area <= size)
            cv::drawContours(im, contours, i, CV_RGB(0, 0, 0), -1);
    }
}

我认为你需要开形态手术。下面是一个示例:

或者看看这里:如何从OpenCV图像中过滤小段?

我使用cvBlobsLib在opencv中实现这样的功能。您应该首先编译cvBlobsLib并将其包含到您的项目中。库链接在这里:cvBlobsLib

因为matlab canny函数默认是高斯模糊的,但opencv没有,所以你应该先对图像进行高斯模糊以减少噪声。然后检测狡猾的边缘,然后删除短于或长于给定像素长度的边缘。

这是我的代码。

#include <highgui/highgui.hpp>
#include <imgproc/imgproc.hpp>
#include "BlobResult.h"
using namespace std;
using namespace cv;
void bwareaopen( Mat& img, int size);
 int main()
 {
     Mat img;
     img = imread("1.jpg");
     Mat gray;
     cvtColor(img,gray,CV_BGR2GRAY);

     GaussianBlur( gray, gray, Size(7, 7), 2, 2);
     Mat edges;
     Canny(gray,edges,50,500,5,true);
     imshow("raw edge",edges);
     bwareaopen( edges, 800);
     imshow("edge",edges);
     waitKey(0);

 }
 void bwareaopen( Mat& img, int size)
 {
     CBlobResult blobs;
     blobs = CBlobResult( img ,Mat(),4);
     blobs.Filter( blobs, B_INCLUDE, CBlobGetLength(), B_GREATER, size );
     Mat newimg(img.size(),img.type());
     newimg.setTo(0);
     for(int i=0;i<blobs.GetNumBlobs();i++)
     {
         blobs.GetBlob(i)->FillBlob(newimg,CV_RGB(255,255,255),0,0,true);
     }
     img = newimg;
 }

我也遇到了同样的问题。我改变了

if (area > 0 && area <= size) to

if (area <= size)

这是在我发现许多小斑点的面积为0之后。