有两张图像,一幅是带有值的原始图像,另一幅称为形状图像,具有不规则形状。我想检测形状,并为形状img对应的值img添加不同的值。形状不会相交。 我一直在浏览多个库,包括开放的cv2,但发现很难实现此目标。有人可以帮忙吗?谢谢。
可能的形状图像
我希望从外到内加+ 1 / -1
答案 0 :(得分:2)
要检测形状,可以使用cv2.findContours()
和cv2.RETR_TREE
标志。要确定内部轮廓,我们可以使用层次结构为每个内部层进行过滤。这是有关contour hierarchy的很好的教程。本质上,我们遍历每个图层并交替标记每个轮廓(-1
或1
)。要添加标签,可以使用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()