为什么OpenCV中的cv2.resize与MATLAB中的imresize结果不同?

14

我正在将MATLAB代码转换为Python,并尝试使用OpenCV函数cv2.resize缩小图像,但是得到的结果与MATLAB输出不同。

为了确保在调整大小之前我的代码没有出错,我在这两个函数上使用了一个小例子并比较了输出结果。

我首先在Python和MATLAB中创建了以下数组并进行了上采样:

Python - NumPy和OpenCV

    x = cv2.resize(np.array([[1.,2],[3,4]]),(4,4), interpolation=cv2.INTER_LINEAR)
    print x

    [[ 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.  ]]

MATLAB

    x = imresize([1,2;3,4],[4,4],'bilinear')

    ans =

    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

然后我将答案缩放回原始的2x2大小。

Python:

    cv2.resize(x,(2,2), interpolation=cv2.INTER_LINEAR)

    ans = 

     [[ 1.375,  2.125],
      [ 2.875,  3.625]]

MATLAB:

    imresize(x,[2,2],'bilinear')

    ans =

      1.5625    2.1875
      2.8125    3.4375

它们显然不同,当数字更大时,答案之间的差异也会更大。

任何解释或资源都将不胜感激。

1个回答

15

MATLAB的imresize默认启用了反锯齿功能:

>> imresize(x,[2,2],'bilinear')
ans =
    1.5625    2.1875
    2.8125    3.4375
>> imresize(x,[2,2],'bilinear','AntiAliasing',false)
ans =
    1.3750    2.1250
    2.8750    3.6250

过去我曾因尝试仅使用interp2复制imresize的结果而遇到了困难。


1
+1 谢谢!这正是我在寻找的东西。 我已经使用这个函数很多年了,从来没有考虑过关闭抗锯齿功能。 你知道在Python中是否有一种方法可以进行降采样,并且具有抗锯齿功能,而不是自己实现吗? - mxy
1
@mxy 很抱歉,这样不行。或许你可以先使用高斯滤波器或其他低通滤波器进行卷积,然后再进行调整大小/重采样。 - chappjc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接