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

问题描述

使用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

猜你喜欢

转载自blog.csdn.net/zency/article/details/128582656