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

dod*_*dol 5 matlab opencv image-processing image-resizing

使用opencv时调整大小

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)
Run Code Online (Sandbox Code Playgroud)

和matlab的imresize

I = imread('fname.png');
J = imresize(I,2, 'Antialiasing', false, 'Method', 'bicubic');
imwrite(J,'scaled_matlab.png')
Run Code Online (Sandbox Code Playgroud)

并与imagemagick的比较

compare -metric PSNR fname.png scaled_cv2.png diff_cv2.png
compare -metric PSNR fname.png scaled_matlab.png diff_matlab.png
Run Code Online (Sandbox Code Playgroud)

我得到完全不同的PSNR值它们有什么不同?

her*_*tao 7

来自Matlab的文档:

'bicubic'

双立方插值(默认); 输出像素值是最近的4乘4邻域中的像素的加权平均值

OpenCV的doc:

INTER_CUBIC - 在4x4像素邻域上的双三次插值

所以对此的唯一解释是他们使用不同的加权策略来获得平均值.

从Matlab imresize.m源码中,你可以发现内核常量A(参见维基百科上的双立方插值)设置为-0.5,而在OpenCV中设置为-0.75(参见imgproc/src/imgwarp.cpp,函数interpolateCubic( )例如在github上).

这为卷积提供了不同的内核形状: Matlab(a = -0.5)和OpenCV(a = -0.75)之间的差异用于双三次插值

因此,最终插值图像的结果会略有不同; 与"真正的"底层高分辨率图像相比,OpenCV 通常会产生更多的振铃伪影和过冲,但边缘更清晰,PSNR更好.