opencv和matlab bicubic算法有什么区别?

时间:2014-02-28 10:40:15

标签: matlab opencv image-processing image-resizing

使用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值 他们在做什么不同?

2 个答案:

答案 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)。

这为卷积提供了不同的内核形状: difference between Matlab (a=-0.5) and OpenCV (a=-0.75) Kernels for bicubic interpolation

因此,最终插值图像的结果会略有不同;通常更多ringing artifacts和OpenCV的超调,但与“真实”的高分辨率图像相比,边缘更清晰,PSNR更好。

答案 1 :(得分:1)

这可能是由于从输出像素到输入像素的不同仿射变换。在'blinear'反直觉示例上查看this post。此外,在another post中,在Mathematica上验证了插值域([1,n] vs [0,n])的假设,也使用了'bilinear'方法。所以我猜这是导致Matlab和OpenCV之间存在这种差异的类似原因。