Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

why OpenCV cv2.resize gives different answer than MATLAB 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.

like image 212
mxy Avatar asked Feb 24 '14 19:02

mxy


People also ask

What does cv2 resize return?

cv2. resize resizes the image src to the size dsize and returns numpy array.

What is interpolation in cv2 resize?

We also need to keep in mind the interpolation method of our resizing function. The formal definition of interpolation is: A method of constructing new data points within the range of a discrete set of known data points. — Interpolation, Wikipedia. In this case, the “known points” are the pixels of our original image.


1 Answers

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.

like image 82
chappjc Avatar answered Oct 02 '22 01:10

chappjc