python图片压缩不失真,调整图像大小而不失真OpenCV

I am using python 3 and latest version of openCV. I am trying to resize an image using the resize function provided but after resizing the image is very distorted. Code :

import cv2

file = "/home/tanmay/Desktop/test_image.png"

img = cv2.imread(file , 0)

print(img.shape)

cv2.imshow('img' , img)

k = cv2.waitKey(0)

if k == 27:

cv2.destroyWindow('img')

resize_img = cv2.resize(img , (28 , 28))

cv2.imshow('img' , resize_img)

x = cv2.waitKey(0)

if x == 27:

cv2.destroyWindow('img')

The original image is 480 x 640 (RGB therefore i passed the 0 to get it to grayscale)

Is there any way i could resize it and avoid the distortion using OpenCV or any other library perhaps? I intend to make a handwritten digit recogniser and i have trained my neural network using the MNIST data therefore i need the image to be 28x28.

解决方案

You may try below. The function will keep the aspect rate of the original image.

def image_resize(image, width = None, height = None, inter = cv2.INTER_AREA):

# initialize the dimensions of the image to be resized and

# grab the image size

dim = None

(h, w) = image.shape[:2]

# if both the width and height are None, then return the

# original image

if width is None and height is None:

return image

# check to see if the width is None

if width is None:

# calculate the ratio of the height and construct the

# dimensions

r = height / float(h)

dim = (int(w * r), height)

# otherwise, the height is None

else:

# calculate the ratio of the width and construct the

# dimensions

r = width / float(w)

dim = (width, int(h * r))

# resize the image

resized = cv2.resize(image, dim, interpolation = inter)

# return the resized image

return resized

Here is an example usage.

image = image_resize(image, height = 800)

Hope this helps.