我有一个218、178大小的PNG图片。我正在使用matplotlib的函数imread将其转换为ndarray。我想将其裁剪以获取图像的中间64X64部分。
我尝试使用np.reshape裁剪,但这没有任何意义。我也尝试过切片作为普通数组,但由于实际数组的形状为(218,178,3),所以无法正确处理。我希望它(64,64,3)的前两个维度从77到141,从57到121。
答案 0 :(得分:4)
您要切片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]
答案 1 :(得分:1)
只需将正确的部分从数组中切出,即可轻松进行裁剪。例如。 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()