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:
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. ]]
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.
cv2.resize(x,(2,2), interpolation=cv2.INTER_LINEAR)
ans =
[[ 1.375, 2.125],
[ 2.875, 3.625]]
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.
cv2. resize resizes the image src to the size dsize and returns numpy array.
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.
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
.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With