Python圖像處理庫PIL中圖像格式轉換

轉載自:Python圖像處理庫PIL中圖像格式轉換函數

對於彩色圖像,無論其圖像格式是PNG,仍是BMP,或者JPG,在PIL中,使用Image模塊的open()函數打開後,返回的圖像對象的模式都是「RGB」。
而對於灰度圖像,無論其圖像格式是PNG,仍是BMP,或者JPG,打開後,其模式爲「L」。
對Image模塊的介紹,對於PNG、BMP和JPG彩色圖像格式之間的互相轉換均可以經過Image模塊的open()和save()函數來完成。
具體說就是,在打開這些圖像時,PIL會將它們解碼爲三通道的「RGB」圖像。用戶能夠基於這個「RGB」圖像,對其進行處理。
處理完畢,使用函數save(),能夠將處理結果保存成PNG、BMP和JPG中任何格式。這樣也就完成了幾種格式之間的轉換。

對於不一樣的格式的圖像之間轉換,咱們須要使用convert函數

im.convert(mode) ⇒ image
im.convert(「P」, **options) ⇒ image
im.convert(mode, matrix) ⇒ image

使用不一樣的參數,將當前的圖像轉換爲新的模式,併產生新的圖像做爲返回值。spa

PIL中有九種不一樣模式。分別爲1,L,P,RGB,RGBA,CMYK,YCbCr,I,F

原圖像:

一、 模式「1」---二值圖像

模式「1」爲二值圖像,非黑即白。可是它每一個像素用8個bit表示,0表示黑,255表示白。下面咱們將lena圖像轉換爲「1」圖像。
from PIL import Image

im = Image.open("./g.png")
print(im.mode)  
print(im.size)
print(im.getpixel((0,0)))   #獲取指定點處的像素值

im_1 = im.convert("1")
print(im_1.mode)
print(im_1.size)
print(im_1.getpixel((0,0)))
print(im_1.getpixel((140,140)))
im_1.show()
RGB
(286, 289)
(156, 169, 193)
1
(286, 289)
255
0

 

二、 模式「L」---灰度圖像

模式「L」爲灰色圖像,它的每一個像素用8個bit表示,0表示黑,255表示白,其餘數字表示不一樣的灰度。在PIL中,從模式「RGB」轉換爲「L」模式是按照下面的公式轉換的:

L = R * 299/1000 + G * 587/1000+ B * 114/1000
im_L = im.convert("L")
RGB
(286, 289)
(156, 169, 193)
L
(286, 289)
167
86   #156*299/1000+169*587/1000+193*114/1000 ---> 46.644+99.203+22.002 ---> 167.849  PIL中只取了整數部分

三、 模式「P」---八位彩色圖像,色彩值由調色板查詢

模式「P」爲8位彩色圖像,它的每一個像素用8個bit表示,其對應的彩色值是按照調色板查詢出來的。
im_P = im.convert("P")
RGB
(286, 289)
(156, 169, 193)
P
(286, 289)
175
96 

四、 模式「RGBA」---4通道RGB和alpha透明道

模式「RGBA」爲32位彩色圖像,它的每一個像素用32個bit表示,其中24bit表示紅色、綠色和藍色三個通道,另外8bit表示alpha通道,即透明通道。
im_RGBA = im.convert("RGBA")
RGB
(286, 289)
(156, 169, 193)
RGBA
(286, 289)
(156, 169, 193, 255)  #4通道,默認將RGB圖像轉RGBA時,alpha通道爲255
(91, 85, 83, 255

五、 模式「CMYK」---印刷四分色模式(C青色M品紅Y黃色K黑色)

模式「CMYK」爲32位彩色圖像,它的每一個像素用32個bit表示。模式「CMYK」就是印刷四分色模式,它是彩色印刷時採用的一種套色模式,利用色料的三原色混色原理,加上黑色油墨,共計四種顏色混合疊加,造成所謂「全綵印刷」。

四種標準顏色是:C:Cyan = 青色,又稱爲‘天藍色’或是‘湛藍’M:Magenta = 品紅色,又稱爲‘洋紅色’;Y:Yellow = 黃色;K:Key Plate(blacK) = 定位套版色(黑色)。
im_CMYK = im.convert("CMYK")
RGB
(286, 289)
(156, 169, 193)
CMYK
(286, 289)
(99, 86, 62, 0)
(164, 170, 172, 0)

轉換公式

C = 255 - R
M = 255 - G
Y = 255 - B
K = 0 

因爲該轉換公式比較簡單,轉換後的圖像顏色有些失真。

 六、 模式「YCbCr」---24位(Y亮度Cb藍色色度Cr紅色色度)

模式「YCbCr」爲24位彩色圖像,它的每一個像素用24個bit表示。YCbCr其中Y是指亮度份量,Cb指藍色色度份量,而Cr指紅色色度份量。人的肉眼對視頻的Y份量更敏感,所以在經過對色度份量進行子採樣來減小色度份量後,肉眼將察覺不到的圖像質量的變化。
Y= 0.257*R+0.504*G+0.098*B+16
Cb = -0.148*R-0.291*G+0.439*B+128
Cr = 0.439*R-0.368*G-0.071*B+128
im_YCbCr = im.convert("YCbCr")
RGB
(286, 289)
(156, 169, 193)
YCbCr
(286, 289)
(167, 142, 119)
(86, 126, 131)

七、 模式「I」---與上面灰度模式L一致

模式「I」爲32位整型灰色圖像,它的每一個像素用32個bit表示,0表示黑,255表示白,(0,255)之間的數字表示不一樣的灰度。在PIL中,從模式「RGB」轉換爲「I」模式是按照下面的公式轉換的:
im_I = im.convert("I")
I = R * 299/1000 + G * 587/1000 + B * 114/1000
RGB
(286, 289)
(156, 169, 193)
I
(286, 289)
167
86
模式「I」與模式「L」的結果是徹底同樣,只是模式「L」的像素是8bit,而模式「I」的像素是32bit。

 

八、 模式「F」---32位浮點灰色圖像

模式「F」爲32位浮點灰色圖像,它的每一個像素用32個bit表示,0表示黑,255表示白,(0,255)之間的數字表示不一樣的灰度。在PIL中,從模式「RGB」轉換爲「F」模式是按照下面的公式轉換的:
F = R * 299/1000+ G * 587/1000 + B * 114/1000
im_F = im.convert("F")
RGB
(286, 289)
(156, 169, 193)
F
(286, 289)
167.8489990234375
86.56600189208984

 

 

模式「F」與模式「L」的轉換公式是同樣的,都是RGB轉換爲灰色值的公式,但模式「F」會保留小數部分,如實驗中的數據。

 另外:其餘模式轉RGB相似使用convert方法

相關文章
相關標籤/搜索