Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Resize an image without distortion 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.

like image 201
Tanmay Bhatnagar Avatar asked Jun 20 '17 10:06

Tanmay Bhatnagar


People also ask

How do I resize an image while maintaining its aspect ratio OpenCV?

To resize an image in Python, you can use cv2. resize() function of OpenCV library cv2. Resizing, by default, does only change the width and height of the image. The aspect ratio can be preserved or not, based on the requirement.


1 Answers

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.

like image 159
thewaywewere Avatar answered Sep 17 '22 15:09

thewaywewere