Python OpenCV boundingRect输出

Python OpenCV boundingRect输出,python,opencv,Python,Opencv,我不熟悉OpenCV和Python,我制作了一个程序,可以找到面积大于500的轮廓,并将它们保存到一个新图像中。我在互联网上建议使用boundingRect,它运行良好,但我在图像输出方面遇到了一个问题。似乎感兴趣区域附近的噪音也被保存了下来。如下图所示,在ROI旁边有一些微小的形状。输出对其他图像很好,只是我想消除像这样的噪音。有没有办法消除输出中的此类噪音 以下是我制作的程序的输出: 以下是输入图像: 根据输入数据的假设,可能有几种解决方案 可能的方法 如果ROI的颜色与其他颜色明显不同

我不熟悉OpenCV和Python,我制作了一个程序,可以找到面积大于500的轮廓,并将它们保存到一个新图像中。我在互联网上建议使用boundingRect,它运行良好,但我在图像输出方面遇到了一个问题。似乎感兴趣区域附近的噪音也被保存了下来。如下图所示,在ROI旁边有一些微小的形状。输出对其他图像很好,只是我想消除像这样的噪音。有没有办法消除输出中的此类噪音

以下是我制作的程序的输出:

以下是输入图像:


根据输入数据的假设,可能有几种解决方案

可能的方法

  • 如果ROI的颜色与其他颜色明显不同

    1-1。在找到轮廓之前,可以使用RGB设置输入图像的阈值

  • 如果要查找的对象的面积比其他对象大得多

    2-1。把洞填好

    2-2。计算BLOB的大小,并排除除最大BLOB外的所有BLOB()

  • 如果多个物体的轮廓之间有交点,方法2肯定无法分割单个细胞的区域。

    用轮廓隐藏 此解决方案使用
    cv2.drawContours()
    简单地在噪声上绘制黑色轮廓。我对黑白样本图像进行了几次迭代放大,按面积过滤轮廓,然后在噪声上绘制黑色轮廓线。我使用了阈值功能,因为在最初看似简单的黑白图像中发现了一些微小的噪声

    输入:

    代码:
    导入cv2
    阈值_值=10
    img=cv2.imread(“cells_BW.jpg”)
    img=cv2.medianBlur(img,5)
    扩张=cv2。扩张(img,(3,3),迭代次数=3)
    img_gray=cv2.CVT颜色(img,cv2.COLOR_BGR2GRAY)
    (T,thresh)=cv2.阈值(img_灰度,thresh_值,255,cv2.thresh_二进制)
    _,等高线,层次=cv2.findContours(阈值,cv2.RETR\u树,cv2.CHAIN\u近似值\u简单)
    轮廓=[如果cv2.contourArea(i)<5000,则轮廓中的i表示i]
    cv2.绘制等高线(img,等高线,-1,(0,0,0),10,线型=8)
    imwrite(“cells\u BW\u CLEAN.jpg”,img)
    
    输出:

    你能发布你的输入图像吗?哦,是的,我当然会编辑帖子。你只想从黑白图像中删除小轮廓?是的,如果可能的话。如果你正确设置阈值,然后进行侵蚀,你就不必担心这些不需要的小斑点。
    import cv2
    
    thresh_value = 10
    img = cv2.imread("cells_BW.jpg")
    img = cv2.medianBlur(img, 5)
    dilation = cv2.dilate(img,(3,3),iterations = 3)
    img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    (T, thresh) = cv2.threshold(img_gray, thresh_value, 255, cv2.THRESH_BINARY)
    _, contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
    contours = [i for i in contours if cv2.contourArea(i) < 5000]
    cv2.drawContours(img, contours, -1, (0,0,0), 10, lineType=8)
    
    cv2.imwrite("cells_BW_CLEAN.jpg", img)