Вырезание и изменение размера массива numpy до новой формы на основе ROI

#numpy

#numpy

Вопрос:

У меня есть массив numpy, и мне нужно вырезать из него раздел на основе ROI, например (x1, y1) (x2, y2). Цвет фона массива numpy равен нулю.

Мне нужно обрезать эту часть из первого массива numpy, а затем изменить размер обрезанного массива до (640 480) пикселей.

Я новичок в numpy и понятия не имею, как это сделать.

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

Ответ №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()
  

Исходное изображение с отмеченным ROI

Измененный размер выреза изображения

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

Ответ №2:

Вы можете обрезать массив, например

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

в зависимости от объема абстракции и чрезмерной разработки, которые вам нужны.

Ответ №3:

Я рекомендую использовать нарезку и обезжиривание. 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 , пожалуйста, смотрите здесь.
Подробности skimage смотрите здесь