【问题标题】:Can someone explain me different type of modes of image?有人可以解释一下不同类型的图像模式吗?
【发布时间】:2018-05-30 23:50:09
【问题描述】:

在此输入图片描述

我是这个图像处理的新手。为什么我问这个问题是因为我有一个适用于 RGB 模式但不适用于 P 模式的代码? 所以我得出结论,它与模式有关。我对模式进行了一些基础研究。但没有找到任何简单的解释。如果有人可以帮助我理解这一点,将会很有帮助。

代码:

image=Image.open('image.png')
image.load()

image_data = np.asarray(image)
image_data_bw = image_data.max(axis=2)
non_empty_columns = np.where(image_data_bw.max(axis=0)>0)[0]
non_empty_rows = np.where(image_data_bw.max(axis=1)>0)[0]
cropBox = (min(non_empty_rows), max(non_empty_rows), min(non_empty_columns), max(non_empty_columns))

image_data_new = image_data[cropBox[0]:cropBox[1]+1, cropBox[2]:cropBox[3]+1 , :]

new_image = Image.fromarray(image_data_new)
new_image.save('cropped_image.png')

Codesource

输入到图片后面的代码:

输出应该如下图(裁剪到图片边缘,请点击图片了解):

此图像处于 RGBA 模式。因此代码对此类图像运行良好。但不是 P 模式下的图像。

错误: 我在 P 模式下遇到的错误: 轴 2 超出维度 2 数组的范围

【问题讨论】:

  • 这些模式并非特定于 PNG 图像。它们只是以数字形式表示图像数据的不同方式。
  • 你能看一下吗?
  • 调色板图像的每个像素只有 一个 值(RGB 颜色信息存储在调色板中,这样可以节省空间)。您找到的代码假定每个像素有 3 个值。
  • 你看其他答案了吗? PIL 已经开箱即用地做同样的事情,适用于所有模式。在这里使用 numpy 实在是太过分了。
  • 您的示例输入图像是 RGB 图像。你有什么 P 模式图像会导致错误?

标签: python python-imaging-library


【解决方案1】:

您找到的答案通过使用 numpy. PIL 库通过 image.getbbox()image.crop() 方法原生支持此用例:

cropbox = image.getbbox()
new_image = image.crop(cropbox)

这适用于所有不同的模式,无论如何。 image.getbbox() 生成的cropbox 与numpy 路由生成的cropbox 大小完全相同。

【讨论】:

  • 谢谢 Martijn。上面的东西就像一个魅力。我猜它不适用于 alpha 通道,所以我们需要先删除它,然后使用 getbbox 裁剪图像。但是对于 P 模式,它可以完美运行。谢谢!!
【解决方案2】:
from PIL import Image

img = Image.open('Image.png')

print(x,y)
img.show()
cropbox_1 = img.getbbox()
new_image_1 = img.crop(cropbox_1)
new_image_1.save('Cropped_image,png')
new_image_1.show()

此代码将图像完全裁剪到边缘。仅当图像具有 Alpha 通道时,您可能必须通过转换来删除该通道。

例如。如果是 RGBA 模式,则设置为 RGB,然后使用getbbox()

img = image.convert('RGB')
cropbox = img.getbbox()
image_1 = img.crop(cropbox)

添加这个应该可以完成任务。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-22
    • 2016-12-12
    • 2016-07-29
    • 1970-01-01
    相关资源
    最近更新 更多