Python PIL 圖像處理中模式爲"P"的含義以及與"RGB"之間的轉換

查看圖片的模式

from PIL import Image
img = Image.open('xxx.gif')
print(img.mode)

對於一般的 gif 圖片,你會得到輸出 "P"
其他輸出有"1-二值圖",“L-灰度圖”,“RGB-三原色”"RGBA-三原色+透明度alpha"等。

P是什麼意思

P 可以理解爲 palettised,這是由調色盤 palette演變而來的,上例中使用gif圖像做測試是因爲大多數的GIF格式圖片都使用調色盤。

調色盤?

調色盤存儲在圖像文件的文件頭部附近,詳細資料可以在網絡中找到。

首先用大家熟悉的RGB圖像爲例,RGB圖像是典型的不使用調色盤存儲顏色的圖像格式,所以RGB採用R,G,B三個通道,每個通道在每一個像素位置用1個字節即8個比特存儲對應通道的顏色值(0~255),譬如純紅色的一張圖,它的R通道上每一個值都是255,表示紅色的程度最大,而另外兩個通道值爲0,表示不存在該顏色的分量。

考慮塗色盤的一個重要優點減少存儲空間使用量
簡單地說,調色盤是一個預設好的,這張表最多能存儲256中不同的調色方案。調色方案是由RGB值定義的。
以下代碼將會打印出圖像img的調色板情況,按照256個配色方案*3個通道值的格式排列:

print(np.array(img.getpalette()).reshape(256,3))

回過頭來,使用了調色盤的圖像將會被單通道存儲,每個像素位置的值是調色盤“表”中的索引,這在存儲圖像的時候空間要求從RGB的3個字節變成了1個字節

當然,因爲表中有限的配色方案數量(256),能使用的顏色也是有限制的,這也是P格式圖像的一個缺點

轉換

PIL庫提供了非常方便的函數:

img = img.convert('RGB')

執行以上語句即可完成轉換,同時,請注意賦值回原圖像變量,img.convert()的執行不是inplace的。


2019/12 Karl

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章