问题描述
使用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)
和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值,他们有什么不同?
问题分析
- Matlab文档中的bicubic的描述
‘bicubic’
Bicubic interpolation (the default); the output pixel value is a weighted average of pixels in the nearest 4-by-4 neighborhood
- OpenCV文档中的bicubic的描述
INTER_CUBIC - a bicubic interpolation over 4x4 pixel neighborhood
问题解决
- 唯一的解释是他们使用不同的加权策略来获得平均值。从Matlab的imresize.m源文件中,你可以发现内核常数A(见维基百科上的二立方插值)被设置为-0.5,而在OpenCV中被设置为-0.75(例如见imgproc/src/imgwarp.cpp,github上的函数interpolateCubic())。
- 这为卷积提供了不同的内核形状。因此,在最终的插值图像中,你会得到稍微不同的结果;对于OpenCV来说,通常会有更多的振铃假象和过冲,但与 "真实 "的高分辨率图像相比,也有更清晰的边缘和更好的PSNR。
转载自:https://www.it1352.com/901480.html