我想用Python来剪切图像文件的透明区域。
请看下面的图片。
图像1(原始图像)
图像2(结果图像)
原始图像具有交替的不透明和透明区域。我想把像原始图像一样由1-空格-2-空格-3-空格-4组成的图像转换为1-2-3-4。
我尝试了以下代码,但未能获得所需的输出
typfrom PIL import Image
import numpy as np
def trim_transparency(image):
# Convert image to np.array
im = np.array(image)
# Import alpha channels only
alpha = im[:, :, 3]
# Found a range of nonzero indexes on each axis
non_empty_columns = np.where(alpha.max(axis=0)>0)[0]
non_empty_rows = np.where(alpha.max(axis=1)>0)[0]
# Found a range of nonzero indexes on each axis
cropBox = (min(non_empty_rows), max(non_empty_rows), min(non_empty_columns), max(non_empty_columns))
image_data = Image.fromarray(im).crop(cropBox)
return image_data
image = Image.open("original_image.png")
new_image = trim_transparency(image)
new_image.save("new_image.png")e here
2条答案
按热度按时间avwztpqn1#
你非常接近了-我会使用Numpy索引来收集你想要的行:
kuhbmx9i2#
您可以使用
any
代替max > 0
。axis=0
减少行,而axis=1
减少列。Numpy直接接受布尔掩码作为索引:大多数时候不需要使用
np.where
。在numpy中裁剪比在PIL中更容易。Numpy允许您选择或放弃所需的所有行,无论它们是否相邻。PIL函数似乎仅在连续区域上操作。
索引
..., -1
选择最后一个维度的最后一个元素。...
可以在索引中只使用一次,以指示所有未显式提及的维度的:
。