Как получить "центральный прямоугольник" матрицы с заданной шириной и высотой?
Есть numpy матрица, представляющая серое изображение. Как получить её "центральный прямоугольник" с заданной шириной и высотой?
Пример матрицы/картинки:
10 10 3 234 170 54
142 0 3 231 10 3
10 10 7 230 255 11
59 152 1 204 115 144
10 90 14 243 10 12
Результат для ширины 2 и высоты 3:
3 231
7 230
1 204
Ответы (2 шт):
Автор решения: MaxU
→ Ссылка
попробуйте так:
rows, cols = 3, 2
row_start = a.shape[0] // 2 - rows // 2
col_start = a.shape[1] // 2 - cols // 2
res = a[row_start : row_start + rows, col_start : col_start + cols]
результат:
In [59]: res
Out[59]:
array([[ 3, 231],
[ 7, 230],
[ 1, 204]])
Автор решения: AivanF.
→ Ссылка
Берём какой-нибудь массив:
import numpy as np
a = np.array(list(range(20))).reshape(4, 5)
print(a)
print(a.shape)
[[ 0 1 2 3 4]
[ 5 6 7 8 9]
[10 11 12 13 14]
[15 16 17 18 19]]
(4, 5)
Затем находим нужные индексы и делаем слайс по двум измерениям:
rows, cols = 2, 3
r0, c0 = (a.shape[0] - rows) // 2, (a.shape[1] - cols) // 2
r1, c1 = r0 + rows, c0 + cols
print(a[r0:r1, c0:c1])
[[ 6 7 8]
[11 12 13]]
PS. Вообще, если вам надо работать с изображениями, то для этого лучше подойдёт специализированный модуль, например, PIL, там можно и обрезать изображения как угодно, и переконвертировать, и множество других манипуляции легко делать. Есть документация и даже статья на русской Вики.
PIL
from PIL import Image
img = Image.open("ImageName.jpg")
img_w, img_h = img.size[0], img.size[1]
crop_w, crop_h = img_w // 2, img_h // 2
x0, y0 = (img_w - crop_w) // 2, (img_h - crop_h) // 2
x1, y1 = x0 + crop_w, y1 + crop_h
area = (x0, y0, x1, y0)
cropped_img = img.crop(area)
cropped_img.show()
OpenCV
import cv2
img = cv2.imread("ImageName.jpg")
img_h, img_w, _ = img.shape
crop_w, crop_h = img_w // 2, img_h // 2
x0, y0 = (img_w - crop_w) // 2, (img_h - crop_h) // 2
x1, y1 = x0 + crop_w, y1 + crop_h
cropped_img = img[y0:y1, x0:x1]
cv2.imshow("cropped", cropped_img)
cv2.waitKey(0)