#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()
----------------------------------------
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
смотрите здесь