使用Python Pillow库设置颜色深度

6
我正在使用Python的Pillow库在将图像发送到设备之前更改它。 我需要更改图像以确保满足以下要求:
  • 分辨率(宽度x高度)= 298 x 144
  • 灰度
  • 颜色深度(位数)= 4
  • 格式= .png
除了将颜色深度更改为4位之外,我可以完成所有操作。 有人能指导我如何实现这一点吗?

你想将它转换为4位灰度级图像,还是RGB中每个通道都是4位? - Marcin
@Marcin 规范没有说明具体是哪种类型,但我认为它指的是“4位灰度级图像”。 - alexis
2个回答

6

到目前为止,我还无法使用Pillow保存4位图像。您可以使用Pillow来减少图像中灰度级的数量:

import PIL.Image as Image
im = Image.open('test.png')
im1 = im.point(lambda x: int(x/17)*17)

假设test.png是一张8位灰度图像,即它包含在0-255范围内的值(im.mode == 'L'),im1现在仅包含16个不同的值(0, 17, 34, ..., 255)。这也是ufp.image.changeColorDepth所做的。但是,你仍然拥有一张8位图像。因此,你可以这样做:
im2 = im.point(lambda x: int(x/17))

当你处理一张图像,最终只有16个不同的值(0、1、2...15),这些值可以适用于uint4类型。但是,如果你使用Pillow保存这样的图像

im2.save('test.png')

这个PNG文件仍然保持8位的色深(如果你打开图像,你只会看到非常暗的灰色像素)。你可以使用PyPng保存真正的4位PNG文件:

import png
import numpy as np
png.fromarray(np.asarray(im2, np.uint8),'L;4').save('test4bit_pypng.png')

不幸的是,PyPng保存图像的时间似乎要更长一些。


0

在 ufp.image 模块中使用 changeColorDepth 函数。

import ufp.image
import PIL
im = PIL.Image.open('test.png')
im = im.convert('L') # change to grayscale image
im.thumbnail((298, 144)) # resize to 294x144
ufp.image.changeColorDepth(im, 16) # change 4bits depth(this function change original PIL.Image object)
#if you will need better convert. using ufp.image.quantizeByImprovedGrayScale function. this function quantized image.
im.save('changed.png')

看一个例子:通过改进的灰度缩放进行图像量化。[Python]


导入错误:没有名为ufp.image的模块,遇到这个错误,请帮忙解决。 - Hardik Gajjar
1
ufp.image的代码在这里:https://github.com/Thestars3/pyufp/blob/master/ufp/image.py。changeColorDepth函数仅以类似于@Thomas下面的代码中PIL的方式使用它。 - Dr. Goulu
-1 只是因为这是一个未维护的软件包,其文档部分仅以韩语提供,而部分已经不再容易获取,因为它们被重定向到YouTube上的Rick Astley的Never Gonna Give You Up。也许底层代码仍然很好,但在我看来,引用相关函数的实现比建议依赖于一个未维护的软件包更可取,因为大多数读者无法理解其文档,除非使用Google翻译。 - Mark Amery

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接