【发布时间】:2012-09-20 15:53:37
【问题描述】:
我是 Python 新手,正在尝试使用 PIL 执行 Arduino 项目所需的解析任务。这个问题与Image.convert() 方法和调色板、抖动等选项有关。
我有一些硬件能够一次仅显示 16 种颜色的图像(但它们可以指定为 RGB 三元组)。因此,我想自动执行获取任意真彩色 PNG 图像的任务,选择一个“最佳”的 16 色调色板来表示它,并将图像转换为仅包含 16 种颜色的调色板。
我想使用抖动。问题是,image.convert() 方法似乎有点古怪。它的论点没有完整记录(PIL documentation for Image.convert()),所以我不知道是我的错还是方法有问题。
我的代码的简单版本如下:
import Image
MyImageTrueColor = Image.new('RGB',100,100) # or whatever dimension...
# I paste some images from several other PNG files in using MyImageTrueColor.paste()
MyImageDithered = MyImageTrueColor.convert(mode='P',
colors=16,
dither=1
)
根据我所做的一些搜索(例如:How to reduce color palette with PIL),我认为这种方法应该可以满足我的要求,但没有运气。它会抖动图像,但会生成超过 16 种颜色的图像。
为了确定,我删除了“抖动”参数。相同的输出。
我重新添加了“dither=1”参数并加入了 Image.ADAPTIVE 参数(如上面的链接所示),只是为了看看发生了什么。这导致图像包含 16 种颜色,但没有抖动。
我在这里遗漏了什么吗? PIL 有问题吗?我想出的解决方案是执行 2 个步骤,但这似乎草率且不必要。我想弄清楚如何正确地做到这一点:-) 为了完整起见,这是我的代码版本,它产生了正确的结果——但它以一种草率的方式做到了。 (第一步会产生 >16 色的抖动图像,而第二步会产生仅包含 16 色的图像。)
MyImage_intermediate = MyImageTrueColor.convert(mode='P',
colors=16
)
MyImageDithered = MyImage_intermediate.convert(mode='P',
colors=16,
dither=1,
palette=Image.ADAPTIVE
)
谢谢!
【问题讨论】:
-
上面显示的链接明确表示“我正在使用 Image.ADAPTIVE 来避免抖动”,所以我不确定你是否对使用 Image.ADAPTIVE 避免抖动感到惊讶……
-
顺便说一下,我怀疑抖动到 216 种网络颜色,然后量化到网络调色板的最佳 16 种颜色,通常会给您带来比仅量化到最适合您的 16 种颜色更糟糕的结果原始图像。您的测试是否显示其他结果?如果是这样,也许您的解决方法是可以接受的。
标签: python image python-imaging-library dithering