轮廓区域查找

时间:2019-03-16 10:12:05

标签: python opencv image-processing

我正在开发一种缺陷分析系统,可以在缺陷水果的区域中找到它。我正处于其发展的初期。我正在使用opencv和python。

我使用以下代码查找轮廓:

im = cv2.imread('Mango_49_A.jpg')
imgray = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(imgray, 127, 255, 0)
im2, contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

cv2.drawContours(im, contours, -1, (0,255,0), 3)

要查找区域,我使用以下代码:

if len(contours) != 0:
    for (i, c) in enumerate(contours):
        area = cv2.contourArea(c)
        if area < area_of_the_mango1:
            print(area)
            area_of_the_defected_region1 += area
            cv2.drawContours(img, c, -1, (255,255,0), 12)

结果: enter image description here

我只想在芒果内部计算轮廓。我得到的结果计算出以下轮廓区域: 1.完整的图像边界 2.芒果 3.芒果中的缺陷

由于计算了上述三个区域的面积,因此缺陷区域的面积大于芒果的面积。

帮我计算一下芒果内部的轮廓区域。

1 个答案:

答案 0 :(得分:0)

您将外部边框和一些微小的轮廓作为背景的一部分的事实表明,阈值并不是理想的将前景与背景分开的事实。

对于此行:

ret, thresh = cv2.threshold(imgray, 127, 255, 0)

使用值127进行播放,因此您不再看到前景对象的外边缘和背景之间的轮廓

此外,您可以使用morphological filters(例如腐蚀)稍微清理阈值

当前如何检索轮廓的主要问题是:cv2.RETR_TREE。 根据{{​​3}},您只能获取要获取的外部轮廓:

im2, contours, hierarchy = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

下一步,您可以查看已经使用的contourArea之类的findContours documentation,还包括轮廓逼近和凸包。