我想在一张2d地图中找到2d灌木丛的图像。根据他们的网站我用了这个代码
image = cv2.imread('images/Pallet_Town.png', cv2.IMREAD_UNCHANGED)
image_gray = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
template = cv2.imread('images/Bush (small).png', cv2.IMREAD_UNCHANGED)
template_gray = cv2.cvtColor(template, cv2.COLOR_BGR2RGB)
print(image.shape)
w, h, _ = template.shape
result = cv2.matchTemplate(image, template, cv2.TM_CCOEFF_NORMED)
threshold = 0.8
loc = np.where(result >= threshold)
print(*loc[::-1])
for pt in zip(*loc[::-1]):
cv2.rectangle(image, pt, (pt[0] + w, pt[1] + h), (0, 0, 255), 2)
cv2.imwrite('images/result.png', image)代码不工作,也找不到任何灌木丛。结果图像没有矩形。我还应该使用什么函数来找到图像中的灌木(不管是opencv函数还是其他包),或者是我的代码问题。
使用这些图像(布什在地图下面)

布什:

发布于 2022-05-22 07:10:58
实际上,我已经找到了答案,正如fmw42在评论中建议我做一个灌木掩膜,因此使用这段代码我得到了答案。后来,我还不得不将门槛提高到0.9。或者,将阈值降低到0.24也是有效的,但是对于不同的图像,它会有不同的阈值,而我不想要这些阈值
image = cv2.imread('images/Pallet_Town.png', cv2.IMREAD_UNCHANGED)
template = cv2.imread('images/Bush (small).png', cv2.IMREAD_UNCHANGED)
bush = template[:, :, 0:3]
alpha = template[:, :, 3]
alpha = cv2.merge([alpha, alpha, alpha])
result = cv2.matchTemplate(image, bush, cv2.TM_CCORR_NORMED, mask=alpha)
w, h, _ = template.shape
threshold = 0.9
loc = np.where(result >= threshold)
for pt in zip(*loc[::-1]):
cv2.rectangle(image, pt, (pt[0] + w, pt[1] + h), (0, 0, 255), 2)
cv2.imwrite('images/result.png', image)

发布于 2022-05-23 16:54:37
您的模板具有透明的背景。但是您的matchTemplate没有使用透明alpha通道的掩码。因此,你是匹配的背景下的透明度,这很可能不匹配的地区周围灌木丛。在你的模板中,背景是黑色的,你的灌木有一个白色的背景。因此,要么将模板背景更改为白色,要么使用matchTemplate()中alpha通道的掩码。有关使用Python/OpenCV中掩码图像(以下中的最后参数)的文档,请参阅matchTemplate文档:
result = cv.matchTemplate( image, templ, method[, result[, mask]] )因此,以模板图像(灌木)为例:

并提取alpha通道并只保留图像的BGR通道:
mask = template[:,:,3]

template = template[:,:,0:3]

不要转换为灰度。matchTemplate可以处理彩色图像。
https://stackoverflow.com/questions/72335003
复制相似问题