私はPythonが初めてで、Arduinoプロジェクトに必要な解析タスクを実行するためにPILを使用しようとしています。この質問はImage.convert()
、カラー パレット、ディザリングなどの方法とオプションに関するものです。
一度に 16 色しか画像を表示できないハードウェアがあります (ただし、RGB トリプレットを指定できます)。したがって、任意のトゥルーカラー PNG 画像を取得し、それを表す「最適な」16 色パレットを選択し、その画像を 16 色のみを含むパレット化されたものに変換するタスクを自動化したいと考えています。
ディザリングを使いたい。問題は、image.convert()
メソッドが少しファンキーに動作しているように見えることです。その引数は完全に文書化されていないため( Image.convert() の PIL ドキュメント)、それが私のせいなのか、メソッドにバグがあるのか わかりません。
私のコードの簡単なバージョンは次のとおりです。
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 色以上のディザリングされたイメージが生成され、2 番目のステップでは 16 色のみを含むイメージが生成されます。)
MyImage_intermediate = MyImageTrueColor.convert(mode='P',
colors=16
)
MyImageDithered = MyImage_intermediate.convert(mode='P',
colors=16,
dither=1,
palette=Image.ADAPTIVE
)
ありがとう!