如何在python中只获取图像的裁剪部分

时间:2017-11-28 09:39:29

标签: python image numpy

我需要从图像中裁剪多边形。我用过PIL。我可以获得裁剪后的图像,但是当我读取裁剪多边形以进行进一步计算时,它会读取孔图像而不是裁剪部分。我只需要获得裁剪部分。 这是我的代码

import numpy as np
from PIL import Image,ImageDraw
im = Image.open("input.jpg").convert("RGBA")
imArray = np.asarray(im)

polygon=[cropping points]
#print(polygon)
print(imArray.shape)
maskIm = Image.new('L', (imArray.shape[1], imArray.shape[0]), 0)
ImageDraw.Draw(maskIm).polygon(polygon, outline=1, fill=1)
mask = np.array(maskIm)

newImArray = np.empty(imArray.shape, dtype='uint8')

newImArray[:, :, :3] = imArray[:, :, :3]
#print(newImArray)
newImArray[:, :, 3] = mask * 255

newIm = Image.fromarray(newImArray, "RGBA")
newIm.save("out.png","PNG")

1 个答案:

答案 0 :(得分:1)

通过查看PIL ImageDraw docs,通常会使用(x, y)元组列表来引用多边形。您需要做的是找到多边形的边界,并在原始图像和蒙版中围绕这些边界定义感兴趣的区域。然后,您可以简单地创建一个具有区域大小的数组,并从找到的边界插入图像/蒙版。

多边形永远不会延伸过去您定义的点,因此找到最小和最大(x,y)值将定义您感兴趣的区域。我相信以下内容应该对您有用,考虑到上述代码是非常明显的。

polygon = [(25, 67), (82, 90), (50, 22)]
min_x, min_y = np.min(polygon, axis=0)
max_x, max_y = np.max(polygon, axis=0)
h, w = max_y - min_y, max_x - min_x

newImArray = np.empty((h, w, 4), dtype='uint8')

newImArray[:, :, :3] = imArray[min_y:max_y, min_x:max_x, :3]
newImArray[:, :, 3] = mask[min_y:max_y, min_x:max_x] * 255

newIm = Image.fromarray(newImArray, "RGBA")
newIm.save("out.png","PNG")