numpy 在Python中删除图像的透明区域

qyswt5oh  于 2023-05-29  发布在  Python
关注(0)|答案(2)|浏览(254)

我想用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
avwztpqn

avwztpqn1#

你非常接近了-我会使用Numpy索引来收集你想要的行:

from PIL import Image
import numpy as np

# Open image and ensure not palettised, make into Numpy array and select alpha channel
im = Image.open('e0rRU.png').convert('RGBA')
na = np.array(im)
alpha = na[:, :, 3]

# Find opaque rows
non_empty_rows = np.where(alpha.max(axis=1)>0)[0]

# Copy them to new image
opaque = na[non_empty_rows,...]

# Save
Image.fromarray(opaque).save('result.png')

kuhbmx9i

kuhbmx9i2#

您可以使用any代替max > 0
axis=0减少行,而axis=1减少列。
Numpy直接接受布尔掩码作为索引:大多数时候不需要使用np.where
在numpy中裁剪比在PIL中更容易。Numpy允许您选择或放弃所需的所有行,无论它们是否相邻。PIL函数似乎仅在连续区域上操作。

im = np.array(image)
Image.fromarray(im[im[..., -1].any(axis=1)])

索引..., -1选择最后一个维度的最后一个元素。...可以在索引中只使用一次,以指示所有未显式提及的维度的:

相关问题