使用Python Pillow lib设置Color深度

ale*_*xis 4 python image pillow

我使用Python Pillow lib在将图像发送到设备之前更改图像.我需要更改图像以确保它符合以下要求

  • 分辨率(宽x高)= 298 x 144
  • 灰度
  • 颜色深度(位)= 4
  • 格式= .png

除了Color Depth到4位,我可以做所有这些.任何人都可以指出我如何实现这一目标的正确方向?

Tho*_*mas 5

到目前为止,我还没能用Pillow保存4位图像.您可以使用Pillow减少图像中的灰度级数:

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

假设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))
Run Code Online (Sandbox Code Playgroud)

最终得到的图像只包含16个不同的值(0,1,2,...,15).所以这些值都适合uint4类型.但是,如果用Pillow保存这样的图像

im2.save('test.png')
Run Code Online (Sandbox Code Playgroud)

png的颜色深度仍为8bit(如果打开图像,则只能看到真正的深灰色像素).你可以使用PyPng保存一个真正的4位png:

import png
import numpy as np
png.fromarray(np.asarray(im2, np.uint8),'L;4').save('test4bit_pypng.png')
Run Code Online (Sandbox Code Playgroud)

不幸的是,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')
Run Code Online (Sandbox Code Playgroud)

请参阅示例:通过改进的灰度进行图像量化。[Python]