Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 有人能给我解释一下不同的图像模式吗?_Python_Python Imaging Library - Fatal编程技术网

Python 有人能给我解释一下不同的图像模式吗?

Python 有人能给我解释一下不同的图像模式吗?,python,python-imaging-library,Python,Python Imaging Library,在此处输入图像描述 我不熟悉这种图像处理的东西。为什么我问这个问题是因为我有一个代码,它适用于RGB模式,但不适用于P模式? 所以我得出的结论是,它与模式有关。我做了一些关于模式的基础研究,但没有找到任何简单的解释。如果有人能帮我理解这一点,我会很有帮助的 代码: image=Image.open('image.png') image.load() image_data = np.asarray(image) image_data_bw = image_data.max(axis=2) non

在此处输入图像描述

我不熟悉这种图像处理的东西。为什么我问这个问题是因为我有一个代码,它适用于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')

输入下图中的代码:

输出应类似于下图(它被剪切到图片的边缘。请单击图像以了解):

此图像处于RGBA模式。因此,对于此类图像,代码工作正常。但图像处于P模式时不会

错误: 使用P模式时出现错误:
轴2超出维度为2的数组的范围。您发现的答案使用numpy大大简化了过程。PIL库通过
image.getbbox()
image.crop()
方法本地支持此用例:

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

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()


添加此选项可以完成此任务。

这些模式不是PNG图像特有的。它们只是以数字形式表示图像数据的不同方式。你能查看一下吗?调色板图像每像素只有一个值(RGB颜色信息存储在调色板中,这节省了空间)。你找到的代码假设每个像素有3个值。你看过其他答案了吗?PIL已经做了同样的事情,在所有模式下都是正确的。在这里使用numpy真是太过分了。您的示例输入图像是RGB图像。你有什么P模式的图像会让你出错?谢谢Martijn。上面的事情很有魅力。我想它对alpha通道不起作用,所以我们需要先删除它,然后使用getbbox裁剪图像。但是对于P模式,它工作得非常好。谢谢
img = image.convert('RGB')
cropbox = img.getbbox()
image_1 = img.crop(cropbox)