如何检测图像中的不规则形状并为其内部增加价值?

时间:2019-07-16 16:22:22

标签: python opencv image-processing computer-vision contour

有两张图像,一幅是带有值的原始图像,另一幅称为形状图像,具有不规则形状。我想检测形状,并为形状img对应的值img添加不同的值。形状不会相交。 我一直在浏览多个库,包括开放的cv2,但发现很难实现此目标。有人可以帮忙吗?谢谢。

可能的形状图像

possible shape image

我希望从外到内加+ 1 / -1

I wish to add +1/-1 alternatively from outside to inside

1 个答案:

答案 0 :(得分:2)

要检测形状,可以使用cv2.findContours()cv2.RETR_TREE标志。要确定内部轮廓,我们可以使用层次结构为每个内部层进行过滤。这是有关contour hierarchy的很好的教程。本质上,我们遍历每个图层并交替标记每个轮廓(-11)。要添加标签,可以使用cv2.putText()。您可能必须根据所使用的图像来更改标签的偏移量。

这是结果


import cv2

image = cv2.imread('1.png')

gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray,120, 255,cv2.THRESH_BINARY_INV)[1]
cnts, h = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

label = '1'
count = 0

# Get inner list of hierarchy
for layer in zip(cnts, h[0]):
    contour = layer[0]
    hierarchy = layer[1]

    # If we find new contour (not inner) reset label
    if hierarchy[1] >= 0:
        label = '1'
    # Ensure that we only have outer contour
    if count % 2 == 0:
        cv2.drawContours(image, [contour], -1, (36, 255, 12), 2)
        x,y,w,h = cv2.boundingRect(contour)
        cv2.putText(image, label, (x +50,y+ 70), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (36,255,12), 3)
        label = str(int(label) * -1)

    count += 1

cv2.imshow('thresh', thresh)
cv2.imshow('image', image)
cv2.waitKey()