Python 按中心裁剪图像

Python 按中心裁剪图像,python,matplotlib,multidimensional-array,png,Python,Matplotlib,Multidimensional Array,Png,我有一张218178大小的PNG图像。我正在使用matplotlib的函数imread将其转换为数据数组。我想裁剪它以获得图像的中间64X64部分 我试着用np.reforme进行裁剪,但没有任何意义。我还尝试将切片作为普通数组,但由于实际数组的形状为(218178,3),因此无法正确执行。我希望它(64,64,3)在前两个维度上从77到141,从57到121 只需从阵列中切片正确的部分,即可轻松完成裁剪。例如,image[100:200,50:100,:]在y(垂直)方向上对像素100和200

我有一张218178大小的PNG图像。我正在使用matplotlib的函数imread将其转换为数据数组。我想裁剪它以获得图像的中间64X64部分


我试着用np.reforme进行裁剪,但没有任何意义。我还尝试将切片作为普通数组,但由于实际数组的形状为(218178,3),因此无法正确执行。我希望它(64,64,3)在前两个维度上从77到141,从57到121

只需从阵列中切片正确的部分,即可轻松完成裁剪。例如,
image[100:200,50:100,:]
在y(垂直)方向上对像素100和200之间的部分进行切片,在x(水平)方向上对像素50和100之间的部分进行切片

请参见此工作示例:

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

您需要对numpy阵列的前两个轴进行切片,这两个轴分别对应于高度和宽度(第三个轴是颜色通道)

(2181783)

这三个数字对应于每个轴的大小,对于图像来说,通常被解释为:
(高度、宽度、深度/颜色)

(64,64,3)

还要注意,在裁剪时,您还可以省略最后一个冒号:
img[77:141,57:121]

修复,可能不需要字典和函数我省略了最后一个冒号,就是它。谢谢不适用于我:>>>>导入matplotlib.pyplot作为pl>>>img=pl.imread('/Users/bambrozi/Downloads/tmp/12517.png')>>>打印(img.shape)(49,159,3)>>img_裁剪=img[77:141,57:121]>>打印(img_裁剪的.shape)(0,64,3)图像的高度为49像素,因此无法从77像素裁剪到141像素。
import matplotlib.pyplot as pl

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

# confirm image shape
print(img.shape)
# crop image
img_cropped = img[77:141, 57:121, :]

# confirm cropped image shape
print(img_cropped.shape)