我是Python新手,嘗試使用PIL來執行我需要的Arduino項目的解析任務。這個問題適用於Image.convert()
方法和調色板,抖動等選項PIL - 想要抖動,但限制調色板導致問題
我有一些硬件能夠顯示一次只有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
)
(例如:)我認爲這方法應該做我想做的,但沒有運氣。它會讓圖像變得更加銳利,但會產生超過16種顏色的圖像。
爲了確保,我刪除了「抖動」參數。相同的輸出。
我重新添加了「dither = 1」參數,並拋出Image.ADAPTIVE參數(如上面的鏈接所示),以查看發生了什麼。這導致了包含16種顏色的圖像,但沒有抖動。
我在這裏錯過了什麼嗎? PIL越野車?我提出的解決方案是執行2個步驟,但似乎是sl and和不必要的。我想弄清楚如何做到這一點:-)爲了完整性,這裏是我的代碼版本,可以產生正確的結果 - 但它是以一種馬虎的方式做到的。 (第一步導致抖動圖像> 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避免抖動... – abarnert
順便說一下,我懷疑抖動到216種網頁顏色,然後量化爲網頁調色板的最佳16種顏色,通常會給您帶來比僅爲您的原始圖像量化最佳16種顏色更糟糕的效果。你的測試是否顯示其他?如果是這樣,也許你的解決方法是可以接受的。 – abarnert