Как получить "центральный прямоугольник" матрицы с заданной шириной и высотой?

Есть 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)
→ Ссылка