python 图像中的图像

amrnrhlw  于 2022-12-17  发布在  Python
关注(0)|答案(1)|浏览(145)

我试过一个堆栈溢出的代码段。我想在另一个图像中找到一个图像,不管是旋转还是调整大小。

import matplotlib.pyplot as plt
import numpy as np
import cv2
import os
import pathlib



os.chdir(pathlib.Path(__file__).parent.resolve())

image = cv2.imread('picture.png')
template = cv2.imread('penguin.png')

heat_map = cv2.matchTemplate(image, template, cv2.TM_CCOEFF_NORMED)

h, w, _ = template.shape
y, x = np.unravel_index(np.argmax(heat_map), heat_map.shape)
cv2.rectangle(image, (x,y), (x+w, y+h), (0,0,255), 5)

cv2.imshow("pippo",cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
cv2.waitKey(0)

结果并不像预期的那样。
我得到了
pippo
谢谢你的解释。
根据这个片段,我清楚地预料到企鹅在蓝色的盒子里

v1l68za4

v1l68za41#

白色比企鹅更符合模板。
由于图像和模板之间没有亮度和对比度差异,因此我们不必应用归一化相关性。
选择cv2.TM_SQDIFF而不是cv2.TM_CCOEFF_NORMED将为上述情况给予更好的匹配。
heat_map = cv2.matchTemplate(image, template, cv2.TM_CCOEFF_NORMED)替换为:

heat_map = cv2.matchTemplate(image, template, cv2.TM_SQDIFF)

这个方法效果更好的原因是,与其他方法相比,企鹅的黑色部分在平方差中的权重要大得多。
代码示例:

import numpy as np
import cv2

#os.chdir(pathlib.Path(__file__).parent.resolve())

image = cv2.imread('picture.png')
template = cv2.imread('penguin.png')

heat_map = cv2.matchTemplate(image, template, cv2.TM_SQDIFF)

# Show the heat_map for testing:
cv2.imshow("heat_map", cv2.normalize(heat_map, None, 0, 255, cv2.NORM_MINMAX, cv2.CV_8U))

h, w, _ = template.shape
y, x = np.unravel_index(np.argmax(heat_map), heat_map.shape)
cv2.rectangle(image, (x,y), (x+w, y+h), (0,0,255), 5)

cv2.imshow("pippo", image)
cv2.waitKey(0)
cv2.destroyAllWindows()

输入图像:

输入模板:

输出:

cv2.TM_CCOEFF_NORMED的标题图:

cv2.TM_SQDIFF的标题图:

相关问题