为什么MATLAB imresize函数和OpenCV resize函数的结果不同? 今年4月,我按照MATLAB代码自己写卷积神经网络c的实现时,发现了这个问题,但是那个时候问题不大,所以没怎么关注。 今天,我在堆栈概述中正好看到了相关的问题。 whyopencvcv2. resizegivesdifferentanswerthanmatlabimresize? 解开了我心中的疑惑。 本文的主要内容是评论此堆栈溢出问题,并将一些代码从Python翻译为c。
首先,当它变大时,可以看到MATLAB和OpenCV的结果相同:
x=im resize ([ 1,2; 3,4 ]、[ 4,4 ]、' bilinear ' )
% x=
% 1.0000 1.2500 1.7500 2.0000
% 1.5000 1.7500 2.2500 2.5000
% 2.5000 2.7500 3.2500 3.5000
% 3.0000 3.2500 3.7500 4.0000
doubledata [ ]={ 1,2,3,4 };
cv :3360 mata (2,2,CV_64FC1,data );
std:cout
cv:3360resize(a,a,cv:3360size ) 4,4 ),cv:INTER_LINEAR );
std:cout
//[ 1,1.25,1.75,2;
//1.5、1.75、2.25、2.5;
//2.5、2.75、3.25、3.5;
//3,3.25,3.75,4 ]
但是,缩小矩阵时,结果不同:
imresize(x,[ 2,2 ],' bilinear ' ) )。
% ans=
% 1.5625 2.1875
% 2.8125 3.4375
cv:3360resize(a,a,cv:3360size ) 2,2 ),cv:INTER_LINEAR );
std:cout
//[ 1.375,2.125;
//2.875,3.625 ]
为什么会这样呢? 原因是,MATLAB的imresize函数默认情况下启用并禁用anti-aliasing,结果与c相同:
imresize(x,[ 2,2 ],' bilinear ',' AntiAliasing ',false ) )。
% ans=
% 1.3750 2.1250
% 2.8750 3.6250
那么,如何使OpenCV实现矩阵im resize函数的anti-aliasing功能呢? 这个问题留待日后解决。 本文中的特定代码显示了opencv-and-CPP-for-MATLAB-users demo _ opencv functions文件夹下的demo_resize.cpp函数。 为了方便,代码如下所示。
#包含
#包含
void demo_resize (
{
doubledata [ ]={ 1,2,3,4 };
cv :3360 mata (2,2,CV_64FC1,data );
std:cout
cv:3360resize(a,a,cv:3360size ) 4,4 ),cv:INTER_LINEAR );
std:cout
cv:3360resize(a,a,cv:3360size ) 2,2 ),cv:INTER_LINEAR );
std:cout
}
请注明出处。