Mahi
Mahi

Reputation: 107

Cutting and resizing a numpy array to a new shape based on ROI

I have a numpy array and I need to cut a partition of it based on an ROI like (x1,y1)(x2,y2). The background color of the numpy array is zero.

I need to crop that part from the first numpy array and then resize the cropped array to (640,480) pixel.

I am new to numpy and I don't have any clue how to do this.

#numpy1: the first numpy array
roi=[(1,2),(3,4)]

Upvotes: 0

Views: 1495

Answers (3)

Jiadong
Jiadong

Reputation: 2082

I recommend using slicing and skimage. skimage.transform.resize is what you need.

import matplotlib.pyplot as plt
from skimage import data
from skimage.transform import resize
image = data.camera()

crop = image[10:100, 10:100]

crop = resize(crop, (640, 480))
plt.imshow(crop)

More about slicing, pls see here. Details on skimage, see here

Upvotes: 0

Nils Werner
Nils Werner

Reputation: 36815

You can crop an array like

array = array[start_x:stop_x, start_y:stop_y]

or in your case

array = array[roi[0][0]:roi[0][1], roi[1][0]:roi[1][1]]

or one of

array = array[slice(*roi[0]), slice(*roi[1])]
array = array[tuple(slice(*r) for r in roi)]

depending on the amount of abstraction and over-engineering that you need.

Upvotes: 0

HansHirse
HansHirse

Reputation: 18925

It kind of sounds like you want to do some image processing. Therefore, I suggest you to have a look at the OpenCV library. In their Python implementation, images are basically NumPy arrays. So, cropping and resizing become quite easy:

import cv2
import numpy as np

# OpenCV images are NumPy arrays
img = cv2.imread('path/to/your/image.png')        # Just use your NumPy array 
                                                  # instead of loading some image

# Set up ROI [(x1, y1), (x2, y2)]
roi = [(40, 40), (120, 150)]

# ROI cutout of image
cutout = img[roi[0][1]:roi[1][1], roi[0][0]:roi[1][0], :]

# Generate new image from cutout with desired size
new_img = cv2.resize(cutout, (640, 480))

# Just some output for visualization
img = cv2.rectangle(img, roi[0], roi[1], (0, 255, 0), 2)
cv2.imshow('Original image with marked ROI', img)
cv2.imshow('Resized cutout of image', new_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

Original image with marked ROI

Resized cutout of image

----------------------------------------
System information
----------------------------------------
Platform:    Windows-10-10.0.16299-SP0
Python:      3.8.5
NumPy:       1.19.1
OpenCV:      4.4.0
----------------------------------------

Upvotes: 2

Related Questions