【问题标题】:Removing small contours and noises from a thresholded image in Python在 Python 中从阈值图像中去除小轮廓和噪声
【发布时间】:2019-12-07 21:28:34
【问题描述】:

是否有任何方法或函数可以通过 Python 中的 OpenCV 去除给定已阈值图像的小轮廓?我的目标是只让矩形并很快将这些重叠的分开:

【问题讨论】:

  • 一种方法是在获取和填充轮廓之前在阈值图像上应用形态学打开。请参加游览 (stackoverflow.com/tour) 并阅读帮助中心 (stackoverflow.com/help) 中的信息指南,了解哪些问题适合本论坛以及如何提问并为您的具体问题提供一个最小、完整且可验证的示例。
  • 嗨@fmw42,感谢您的提示。事实上,我已经在这里应用了这个过程(打开 + 腐蚀),但是我只试图保留一些区域(在这种情况下只有矩形)以在原始图像上绘制,不需要的区域仍然继续。我已经尝试找到其他解释它的帖子,但其他帖子在 C++ 或 Matlab 中对我没有帮助。我要求的这种帮助是因为我有一项大学工作要申请它们,而且我非常坚持。不过还是谢谢!

标签: python image-processing image-segmentation opencv-contour


【解决方案1】:

如果您尝试删除的 blob 与您要保留的 blob 相比较小,一种方法是在 blob 周围绘制边界框并使用边界框的区域丢弃不需要的 blob。

    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

在这里,我正在删除面积小于平均面积一半的斑点。您可以通过实验将此值设置为您想要的值。

【讨论】:

  • 在这个答案之前我一直在努力寻找另一种发现方法,今天早上我发现了另一种方法,我正在评估更小或更大的轮廓区域值,而我绘制的值必须适合这种条件,看看你的想法:
【解决方案2】:

我今天早上达到的另一种方法是对您的方法的补充,以解决相同的问题并做出贡献,通过矩形轮廓区域的条件进行评估:

_,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)

我相信必须有其他的并且比我所做的更好,以避免打印我正在寻找的确定的轮廓,以及我正在尝试解决的一些短的轮廓

【讨论】:

    猜你喜欢
    • 2017-06-23
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-22
    相关资源
    最近更新 更多