在Python中从二值化图像中删除小轮廓和噪点

3
在使用Python的OpenCV对图像进行阈值处理后,是否有任何方法或函数可以去除小轮廓?我的目标是只保留矩形,并尽快分离这些重叠的矩形。以下是示例图片:

enter image description here

enter image description here

一种方法是在获取和填充轮廓之前,在阈值图像上应用形态学开操作。请参观(https://stackoverflow.com/tour)并阅读**帮助中心**(https://stackoverflow.com/help)中的信息指南,了解适合此论坛的适当问题以及如何提问,并为您的特定问题提供一个最小、完整且可验证的示例。 - undefined
嗨@fmw42,谢谢你的建议。事实上,我已经在这里应用了这个过程(开启+腐蚀),但只有一些区域我想保留(在这种情况下只有矩形)以便在原始图像上绘制,而不需要的区域仍然存在。我已经尝试过寻找其他解释的帖子,但其他帖子都是用C++或Matlab编写的,对我没有帮助。我请求帮助是因为我有一个大学作业要应用它们,但我卡住了。无论如何,还是谢谢! - undefined
2个回答

2

如果你想要移除的斑点相比你想保留的斑点较小,一种方法是在斑点周围绘制边界框,并使用边界框的面积丢弃不需要的斑点。

    cnts = cv2.findContours(img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    cnts = imutils.grab_contours(cnts)
    cnts = sorted(cnts, key=cv2.contourArea, reverse=True)
    rect_areas = []
    for c in cnts:
        (x, y, w, h) = cv2.boundingRect(c)
        rect_areas.append(w * h)
    avg_area = mean(rect_areas)
    for c in cnts:
        (x, y, w, h) = cv2.boundingRect(c)
        cnt_area = w * h
        if cnt_area < 0.5 * avg_area:
            img[y:y + h, x:x + w] = 0

在这里,我正在删除面积小于平均面积一半的斑点。您可以根据需要进行实验设置此值。


我之前在这里为了另一种方法而苦苦挣扎,今天早上我又找到了另一种方法。我正在评估更小或更大的轮廓面积值,并且那些我绘制的必须符合这个条件,请检查一下你的想法。 - undefined

1

今早我想到了另一种方法来解决同一个问题,并做出了贡献,通过评估矩形轮廓区域的条件:

_,contours, hierarchy = cv2.findContours(closing, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
image_copy = image.copy()
for c in contours:
#Defining a condition to draw the contours, a number larger than/smaller than or between ranges
x = 5000.0
    if cv2.contourArea(c) > x:
        x, y, w, h = cv2.boundingRect(c)
        cv2.drawContours(image_copy, [c], 0, (0,255,0), 17)

我相信一定有其他更好的方法来避免打印出我正在寻找的特定轮廓,也有一些我正在尝试解决的短板。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接