Python影象處理庫PIL中影象格式轉換(一)
在數字影象處理中,針對不同的影象格式有其特定的處理演算法。所以,在做影象處理之前,我們需要考慮清楚自己要基於哪種格式的影象進行演算法設計及其實現。本文基於這個需求,使用python中的影象處理庫PIL來實現不同影象格式的轉換。
對於彩色影象,不管其影象格式是PNG,還是BMP,或者JPG,在PIL中,使用Image模組的open()函式開啟後,返回的影象物件的模式都是“RGB”。而對於灰度影象,不管其影象格式是PNG,還是BMP,或者JPG,開啟後,其模式為“L”。
通過之前的部落格對Image模組的介紹,對於PNG、BMP和JPG彩色影象格式之間的互相轉換都可以通過Image模組的open()
這裡,我想詳細介紹一下Image模組的convert()函式,用於不同模式影象之間的轉換。
Convert()函式有三種形式的定義,它們定義形式如下:
im.convert(mode) ⇒ image
im.convert(“P”, **options) ⇒ image
im.convert(mode, matrix) ⇒ image
使用不同的引數,將當前的影象轉換為新的模式,併產生新的影象作為返回值。
”,我們知道PIL中有九種不同模式。分別為1,L,P,RGB,RGBA,CMYK,YCbCr,I,F。
本文我採用的示例影象是影象處理中經典的lena照片。解析度為512x512的lena圖片如下:
一、模式“RGB”轉換為其他不同模式
1、 模式“1”
模式“1”為二值影象,非黑即白。但是它每個畫素用8個bit表示,0表示黑,255表示白。下面我們將lena影象轉換為“1”影象。
例子:
>>>from PIL import Image
>>> lena =Image.open("D:\\Code\\Python\\test\\img\\lena.jpg")
>>> lena.mode
'RGB'
>>> lena.getpixel((0,0))
(197, 111, 78)
>>> lena_1 = lena.convert("1")
>>> lena_1.mode
'1'
>>> lena_1.size
(512, 512)
>>>lena_1.getpixel((0,0))
255
>>> lena_1.getpixel((10,10))
255
>>>lena_1.getpixel((10,120))
0
>>>lena_1.getpixel((130,120))
255
影象lena_1的模式為“1”,解析度為512x512,如下:
2、 模式“L”
模式“L”為灰色影象,它的每個畫素用8個bit表示,0表示黑,255表示白,其他數字表示不同的灰度。在PIL中,從模式“RGB”轉換為“L”模式是按照下面的公式轉換的:
L = R * 299/1000 + G * 587/1000+ B * 114/1000
下面我們將lena影象轉換為“L”影象。
例子:
>>> from PIL importImage
>>> lena = Image.open("D:\\Code\\Python\\test\\img\\lena.jpg")
>>> lena.mode
'RGB'
>>> lena.getpixel((0,0))
(197, 111, 78)
>>> lena_L =lena.convert("L")
>>> lena_L.mode
'L'
>>> lena_L.size
(512, 512)
>>>lena.getpixel((0,0))
(197, 111, 78)
>>>lena_L.getpixel((0,0))
132
對於第一個畫素點,原始影象lena為(197, 111, 78),其轉換為灰色值為:
轉換後的影象lena_L如下:
3、 模式“P”
模式“P”為8位彩色影象,它的每個畫素用8個bit表示,其對應的彩色值是按照調色盤查詢出來的。
下面我們使用預設的調色盤將lena影象轉換為“P”影象。
例子:
>>> from PIL importImage
>>> lena = Image.open("D:\\Code\\Python\\test\\img\\lena.jpg")
>>> lena.mode
'RGB'
>>> lena.getpixel((0,0))
(197, 111, 78)
>>> lena_P =lena.convert("P")
>>> lena_P.mode
'P'
>>>lena_P.getpixel((0,0))
62
轉換後的影象lena_P如下:
4、 模式“RGBA”
模式“RGBA”為32位彩色影象,它的每個畫素用32個bit表示,其中24bit表示紅色、綠色和藍色三個通道,另外8bit表示alpha通道,即透明通道。
下面我們將模式為“RGB”的lena影象轉換為“RGBA”影象。
例子:
>>> from PIL import Image
>>>lena = Image.open("D:\\Code\\Python\\test\\img\\lena.jpg")
>>>lena.mode
'RGB'
>>>lena.getpixel((0,0))
(197,111, 78)
>>>lena_rgba = lena.convert("RGBA")
>>>lena_rgba.mode
'RGBA'
>>>lena_rgba.getpixel((0,0))
(197,111, 78, 255)
>>>lena_rgba.getpixel((0,1))
(196,110, 77, 255)
>>>lena.getpixel((0,0))
(197,111, 78)
>>>lena.getpixel((0,1))
(196,110, 77)
從例項中可以看到,使用當前這個方式將“RGB”影象轉為“RGBA”影象時,alpha通道全部設定為255,即完全不透明。
轉換後的影象lena_rgba如下:
5、 模式“CMYK”
模式“CMYK”為32位彩色影象,它的每個畫素用32個bit表示。模式“CMYK”就是印刷四分色模式,它是彩色印刷時採用的一種套色模式,利用色料的三原色混色原理,加上黑色油墨,共計四種顏色混合疊加,形成所謂“全綵印刷”。
四種標準顏色是:C:Cyan = 青色,又稱為‘天藍色’或是‘湛藍’M:Magenta = 品紅色,又稱為‘洋紅色’;Y:Yellow = 黃色;K:Key Plate(blacK) = 定位套版色(黑色)。
下面我們將模式為“RGB”的lena影象轉換為“CMYK”影象。
例子:
>>>from PIL import Image
>>> lena =Image.open("D:\\Code\\Python\\test\\img\\lena.jpg")
>>> lena_cmyk =lena.convert("CMYK")
>>> lena_cmyk.mode
'CMYK'
>>>lena_cmyk.getpixel((0,0))
(58, 144, 177, 0)
>>> lena_cmyk.getpixel((0,1))
(59, 145, 178, 0)
>>>lena.getpixel((0,0))
(197, 111, 78)
>>>lena.getpixel((0,1))
(196, 110, 77)
從例項中可以得知PIL中“RGB”轉換為“CMYK”的公式如下:
C = 255 - R
M = 255 - G
Y = 255 - B
K = 0
由於該轉換公式比較簡單,轉換後的影象顏色有些失真。
轉換後的影象lena_cmyk如下:
6、 模式“YCbCr”
模式“YCbCr”為24位彩色影象,它的每個畫素用24個bit表示。YCbCr其中Y是指亮度分量,Cb指藍色色度分量,而Cr指紅色色度分量。人的肉眼對視訊的Y分量更敏感,因此在通過對色度分量進行子取樣來減少色度分量後,肉眼將察覺不到的影象質量的變化。
模式“RGB”轉換為“YCbCr”的公式如下:
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
下面我們將模式為“RGB”的lena影象轉換為“YCbCr”影象。
例子:
>>>from PIL import Image
>>> lena =Image.open("D:\\Code\\Python\\test\\img\\lena.jpg")
>>> lena_ycbcr =lena.convert("YCbCr")
>>>lena_ycbcr.mode
'YCbCr'
>>>lena_ycbcr.getpixel((0,0))
(132, 97, 173)
>>>lena.getpixel((0,0))
(197, 111, 78)
按照公式,Y = 0.257*197+0.564*111+0.098*78+16= 136.877
=
100.785
Cr = 0.439*197-0.368*111-0.071*78+128 = 168.097
由此可見,PIL中並非按照這個公式進行“RGB”到“YCbCr”的轉換。
轉換後的影象lena_ycbcr如下:
7、 模式“I”
模式“I”為32位整型灰色影象,它的每個畫素用32個bit表示,0表示黑,255表示白,(0,255)之間的數字表示不同的灰度。在PIL中,從模式“RGB”轉換為“I”模式是按照下面的公式轉換的:
I = R * 299/1000 + G * 587/1000 + B * 114/1000
下面我們將模式為“RGB”的lena影象轉換為“I”影象。
例子:
>>> from PIL import Image
>>>lena = Image.open("D:\\Code\\Python\\test\\img\\lena.jpg")
>>>lena.getpixel((0,0))
(197,111, 78)
>>>lena.getpixel((0,1))
(196,110, 77)
>>> lena_I =lena.convert("I")
>>> lena_I.mode
'I'
>>>lena_I.getpixel((0,0))
132
>>>lena_I.getpixel((0,1))
131
>>> lena_L =lena.convert("L")
>>>lena_L.getpixel((0,0))
132
>>>lena_L.getpixel((0,1))
131
從實驗的結果看,模式“I”與模式“L”的結果是完全一樣,只是模式“L”的畫素是8bit,而模式“I”的畫素是32bit。
8、 模式“F”
模式“F”為32位浮點灰色影象,它的每個畫素用32個bit表示,0表示黑,255表示白,(0,255)之間的數字表示不同的灰度。在PIL中,從模式“RGB”轉換為“F”模式是按照下面的公式轉換的:
F = R * 299/1000+ G * 587/1000 + B * 114/1000
下面我們將模式為“RGB”的lena影象轉換為“F”影象。
例子:
>>>from PIL import Image
>>> lena =Image.open("D:\\Code\\Python\\test\\img\\lena.jpg")
>>>lena.getpixel((0,0))
(197, 111, 78)
>>>lena.getpixel((0,1))
(196, 110, 77)
>>> lena_F =lena.convert("F")
>>> lena_F.mode
'F'
>>>lena_F.getpixel((0,0))
132.95199584960938
>>>lena_F.getpixel((0,1))
131.95199584960938
模式“F”與模式“L”的轉換公式是一樣的,都是RGB轉換為灰色值的公式,但模式“F”會保留小數部分,如實驗中的資料。
(未完待續)
相關推薦
Python影象處理庫PIL的Image模組介紹(一)
Image模組是PIL中最重要的模組,它有一個類叫做image,與模組名稱相同。Image類有很多函式、方法及屬性,接下來將依次對image類的屬性、函式和方法進行介紹。 1、 Format 定
Python影象處理庫PIL中影象格式轉換(二)
參考:https://blog.csdn.net/icamera0/article/details/50843196?utm_source=blogxgwz0 接上一篇《Python影象處理庫PIL中影象格式轉換(一)》 二、其他不同模式轉換為“RGB”模式 模式“RGB”為24位彩色影
Python影象處理庫PIL中影象格式轉換(一)
在數字影象處理中,針對不同的影象格式有其特定的處理演算法。所以,在做影象處理之前,我們需要考慮清楚自己要基於哪種格式的影象進行演算法設計及其實現。本文基於這個需求,使用python中的影象處理庫PIL
Python影象處理庫PIL的Image模組介紹(四)
(Image模組方法16-25) 16、 Paste 定義1:im.paste(image,box) 含義1:將一張圖貼上到另一張影象上。變數box或者是一個給定左上角的2元組,或者是定義了左,上,右和下畫素座標的4元組,或者為空(與(0,0)一樣)。如果給定4元組,
Python圖像處理庫PIL中圖像格式轉換(一)
http 分享圖片 r+ name 結果 針對 浮點 code 技術 在數字圖像處理中,針對不同的圖像格式有其特定的處理算法。所以,在做圖像處理之前,我們需要考慮清楚自己要基於哪種格式的圖像進行算法設計及其實現。本文基於這個需求,使用python中的圖像處理庫PIL來實現不
opencv+Python影象處理進階教程學習總結記錄(一)
教程:2 opencv+python影象處理進階 講解老師:賈志剛 1.1 進階主要內容概述:影象卷積與應用,直方圖應用,模板匹配,影象金字塔 1.2 模糊與卷積原理 上圖顯示為一維和二維的均值卷積示例 相關Api : blur 程式碼示例 import c
影象處理工具包ImagXpress常見問題解答(一)
ImagXpress是一組影象處理庫,可將影象處理新增到Windows應用程式中。此成像SDK通過藉助影象編輯,轉換,壓縮和顏色調整等功能,以及易於實現的程式碼和全面的程式碼示例可輕鬆新增影象處理和操作到Windows應用程式。ImagXpress的優點: 數十種影象處理功能 易於
影象處理:顯著性區域檢測總結(一)
1.Mingming Cheng,Global Contrast based Salient Region Detection,CVPR2011 1) HC:基於直方圖對比度的方法,每一個畫素的顯著性值是由它與影象中所有其他畫素的顏色差異來確定,得到全解析度顯著性影象; 2) RC:基於區域性對比度的方法,
資料格式轉換(一)PDF轉換技術
PDF(Portable Document Format)檔案格式是Adobe公司開發的電子檔案格式。這種檔案格式與作業系統平臺無關,這一特點使它成為在Internet上進行電子文件發行和數字化資訊傳播的理想文件格式。越來越多的電子圖書、產品說明、公司文告、網路資
數據格式轉換(一)PDF轉換技術
技術 這一 依據 修飾 文本文 ria 文本鏈接 長度 pan ? ? ?PDF(Portable Document Format)文件格式是Adobe公司開發的
Python圖像處理庫PIL中圖像格式轉換
.com 彩色圖像 strong TP 四種 PE HR 它的 綠色 o 在數字圖像處理中,針對不同的圖像格式有其特定的處理算法。所以,在做圖像處理之前,我們需要考慮清楚自己要基於哪種格式的圖像進行算法設計及其實現。本文基於這個需求,使用python中的圖像處理庫
Python影象處理庫PIL-convert()函式
在數字影象處理中,針對不同的影象格式有其特定的處理演算法。所以,在做影象處理之前,我們需要考慮清楚自己要基於哪種格式的影象進行演算法設計及其實現。本文基於這個需求,使用python中的影象處理庫PIL來實現不同影象格式的轉換。 PIL的九種不同模式:1,L,P,RGB,RGB
Python影象處理庫PIL的ImageFilter模組介紹
Python影象處理庫PIL的ImageFilter模組介紹 ImageFilter模組提供了濾波器相關定義;這些濾波器主要用於Image類的filter()方法。 一、ImageFilter模組所支
Python影象處理庫PIL的濾波_ImageFilter
Python影象處理庫PIL的濾波_ImageFilter ImageFilter模組提供了濾波器相關定義;這些濾波器主要用於Image類的filter()方法。 一、ImageFilter模組所支援的濾波器
Win7下安裝Python影象處理庫PIL
近期為了研究影象處理相關知識,我需要搭建一個環境,可以編寫影象處理方面的程式。通過比較,最後決定使用python語言。 Python(英國發音:/ˈpaɪθən/美國發音:/ˈpaɪθɑːn/),是一
Win7下安裝Python影象處理庫PIL、pytesser、tesseract進行驗證碼識別
前言 今天看見一個關於Python進行驗證碼識別的文章,其中程式碼很短,但是感覺很有趣,加上最近也在學習一些簡單的Python知識,所以決定實驗一下 準備工作 PIL版本選擇 從網上搜索得知,PIL官方只有32位的安裝檔案,安裝時會提示找不到py
Python影象處理庫PIL的ImageEnhance模組介紹
一、ImageEnhance模組的介面所有的增強類都實現了一個通用的介面,包括一個方法:enhancer.enhance(factor) ⇒ image該方法返回一個增強過的影象。變數factor是一個浮點數,控制影象的增強程度。變數factor為1將返回原始影象的拷貝;fa
Python影象處理庫PIL的ImageOps模組介紹
(Newin 1.1.3)ImageOps模組包含了一些“ready-made”的影象處理操作。這個模組somewhatexperimental,大多數操作只工作在L和RGB影象上。 一、Image
Python影象處理庫PIL的基本概念介紹
這一節我們介紹一下PIL中的基本概念。 PIL中所涉及的基本概念有如下幾個:通道(bands)、模式(mode)、尺寸(size)、座標系統(coordinate system)、調色盤(palet
Python影象處理庫PIL的基本概念介紹(一)
Python 的數字影象處理 都是基於PIL庫開展的一系列操作所以有些基本概念我們需要清楚 PIL中所涉及的基本概念有如下幾個:通道(bands)、模式(mode)、尺寸(size)、座標系統(coordinate system)、調色盤(palette)、資