Обрезка изображения по центру - PullRequest
0 голосов
/ 12 декабря 2018

У меня есть PNG-изображение размером 218, 178. Я использую функцию imp в matplotlib, чтобы преобразовать ее в ndarray.Я хотел бы обрезать его, чтобы получить среднюю 64X64 часть изображения.

Я попытался обрезать с помощью np.reshape, но это не имеет смысла.Я также попытался нарезать как обычный массив, но я не могу сделать это правильно, так как фактический массив имеет форму (218,178,3).Я хочу, чтобы он (64,64,3) брал от 77 до 141 и от 57 до 121 для первых двух измерений.

Ответы [ 2 ]

0 голосов
/ 12 декабря 2018

Вы хотите нарезать первые две оси массива numpy, которые соответствуют высоте и ширине, соответственно (третий канал цвета).

import matplotlib.pyplot as pl

# load image
img = pl.imread('my_image.png')

# confirm image shape
print(img.shape)

(218, 178, 3)

Эти три числа соответствуют размеру каждой оси, которые для изображения обычно интерпретируются как: (height, width, depth/colors).

# crop image
img_cropped = img[77:141, 57:121, :]

# confirm cropped image shape
print(img_cropped.shape)

(64, 64, 3)

Также обратите внимание, что при кадрировании вы могли бы также опустить последнее двоеточие: img[77:141, 57:121]

0 голосов
/ 12 декабря 2018

Обрезку можно легко выполнить, просто вырезав нужную часть из массива.Например, image[100:200, 50:100, :] разрезает часть между пикселями 100 и 200 в направлении y (по вертикали) и часть между пикселями 50 и 100 в направлении x (по горизонтали).

См. Этот рабочий пример:

import matplotlib.pyplot as plt

mydic = {
  "annotations": [
  {
    "class": "rect",
    "height": 98,
    "width": 113,
    "x": 177,
    "y": 12
  },
  {
    "class": "rect",
    "height": 80,
    "width": 87,
    "x": 373,
    "y": 43
  }
 ],
   "class": "image",
   "filename": "https://i.stack.imgur.com/9qe6z.png"
}


def crop(dic, i):
    image = plt.imread(dic["filename"])
    x0 = dic["annotations"][i]["x"]
    y0 = dic["annotations"][i]["y"]
    width = dic["annotations"][i]["width"]
    height = dic["annotations"][i]["height"]
    return image[y0:y0+height , x0:x0+width, :]


fig = plt.figure()
ax = fig.add_subplot(121)
ax.imshow(plt.imread(mydic["filename"]))

ax1 = fig.add_subplot(222)
ax1.imshow(crop(mydic, 0))

ax2 = fig.add_subplot(224)
ax2.imshow(crop(mydic, 1))

plt.show()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...