gpt4 book ai didi

python - 没有掩码的OpenCV匹配模板?

转载 作者:太空宇宙 更新时间:2023-11-03 23:00:37 25 4
gpt4 key购买 nike

我有两张图片:

左:key.png,右:frame.png

Key.png Frame.png

两张图片的尺寸都是:200x157。

我在申请那个cv2.matchTemplate

的时候遇到了一些问题
cv2.matchTemplate(cv2.imread('frame.png'), cv2.imread('key.png'), cv2.TM_CCOEFF_NORMED)
array([[ 0.86354846]], dtype=float32)

为什么我的结果是 0.863 而不是相似的图像?任何人都可以向我解释此功能的行为并建议如何修复它或其他方式吗?

在 90% 的情况下,它工作正常,但在这里却不行......为什么?

注意:我不能使用特征检测和实际检测,因为我需要找到视觉上非常相似的图像的相似性;

更新:

对于那些认为一切都很好的人:

key.png frame.png

>>> cv2.matchTemplate(cv2.imread('frame.png'), cv2.imread('key.png'), cv2.TM_CCOEFF_NORMED)
array([[ 0.90551066]], dtype=float32)

图像减法:

subtraction

图像差异:

difference

好的,为了我的比较,我需要像 Photoshop 和 GIMP 中那样的图像减法算法来分析不同的点数量。

更新:

我正在尝试在 python 中发布函数 getMSSIM,但结果并不完美:

def calcMssim(i1, i2):
C1 = 6.5025
C2 = 58.5225

d = cv2.CV_32F
I1 = numpy.float32(i1)
I2 = numpy.float32(i2)

I1_2 = cv2.multiply(I1, I1)
I2_2 = cv2.multiply(I2, I2)
I1_I2 = cv2.multiply(I1, I2)

mu1 = cv2.GaussianBlur(I1, (11,11), 1.5)
mu2 = cv2.GaussianBlur(I2, (11,11), 1.5)

mu1_2 = cv2.multiply(mu1, mu1)
mu2_2 = cv2.multiply(mu2, mu2)
mu1_mu2 = cv2.multiply(mu1, mu2)

sigma1_2 = cv2.GaussianBlur(I1_2, (11,11), 1.5)
sigma1_2 = sigma1_2 - mu1_2
sigma2_2 = cv2.GaussianBlur(I2_2, (11,11), 1.5)
sigma2_2 = sigma2_2 - mu2_2
sigma12 = cv2.GaussianBlur(I1_I2, (11,11), 1.5)
sigma12 = sigma12 - mu1_mu2

t1 = 2 * mu1_mu2 + C1
t2 = 2 * sigma12 + C2
t3 = cv2.multiply(t1, t2)

t1 = mu1_2 + mu2_2 + C1
t2 = sigma1_2 + sigma2_2 + C2
t1 = cv2.multiply(t1, t2)

ssim_map = cv2.divide(t3, t1)

return cv2.mean( ssim_map )

结果:

示例 #1

уbz fy7

./mssim.py yBZzJ_e.png Fy7Xu_m.png 
(0.8257484750741396, 0.7267644621469662, 0.7066612513808068, 0.0)

匹配 k ~ 0.74第一张图片第二张更亮。

示例 #2

Key.png Frame.png

./mssim.py key.png frame.png
(0.7317456233025181, 0.7624613566388057, 0.7645396253480031, 0.0)

匹配 k ~ 0.75第一张图片和第二张图片在视觉上确实不同!

PSNR比较:

    def calcPSNR(I1, I2):
s1 = cv2.absdiff(I1, I2)
s1 = numpy.float32(s1)
s1 = cv2.multiply(s1, s1)

s = cv2.sumElems(s1)
sse = s[0] + s[1] + s[2]

if (sse <= 1e-10):
return 0
else:
mse = sse/(len(I1.shape) * I1.shape[0]*I1.shape[1])
psnr = 10*math.log((255*255)/mse, 10)
return psnr

结果是:

示例 1:

   ./psnr.py yBZzJ_e.png Fy7Xu_m.png 
26.4697468901

示例 2:

   ./psnr.py key.png frame.png
15.4679854768

这也不正确,因为: ./psnr.py key.png key.png 0

最佳答案

您查看 PSNR 了吗?这将计算图像每个像素的差异。如需更多信息和 OpenCV 示例,请阅读:http://docs.opencv.org/doc/tutorials/highgui/video-input-psnr-ssim/video-input-psnr-ssim.html#videoinputpsnrmssim

关于python - 没有掩码的OpenCV匹配模板?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19519548/

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