OpenCV:如何删除不需要的斑点,或者如何将需要的部分复制到空图像中?

OpenCV:如何删除不需要的斑点,或者如何将需要的部分复制到空图像中?,opencv,image-processing,computer-vision,threshold,opencv-contour,Opencv,Image Processing,Computer Vision,Threshold,Opencv Contour,从下图中,如何找到结果图像 这里显示的图像是阈值图像。我尝试过使用形态学操作符,但它们甚至可以去除我想要的斑点。我怎样才能解决这个问题? 有什么提示吗 以下是我感兴趣获取/查找的结果图像: 检测所有斑点,然后按大小、位置或任何您想要的方式对其进行排序和过滤 如果您希望有人用勺子喂您OpenCV手册的内容,可以使用各种教程 有许多方法可以删除blob并将其复制到其他图像中 删除blob的一种简单方法是将其边界框设置为零 二进制图像也是逻辑操作的理想选择 检测所有斑点,然后根据大小、位置或您

从下图中,如何找到结果图像

这里显示的图像是阈值图像。我尝试过使用形态学操作符,但它们甚至可以去除我想要的斑点。我怎样才能解决这个问题? 有什么提示吗

以下是我感兴趣获取/查找的结果图像:


检测所有斑点,然后按大小、位置或任何您想要的方式对其进行排序和过滤

如果您希望有人用勺子喂您OpenCV手册的内容,可以使用各种教程

有许多方法可以删除blob并将其复制到其他图像中

删除blob的一种简单方法是将其边界框设置为零

二进制图像也是逻辑操作的理想选择


检测所有斑点,然后根据大小、位置或您想要的任何东西对它们进行排序和过滤

如果您希望有人用勺子喂您OpenCV手册的内容,可以使用各种教程

有许多方法可以删除blob并将其复制到其他图像中

删除blob的一种简单方法是将其边界框设置为零

二进制图像也是逻辑操作的理想选择


你已经完成了大部分工作,现在你需要做的就是找到斑点,添加一些轮廓,然后找到最大的一个。容易的!下面是C++中的代码,我将留给您解决如何将其转换为Python:

cv::Mat mat = imread("g0cVU.png");
    Mat origImage = mat;
    Mat canny_output = mat;
    vector<vector<Point> > contours;
    vector<Vec4i> hierarchy;
    cv::Mat greyMat, colorMat;
    cv::cvtColor(mat, greyMat, CV_BGR2GRAY);
    int thresh = 100;
    RNG rng(12345);
    ///// Detect edges using canny
    Canny(greyMat, canny_output, thresh, thresh * 2, 3);
    /// Find contours
    findContours(canny_output, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0));
    int largest_area = 0;
    int largest_contour_index = 0;
    Rect bounding_rect;
    /// Draw contours
    Mat drawing = Mat::zeros(canny_output.size(), CV_8UC3);
    for (int i = 0; i< contours.size(); i++)
    {
        Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255));
        drawContours(drawing, contours, i, color, 2, 8, hierarchy, 0, Point());
        double a=contourArea( contours[i],false);  //  Find the area of contour
       if(a>largest_area){
       largest_area=a;
       largest_contour_index=i;                //Store the index of largest contour
       bounding_rect=boundingRect(contours[i]); // Find the bounding rectangle for biggest contour
       }
    }
    rectangle(origImage, bounding_rect, Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255)),2);
    /// Show in a window
    namedWindow("Contours", CV_WINDOW_AUTOSIZE);
    imshow("Contours", drawing);

    cv::namedWindow("img");
    cv::imshow("mat", mat);
    cv::imshow("mat", origImage);
    cv::imshow("mat123", drawing);
    cv::waitKey(0);
cv::Mat Mat=imread(“g0cVU.png”);
Mat origImage=Mat;
Mat canny_输出=Mat;
矢量等值线;
向量层次;
cv::Mat greyMat,colorMat;
cv::CVT颜色(mat、灰色、cv_bgr2灰色);
int thresh=100;
RNG RNG(12345);
/////使用canny算法检测边缘
Canny(greyMat,Canny_输出,thresh,thresh*2,3);
///寻找轮廓
findContours(canny_输出、轮廓、层次、CV_RETR_树、CV_链近似_简单、点(0,0));
int最大面积=0;
int最大轮廓指数=0;
矩形边界;
///画轮廓
Mat drawing=Mat::zeros(canny_output.size(),CV_8UC3);
对于(int i=0;i最大面积){
最大面积=a;
最大轮廓指数=i;//存储最大轮廓指数
bounding_rect=boundingRect(轮廓[i]);//查找最大轮廓的边界矩形
}
}
矩形(原点、边界、标量(rng.uniform(0255)、rng.uniform(0255)、rng.uniform(0255)),2);
///陈列
namedWindow(“轮廓”,CV\u窗口\u自动调整大小);
imshow(“轮廓”,图纸);
简历:namedWindow(“img”);
cv::imshow(“mat”,mat);
cv::imshow(“mat”,原始图像);
cv::imshow(“mat123”,图纸);
cv::waitKey(0);
结果如下:

您可以在下图中看到,最大的contor周围绘制了一个棕色矩形


o很明显,一旦你有了最大的斑点(或任何你认为“正确的斑点”),你就可以把其他所有东西都设置为黑色,这是相当简单的。

你已经完成了大部分工作,你现在需要做的就是找到斑点,添加一些轮廓,然后找到最大的一个。容易的!下面是C++中的代码,我将留给您解决如何将其转换为Python:

cv::Mat mat = imread("g0cVU.png");
    Mat origImage = mat;
    Mat canny_output = mat;
    vector<vector<Point> > contours;
    vector<Vec4i> hierarchy;
    cv::Mat greyMat, colorMat;
    cv::cvtColor(mat, greyMat, CV_BGR2GRAY);
    int thresh = 100;
    RNG rng(12345);
    ///// Detect edges using canny
    Canny(greyMat, canny_output, thresh, thresh * 2, 3);
    /// Find contours
    findContours(canny_output, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0));
    int largest_area = 0;
    int largest_contour_index = 0;
    Rect bounding_rect;
    /// Draw contours
    Mat drawing = Mat::zeros(canny_output.size(), CV_8UC3);
    for (int i = 0; i< contours.size(); i++)
    {
        Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255));
        drawContours(drawing, contours, i, color, 2, 8, hierarchy, 0, Point());
        double a=contourArea( contours[i],false);  //  Find the area of contour
       if(a>largest_area){
       largest_area=a;
       largest_contour_index=i;                //Store the index of largest contour
       bounding_rect=boundingRect(contours[i]); // Find the bounding rectangle for biggest contour
       }
    }
    rectangle(origImage, bounding_rect, Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255)),2);
    /// Show in a window
    namedWindow("Contours", CV_WINDOW_AUTOSIZE);
    imshow("Contours", drawing);

    cv::namedWindow("img");
    cv::imshow("mat", mat);
    cv::imshow("mat", origImage);
    cv::imshow("mat123", drawing);
    cv::waitKey(0);
cv::Mat Mat=imread(“g0cVU.png”);
Mat origImage=Mat;
Mat canny_输出=Mat;
矢量等值线;
向量层次;
cv::Mat greyMat,colorMat;
cv::CVT颜色(mat、灰色、cv_bgr2灰色);
int thresh=100;
RNG RNG(12345);
/////使用canny算法检测边缘
Canny(greyMat,Canny_输出,thresh,thresh*2,3);
///寻找轮廓
findContours(canny_输出、轮廓、层次、CV_RETR_树、CV_链近似_简单、点(0,0));
int最大面积=0;
int最大轮廓指数=0;
矩形边界;
///画轮廓
Mat drawing=Mat::zeros(canny_output.size(),CV_8UC3);
对于(int i=0;i最大面积){
最大面积=a;
最大轮廓指数=i;//存储最大轮廓指数
bounding_rect=boundingRect(轮廓[i]);//查找最大轮廓的边界矩形
}
}
矩形(原点、边界、标量(rng.uniform(0255)、rng.uniform(0255)、rng.uniform(0255)),2);
///陈列
namedWindow(“轮廓”,CV\u窗口\u自动调整大小);
imshow(“轮廓”,图纸);
简历:namedWindow(“img”);
cv::imshow(“mat”,mat);
cv::imshow(“mat”,原始图像);
cv::imshow(“mat123”,图纸);
cv::waitKey(0);
结果如下:

您可以在下图中看到,最大的contor周围绘制了一个棕色矩形


o显然,一旦你有了最大的斑点(或任何你认为“正确的斑点”),你就可以将其他所有斑点设置为黑色,这是相当简单的。

这两个斑点之间的区别是什么,你是根据这两个斑点删除一个和保留另一个的?嗯,我还没有。我不知道该设定什么样的标准。但我总是对比另一个稍大/稍长的斑点感兴趣。而且在另一个之上!可以通过比较每个blob的质心来比较相对位置,也可以通过提取其轮廓和获取边界框来比较每个blob的相对大小。然而,如果你