上節咱們講了 Python 的圖像處理庫 PIL 的基本圖像處理功能,打開了 PIL 的神祕面紗。這節咱們接着講 PIL 的 Image 模塊的經常使用方法。bash
Image.convert(mode=None, matrix=None, dither=None, palette=0, colors=256)函數
參數說明:網站
轉換圖片模式,它支持每種模式轉換爲"L" 、 "RGB"和 "CMYK"。 有 matrix 參數只能轉換爲"L" 或 "RGB"。 當模式之間不能轉換時,能夠先轉換 RGB 模式,而後在轉換。 色彩模式轉換爲 L 模式計算公式 以下:ui
L = R * 299/1000 + G * 587/1000 + B * 114/1000spa
咱們通常使用時,只用傳須要轉換的 mode 便可,其餘的可選參數須要先理解圖片深層次的原理後才能夠理解,你們若是感興趣能夠去深刻了解一下。下面咱們來看一個簡單實例:code
from PIL import Image
im = Image.open('cat.png')
im.show()
# 將圖像轉換成黑白色並返回新圖像
im1 = im.convert('L')
im1.show()
複製代碼
咱們將一個圖像轉換成 L模式(灰色),轉換結果以下圖所示:cdn
Image.copy()對象
複製圖像方法,該方法徹底複製一個如出一轍的圖像,很好理解,咱們就不舉例說明了。blog
Image.crop(box)索引
參數說明:
該方法從圖像中獲取 box 矩形區域的圖像,至關於從圖像中摳一個矩形區域出來。咱們來看例子:
from PIL import Image
im = Image.open('cat.jpg')
print(im.size)
im.show()
# 定義了圖像的座標位置,從左、上、右、下
box = (100, 100, 250, 250)
# 它會從左上角開始,同時向下和向右移動100像素的位置開始截取250-100的像素寬高,也就是150x150的圖像
# 這裏注意後兩個數值要大於前兩個數值,否則截取後的圖像寬高爲負數,會報錯
region = im.crop(box)
print(region.size)
region.show()
# 輸出結果
(451, 300)
(150, 150)
複製代碼
咱們從 cat.jpg 這張圖片中截取了 150x150 的圖像,從打印結果能夠看到截取前和截取後的圖像大小。兩張圖像的對好比下圖:
Image.filter(filter)
參數說明:
使用給定的篩選器篩選此圖像。有關可用篩選器的列表:
篩選器名稱 | 說明 |
---|---|
BLUR | 模糊濾波,處理以後的圖像會總體變得模糊。 |
CONTOUR | 輪廓濾波,將圖像中的輪廓信息所有提取出來。 |
DETAIL | 細節加強濾波,會使得圖像中細節更加明顯。 |
EDGE_ENHANCE | 邊緣加強濾波,突出、增強和改善圖像中不一樣灰度區域之間的邊界和輪廓的圖像加強方法。 |
EDGE_ENHANCE_MORE | 深度邊緣加強濾波,會使得圖像中邊緣部分更加明顯。 |
EMBOSS | 浮雕濾波,會使圖像呈現出浮雕效果。 |
FIND_EDGES | 尋找邊緣信息的濾波,會找出圖像中的邊緣信息。 |
SHARPEN | 銳化濾波,補償圖像的輪廓,加強圖像的邊緣及灰度跳變的部分,使圖像變得清晰。 |
SMOOTH | 平滑濾波,突出圖像的寬大區域、低頻成分、主幹部分或抑制圖像噪聲和干擾高頻成分,使圖像亮度平緩漸變,減少突變梯度,改善圖像質量。 |
SMOOTH_MORE | 深度平滑濾波,會使得圖像變得更加平滑。 |
看到這些,你們是否是聯想到咱們手機上一些 APP 的圖像處理功能了,其實那些功能的實現方式跟咱們這裏講的方法是同樣的。咱們來看個例子:
from PIL import Image
from PIL import ImageFilter
im = Image.open('flower.jpg')
im.show()
# 模糊
im2 = im.filter(ImageFilter.BLUR)
im2.show()
# 輪廓濾波
im3 = im.filter(ImageFilter.CONTOUR)
im3.show()
# 細節加強
im4 = im.filter(ImageFilter.DETAIL)
im4.show()
複製代碼
咱們分別對原圖了使用了模糊濾波、輪廓濾波、細節加強濾波的處理,你們運行程序就能夠看處處理後的效果了,以下圖所示:
Image.getbands()
返回一個包含此圖像中每一個通道名稱的元組。直接看實例:
from PIL import Image
# 打開圖像
im = Image.open('cat.jpg')
# 建立新圖像
im1 = Image.new('L', (450, 450), 50)
# 獲取圖像的通道名稱元組
print(im.getbands())
print(im1.getbands())
# 輸出結果
('R', 'G', 'B')
('L',)
複製代碼
上例中,咱們分別打開一個 RGB 圖像和建立一個 L 模式的新圖像,而後打印輸出他們的通道名稱。
Image.getbbox()
計算圖像中非零區域的邊界框。將邊界框做爲定義左、上、右和下像素座標的四元組返回。咱們來看例子:
from PIL import Image
# 打開圖像(451x300)
im = Image.open('cat.jpg')
# 建立新圖像(450x450)
im1 = Image.new('L', (450, 450), 50)
# 打印圖像中非零區域的邊界框
print(im.getbbox())
print(im1.getbbox())
# 輸出結果
(0, 0, 451, 300)
(0, 0, 450, 450)
複製代碼
這個方法很簡單,很容易理解,那麼這個方法有什麼用處呢?最直接的一個用處就是迅速地獲取圖像的邊界座標。
Image.getcolors(maxcolors=256)
參數說明:
獲取圖像中顏色的使用列表,超過 maxcolors 設置值返回 None 。 返回值爲 (count, pixel) 的列表,表示(出現的次數,像素的值)
from PIL import Image
im = Image.open('cat.png')
# 將彩色圖像轉換成灰度圖
im2 = im.convert("L")
# 打印灰度圖的顏色列表,返回的點數超過maxcolors就直接返回None
print(im2.getcolors(maxcolors=200))
print(im2.getcolors(maxcolors=255))
# 輸出結果
None
[(1, 0), (69, 1), (275, 2), (518, 3), (165, 4), ... (6, 250), (1, 251)]
複製代碼
咱們這個圖像有252個像素值,因此第一次 maxcolors 設置爲200時,因爲 252>200,因此返回了 None。第二次設置255時,正常返回。
Image.getdata(band=None)
參數:
獲取圖像中每一個像素的通道對象元組,像素獲取從左至右,從上至下。
Image.getextrema()
獲取圖像中每一個通道的最小值與最大值。對於單波段圖像,包含最小和最大像素值的2元組。對於多波段圖像,每一個波段包含一個2元組的元組。
Image.getpixel(xy)
參數:
經過傳入座標返回像素值。若是圖像是多層圖像,則此方法返回元組。
Image.point(lut, mode=None)
參數說明:
lut:一個查找表,包含圖像中每一個波段的256個(或65536個,若是 self.mode==「I」 和 mode==「L」)值。能夠改用函數,它應採用單個參數。對每一個可能的像素值調用一次函數,結果表將應用於圖像的全部帶區。
mode:輸出模式(默認與輸入相同)。只有當源圖像具備模式 「L」 或 「P」 ,而且輸出具備模式 「1」 或源圖像模式爲 「I」 ,而且輸出模式爲 「L」 時,才能使用此選項。
對圖像的的每一個像素點進行操做,返回圖像的副本。
from PIL import Image
im = Image.open('cat.png')
# 調整灰色圖像的對比度
im_point=im.convert('L').point(lambda i: i < 80 and 255)
im_point.show()
source = im.split()
# 三通道分別處理對比度
band_r = source[0].point(lambda i: i < 80 and 255)
band_g = source[1].point(lambda i: i < 80 and 255)
band_b = source[2].point(lambda i: i < 80 and 255)
band_r.show()
band_g.show()
band_b.show()
複製代碼
在例子中,咱們先將圖像轉換成 L 模式,而後調整對比度,以及將圖像的三個通道分別調整對比度。所謂調整對比度,咱們這個例子的規則就是當像素值小於80時,將其調整爲255,至關於將接近黑色的像素點加黑,使其與淺色對比更明顯。運行效果以下圖:
Image.resize(size, resample=0, box=None)
參數說明:
這個方法是獲取調整大小後的圖片。通俗地講就是在原圖中摳一個矩形區域(若是傳入了 box 參數),而後對摳出來的區域進行濾波處理(若是傳入了 resample 參數),最後以指定的 size 大小進行返回。
from PIL import Image
im = Image.open('flower.jpg')
img1 = im.resize((250, 250), Image.BILINEAR)
img2 = im.resize((250, 250), Image.BICUBIC)
img3 = im.resize((250, 250), Image.NEAREST)
im.show()
img1.show()
img2.show()
img3.show()
複製代碼
這幾個濾波器的具體的原理比較理論,你們對照着程序運行返回自行去深刻了解。
關於 PIL 的 Image 模塊的方法咱們只講這麼多,還有好多其餘方法,你們可參照 www.osgeo.cn/pillow/refe… 這個網站去嘗試。
咱們講的 PIL 的 Image 模塊只是 PIL 的一個基礎模塊而已,它還有好多其餘的模塊,諸如 ImageChops (通道操做模塊)、ImageColor (顏色轉換模塊)、ImageDraw (二維圖形模塊)等,你們在須要的時候能夠去查找 API 使用。
pillow 庫是一個很是強大的基礎圖像處理庫,若不深刻圖像處理,運用這個庫裏面的方法組合,對圖像進行各類常見的操做已經夠用,這是計算機圖片識別的基礎。固然,若是須要更專業的操做,那麼就直接上 opencv 吧。