gpt4 book ai didi

python - 如何使用Python查找图片中的几个关键像素点?

转载 作者:行者123 更新时间:2023-12-02 17:35:51 25 4
gpt4 key购买 nike

我知道通过Opencv-python的matchtemplate函数可以匹配图片1中的图片2。

import cv2


template = cv2.imread("1.bmp")
template = cv2.cvtColor(template, cv2.COLOR_BGR2GRAY)
template = cv2.Canny(template, 50, 200)


edged = cv2.imread("2.bmp")
edged = cv2.cvtColor(edged, cv2.COLOR_BGR2GRAY)
edged = cv2.Canny(edged, 50, 200)


result = cv2.matchTemplate(edged, template, cv2.TM_CCOEFF_NORMED)
(_, maxVal, _, maxLoc) = cv2.minMaxLoc(result)

但是,如果我只有像图片3这样的像素,该如何与图片1相匹配?

图片3:提取图片2中的某些像素,其余像素用红色填充。

我没有找到opencv-python或PIL解决方案。我认为可以通过遍历像素来解决,但这不能保证性能。那有更好的方法吗?

最佳答案

根据Neeraj Komuravalli对this question的回答,matchTemplate支持mask参数,以将模板中的某些像素排除在匹配项之外(docs)。

要基于红色像素生成蒙版,一个简单的解决方案是使用 bool(boolean) 表达式选择蓝色和绿色为0但红色为255的像素:

mask = (template[:,:,0]==0) & (template[:,:,1]==0) & (template[:,:,2]==255)
mask = ~mask
mask = mask.astype(np.uint8)

请注意,必须转换为 uint8,因为掩码必须与模板具有相同的数据类型。

编辑: ~mask反转掩码( 0变成 1,反之亦然),这是必要的,因为 0指示要掩盖的像素,至少在使用 cv2.TM_CCORR_NORMED方法时。

尽管这从原则上解决了您的问题,但在这种情况下不会产生有效的解决方案。

这是因为将Canny边缘滤镜应用于图像。由于在应用Canny时无法掩盖模板中的红色像素,因此红色像素区域的边界将影响边缘检测的结果,从而将模板更改为与原始外观完全不同。

因此,在此示例中,匹配失败,返回的位置完全错误。

删除Canny步骤可以解决此问题...但是,这也会使该方法的健壮性/准确性有所降低。在这种情况下,匹配实际上似乎比100%正确匹配少了几个像素。不幸的是,我想不出任何改进方法。

这是对我有用的完整代码(前面提到的关于精度的警告):
import cv2
import numpy as np

template = cv2.imread("masked_template.png")

mask = (template[:,:,0]==0) & (template[:,:,1]==0) & (template[:,:,2]==255)
mask = mask.astype(np.uint8)

template = cv2.cvtColor(template, cv2.COLOR_BGR2GRAY)
#template = cv2.Canny(template, 50, 200)

edged = cv2.imread("edged.png")
edged = cv2.cvtColor(edged, cv2.COLOR_BGR2GRAY)
#edged = cv2.Canny(edged, 50, 200)

result = cv2.matchTemplate(edged, template, cv2.TM_CCORR_NORMED, mask=mask)
(_, maxVal, _, maxLoc) = cv2.minMaxLoc(result)

关于python - 如何使用Python查找图片中的几个关键像素点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51087390/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com