根据ROI将numpy数组裁剪并调整为新形状

时间:2020-09-10 09:54:00

标签: numpy

我有一个numpy数组,我需要根据像(x1,y1)(x2,y2)之类的ROI对其进行切割。 numpy数组的背景颜色为零。

我需要从第一个numpy数组中裁剪该部分,然后将裁剪后的数组调整为(640,480)像素。

我是numpy的新手,我不知道如何执行此操作。

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

3 个答案:

答案 0 :(得分:1)

听起来像您想要进行一些图像处理。因此,我建议您看一下OpenCV库。在其Python实现中,图像基本上是NumPy数组。因此,裁剪和调整大小变得非常容易:

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
----------------------------------------

答案 1 :(得分:0)

您可以像这样裁剪数组

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

或者您的情况

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

或其中之一

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

取决于所需的抽象和过度设计的数量。

答案 2 :(得分:0)

我建议使用切片和skimage。 skimage.transform.resize是您所需要的。

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)

有关slicing的更多信息,请参见here。 有关skimage的详细信息,请参见here

相关问题