使用opencv的resize时
img = cv2.imread('fname.png', 0 )
res = cv2.resize(img,None,fx=2, fy=2, interpolation = cv2.INTER_CUBIC)
cv2.imwrite('scaled_cv2.png',res)
和matlab的imresize
I = imread('fname.png');
J = imresize(I,2, 'Antialiasing', false, 'Method', 'bicubic');
imwrite(J,'scaled_matlab.png')
并与imagemagick与
进行比较compare -metric PSNR fname.png scaled_cv2.png diff_cv2.png
compare -metric PSNR fname.png scaled_matlab.png diff_matlab.png
我得到完全不同的PSNR值 他们在做什么不同?
答案 0 :(得分:6)
来自Matlab's doc:
'bicubic'
双立方插值(默认);输出像素值是最近的4乘4邻域中像素的加权平均值
来自OpenCV's doc:
INTER_CUBIC
- 4x4像素邻域的双三次插值
所以对此的唯一解释是他们使用不同的加权策略来获得平均值。
从Matlab imresize.m源码,您可以发现内核常量A (请参阅Bicubic interpolation on Wikipedia)设置为 -0.5 ,而它已设置在OpenCV中 -0.75 (参见imgproc / src / imgwarp.cpp,函数interpolateCubic()on github for instance)。
这为卷积提供了不同的内核形状:
因此,最终插值图像的结果会略有不同;通常更多ringing artifacts和OpenCV的超调,但与“真实”的高分辨率图像相比,边缘更清晰,PSNR更好。
答案 1 :(得分:1)
这可能是由于从输出像素到输入像素的不同仿射变换。在'blinear'
反直觉示例上查看this post。此外,在another post中,在Mathematica上验证了插值域([1,n]
vs [0,n]
)的假设,也使用了'bilinear'
方法。所以我猜这是导致Matlab和OpenCV之间存在这种差异的类似原因。