为什么OpenCV cv2.resize提供的答案不同于MATLAB imresize? [英] why OpenCV cv2.resize gives different answer than MATLAB imresize?

查看:1082
本文介绍了为什么OpenCV cv2.resize提供的答案不同于MATLAB imresize?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在将MATLAB代码传输到python并尝试使用OpenCV函数 cv2.resize 缩小图像,但是我得到了与MATLAB输出不同的结果。 / p>

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



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



Python - NumPy和OpenCV



  x = cv2.resize(np.array([[1,2],[3,4]]),(4,4),interpolation = cv2.INTER_LINEAR)
打印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.500 0
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

它们显然不一样,当数字越大时,答案就越不同了。



任何解释或资源都将受到赞赏。

解决方案

MATLAB的< a href =http://www.mathworks.com/help/images/ref/imresize.html =nofollow noreferrer> 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 的结果。


I'm transferring a MATLAB code into python and trying to downscale an image using OpenCV function cv2.resize, But I get a different results from what MATLAB outputs.

To make sure that my code is not doing anything wrong before the resize, I used a small example on both functions and compared the output.

I first created the following array in both Python and MATLAB and upsampled it:

Python - NumPy and 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

Then I took the answers and resized them back to the original 2x2 size.

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

They are clearly not the same, and when numbers are larger, the answers are a lot more different.

Any explanation or resources would be appreciated.

解决方案

MATLAB's imresize has anti-aliasing enabled by default:

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

This has tripped me up in the past, while trying to reproduce the results of imresize using just interp2.

这篇关于为什么OpenCV cv2.resize提供的答案不同于MATLAB imresize?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆