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值它们有什么不同?
来自Matlab的文档:
'bicubic'双立方插值(默认); 输出像素值是最近的4乘4邻域中的像素的加权平均值
INTER_CUBIC- 在4x4像素邻域上的双三次插值
所以对此的唯一解释是他们使用不同的加权策略来获得平均值.
从Matlab imresize.m源码中,你可以发现内核常量A(参见维基百科上的双立方插值)设置为-0.5,而在OpenCV中设置为-0.75(参见imgproc/src/imgwarp.cpp,函数interpolateCubic( )例如在github上).
这为卷积提供了不同的内核形状:

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