在其他图像上匹配轮廓或绘制(png)轮廓

2024-05-19 03:38:06 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我在图像上找到了一个轮廓。在图2中找到此轮廓位置的最佳方法是什么

我看到两个选项:要么我用一条白线绘制轮廓,并在图像2中匹配该图像,要么我以某种方式(这可能吗?)直接在图像2中匹配轮廓

轮廓内的内容是完全随机的,但是图像1中用白色1px线绘制的轮廓将是完全匹配的,假设我可以模板匹配具有透明度的图像

以下是找到、绘制和保存的轮廓的示例图像(图像1)和我需要定位图像1(图像2)的图像。 https://imgur.com/a/MNQ6aNr

不必先绘制并保存轮廓就可以找到轮廓,但我认为匹配绘制的轮廓更直接

谢谢

编辑:

这是我的全部代码。它需要一个完整的图像和一个片段,它将匹配完整的图像。最后导出了一些结果

full_image = cv2.imread('puzzle_1.jpg')    
piece = cv2.imread('piece_1.png', cv2.IMREAD_UNCHANGED)
partial_image = cv2.cvtColor(piece,cv2.COLOR_BGR2GRAY)

contours, hierarchy = cv2.findContours(partial_image.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
   
template = np.zeros((55, 55, 4), dtype=np.uint8)

cv2.drawContours(template, contours, -1, (255, 255, 255, 255),1)
hh, ww = template.shape[:2]

puzzleP = template[:,:,0:3]
alpha = template[:,:,3]
alpha = cv2.merge([alpha,alpha,alpha])

correlation = cv2.matchTemplate(full_image, puzzleP, cv2.TM_CCORR_NORMED, mask=alpha)

threshhold = 0.98
loc = np.where(correlation >= threshhold)

result = full_image.copy()
for pt in zip(*loc[::-1]):
    cv2.rectangle(result, pt, (pt[0]+ww, pt[1]+hh), (0,0,255), 1)
    print(pt)
    
cv2.imwrite('puzzle_piece.png', puzzleP)
cv2.imwrite('full_image_alpha.png', alpha)
cv2.imwrite('full_image_matches.jpg', result)  

这是一个正常工作的结果和一个无效的结果 https://imgur.com/a/ZYyw7tU

如有任何改进建议,将不胜感激


Tags: 图像imagealphaptpiecepngnp绘制

热门问题