pythonPIL影像處理庫簡介(一)
1. Introduction
PIL(Python Image Library)是python的第三方影像處理庫,但是由於其強大的功能與眾多的使用人數,幾乎已經被認為是python官方影像處理庫了。其官方主頁為:PIL。 PIL歷史悠久,原來是隻支援python2.x的版本的,後來出現了移植到python3的庫pillow,pillow號稱是friendly fork for PIL
,其功能和PIL差不多,但是支援python3。本文主要介紹PIL那些最常用的特性與用法,主要參考自:http://www.effbot.org/imagingbook。
2. What PIL can do?
PIL可以做很多和影像處理相關的事情:
- 影像歸檔(Image Archives)。PIL非常適合於影像歸檔以及影像的批處理任務。你可以使用PIL建立縮圖,轉換影像格式,列印影像等等。
- 影像展示(Image Display)。PIL較新的版本支援包括Tk PhotoImage,BitmapImage還有Windows DIB等介面。PIL支援眾多的GUI框架介面,可以用於影像展示。
- 影像處理(Image Processing)。PIL包括了基礎的影像處理函式,包括對點的處理,使用眾多的卷積核(convolution kernels)做過濾(filter),還有顏色空間的轉換。PIL庫同樣支援影像的大小轉換,影像旋轉,以及任意的仿射變換。PIL還有一些直方圖的方法,允許你展示影像的一些統計特性。這個可以用來實現影像的自動對比度增強,還有全域性的統計分析等。
3. How to use PIL?
3.1 Image class
Image類是PIL中的核心類,你有很多種方式來對它進行初始化,比如從檔案中載入一張影像,處理其他形式的影像,或者是從頭創造一張影像等。下面是PIL Image類中常用的方法:
- open(filename,mode)(開啟一張影像)。下面的程式碼演示瞭如何從檔案開啟一張影像:
>>> from PIL import Image
>>> Image.open("dog.jpg","r")
<PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=296x299 at 0x7F62BDB5B0F0
>
>>> im = Image.open("dog.jpg","r")
>>> print(im.size,im.format,im.mode)
(296, 299) JPEG RGB
Image.open
返回一個Image物件,該物件有size,format,mode
等屬性,其中size
表示影像的寬度和高度(畫素表示);format
表示影像的格式,常見的包括JPEG,PNG等格式;mode
表示影像的模式,定義了畫素型別還有影像深度等,常見的有RGB,HSV等。一般來說`L`(luminance)表示灰度影像,`RGB`表示真彩影像,`CMYK`表示預先壓縮的影像。一旦你得到了開啟的Image物件之後,就可以使用其眾多的方法對影像進行處理了,比如使用im.show()
可以展示上面得到的影像。
- save(filename,format)(儲存指定格式的影像)
>>> im.save("dog.png",`png`)
上面的程式碼將影像重新儲存成png格式。
- thumbnail(size,resample)(建立縮圖)
>>> im.thumbnail((50,50),resample=Image.BICUBIC)
>>> im.show()
上面的程式碼可以建立一個指定大小(size)的縮圖,需要注意的是,thumbnail方法是原地操作,返回值是None。第一個引數是指定的縮圖的大小,第二個是取樣的,有Image.BICUBIC
,PIL.Image.LANCZOS
,PIL.Image.BILINEAR
,PIL.Image.NEAREST
這四種取樣方法。預設是Image.BICUBIC
。
- crop(box)(裁剪矩形區域)
>>> im = Image.open("dog.jpg","r")
>>> box = (100,100,200,200)
>>> region = im.crop(box)
>>> region.show()
im.crop()
上面的程式碼在im影像上裁剪了一個box矩形區域,然後顯示出來。box是一個有四個數字的元組(upper_left_x,upper_left_y,lower_right_x,lower_right_y),分別表示裁剪矩形區域的左上角x,y座標,右下角的x,y座標,規定影像的最左上角的座標為原點(0,0),寬度的方向為x軸,高度的方向為y軸,每一個畫素代表一個座標單位。crop()返回的仍然是一個Image物件。
- transpose(method)(影像翻轉或者旋轉)
>>> im_rotate_180 = im.transpose(Image.ROTATE_180)
>>> im_rotate_180.show()
上面的程式碼將im逆時針旋轉180°,然後顯示出來,method
是transpose的引數,表示選擇什麼樣的翻轉或者旋轉方式,可以選擇的值有:
– Image.FLIP_LEFT_RIGHT,表示將影像左右翻轉
– Image.FLIP_TOP_BOTTOM,表示將影像上下翻轉
– Image.ROTATE_90,表示將影像逆時針旋轉90°
– Image.ROTATE_180,表示將影像逆時針旋轉180°
– Image.ROTATE_270,表示將影像逆時針旋轉270°
– Image.TRANSPOSE,表示將影像進行轉置(相當於順時針旋轉90°)
– Image.TRANSVERSE,表示將影像進行轉置,再水平翻轉
- paste(region,box,mask)(將一個影像貼上到另一個影像)
>>> im.paste(region,(100,100),None)
>>> im.show()
上面的程式碼將region影像貼上到左上角為(100,100)的位置。region是要貼上的Image物件,box是要貼上的位置,可以是一個兩個元素的元組,表示貼上區域的左上角座標,也可以是一個四個元素的元組,表示左上角和右下角的座標。如果是四個元素元組的話,box的size必須要和region的size保持一致,否則將會被convert成和region一樣的size。
- split()(顏色通道分離)
>>> r,g,b = im.split()
>>> r.show()
>>> g.show()
>>> b.show()
split()方法可以原來影像的各個通道分離,比如對於RGB影像,可以將其R,G,B三個顏色通道分離。
- merge(mode,channels)(顏色通道合併)
>>> im_merge = Image.merge("RGB",[b,r,g])
>>> im_merge.show()
merge方法和split方法是相對的,其將多個單一通道的序列合併起來,組成一個多通道的影像,mode是合併之後影像的模式,比如”RGB”,channels是多個單一通道組成的序列。
- resize(size,resample,box)
>>> im_resize = im.resize((200,200))
>>> im_resize
<PIL.Image.Image image mode=RGB size=200x200 at 0x7F62B9E23470>
>>> im_resize.show()
>>> im_resize_box = im.resize((100,100),box = (0,0,50,50))
>>> im_resize_box.show()
resize方法可以將原始的影像轉換大小,size是轉換之後的大小,resample是重新取樣使用的方法,仍然有Image.BICUBIC
,PIL.Image.LANCZOS
,PIL.Image.BILINEAR
,PIL.Image.NEAREST
這四種取樣方法,預設是PIL.Image.NEAREST
,box是指定的要resize的影像區域,是一個用四個元組指定的區域(含義和上面所述box一致)。
- convert(mode,matrix,dither,palette,colors)(mode轉換)
>>> im_L = im.convert("L")
>>> im_L.show()
>>> im_rgb = im_L.convert("RGB")
>>> im_rgb.show()
>>> im_L.mode
`L`
>>> im_rgb.mode
`RGB`
convert方法可以改變影像的mode,一般是在`RGB`(真彩圖)、`L`(灰度圖)、`CMYK`(壓縮圖)之間轉換。上面的程式碼就是首先將影像轉化為灰度圖,再從灰度圖轉化為真彩圖。值得注意的是,從灰度圖轉換為真彩圖,雖然理論上確實轉換成功了,但是實際上是很難恢復成原來的真彩模式的(不唯一)。
- filter(filter)(應用過濾器)
>>> im = Image.open("dog.jpg","r")
>>> from PIL import ImageFilter
>>> im_blur = im.filter(ImageFilter.BLUR)
>>> im_blur.show()
>>> im_find_edges = im.filter(ImageFilter.FIND_EDGES)
>>> im_find_edges.show()
>>> im_find_edges.save("find_edges.jpg")
>>> im_blur.save("blur.jpg")
filter方法可以將一些過濾器操作應用於原始影像,比如模糊操作,查詢邊、角點操作等。filter是過濾器函式,在PIL.ImageFilter
函式中定義了大量內建的filter函式,比如BLUR
(模糊操作),GaussianBlur
(高斯模糊),MedianFilter
(中值過濾器),FIND_EDGES
(查詢邊)等。上面得到原始影像dog.jpg,find_edges.jpg以及blur.jpg從左到右如下圖1所示:
圖1 從左到右分別是:dog.jpg,find_edges.jpg以及blur.jpg
- point(lut,mode)(對影像畫素操作)
>>> im_point = im.point(lambda x:x*1.5)
>>> im_point.show()
>>> im_point.save("im_point.jpg")
point方法可以對影像進行單個畫素的操作,上面的程式碼對point方法傳入了一個匿名函式,表示將影像的每個畫素點大小都乘以1.5,mode是返回的影像的模式,預設是和原來影像的mode是一樣的。圖2是原來的dog.jpg和point操作之後的im_point.jpg之間的對比。
圖2 dog.jpg和point操作之後的im_point.jpg
下面是一個結合了point
函式,split
函式,paste
函式以及merge
函式的小例子。
>>> source = im.split()
>>> R,G,B = 0,1,2
>>> mask = source[R].point(lambda x: x<100 and 255)
>>> # x<100,return 255,otherwise return 0
>>> out_G = source[G].point(lambda x:x*0.7)
>>> # 將out_G貼上回來,但是隻保留`R`通道畫素值<100的部分
>>> source[G].paste(out_G,None,mask)
>>> # 合併成新的影像
>>> im_new = Image.merge(im.mode,source)
>>> im_new.show()
>>> im.show()
- ImageEnhance()(影像增強)
>>> from PIL import ImageEnhance
>>> brightness = ImageEnhanBce.Brightness(im)
>>> im_brightness = brightness.enhance(1.5)
>>> im_brightness.show()
>>> im_contrast = ImageEnhance.Contrast(im)
>>> im_contrast.enhance(1.5)
<PIL.Image.Image image mode=RGB size=296x299 at 0x7F62AE271AC8>
>>> im_contrast.enhance(1.5).show()
ImageEnhance是PIL下的一個子類,主要用於影像增強,比如增加亮度(Brightness),增加對比度(Contrast)等。上面的程式碼將原來影像的亮度增加50%,將對比度也增加了50%。
-
ImageSequence()(處理影像序列)
下面的程式碼可以遍歷gif影像中的所有幀,並分別儲存為影像
>>> from PIL import ImageSequence
>>> from PIL import Image
>>> gif = Image.open("pipixia.gif")
>>> for i,frame in enumerate(ImageSequence.Iterator(gif),1):
... if frame.mode == `JPEG`:
... frame.save("%d.jpg" %i)
... else:
... frame.save("%d.png" % i)
除了上面使用迭代器的方式以外,還可以一幀一幀讀取gif,比如下面的程式碼:
>>> index = 0
>>> while 1:
... try:
... gif.seek(index)
... gif.save("%d.%s" %(index,`jpg` if gif.mode == `JPEG` else `png`))
... index += 1
... except EOFError:
... print("Reach the end of gif sequence!")
... break
上面的程式碼在讀取到gif的最後一幀之後,會throw 一個 EOFError,所以我們只要捕獲這個異常就可以了。
熱愛程式設計,熱愛機器學習!
github:http://www.github.com/Lyrichu
github blog:http://Lyrichu.github.io
個人部落格站點:http://www.movieb2b.com(不再維護)
相關文章
- Python影像處理庫——PILPython
- 音訊處理開源庫webrtc(1)簡介音訊Web
- 6 款 Javascript 的影像處理庫JavaScript
- TensorFlow進行簡單的影像處理
- 基於Opencv的簡單影像處理OpenCV
- 影像處理--影像特效特效
- [影像處理] 基於CleanVision庫清洗影像資料集
- 影像處理基礎篇(一)
- Python影像處理丨5種影像處理特效Python特效
- webgl 影像處理2---影像畫素處理Web
- 圖形影像處理之簡單圖片
- Python 影像處理 OpenCV (6):影像的閾值處理PythonOpenCV
- Python 影像處理 OpenCV (7):影像平滑(濾波)處理PythonOpenCV
- 微處理器效能簡介(8086)
- Paddle Lite新增ARM端影像預處理庫
- 影像預處理
- 事件流處理 (ESP) 與 Kafka 簡介事件Kafka
- Python影像處理初探:Pillow庫的基礎使用Python
- 影象處理庫GPUImage簡單使用GPUUI
- 影像處理_切邊
- 前端影像處理指南前端
- 影像預處理方法
- OpenCV(影像NaN處理)OpenCVNaN
- 影像處理案例03
- 影像輪廓處理
- Simd庫——影像處理領域的CPU指令集加速庫
- Caffe簡單例程,影像處理,Netscope視覺化方法單例視覺化
- 【號外】6個最好用的Python影像處理庫!Python
- MPP(大規模並行處理)簡介並行
- 人工智慧--自然語言處理簡介人工智慧自然語言處理
- Python 影像處理 OpenCV (15):影像輪廓PythonOpenCV
- Python 影像處理 OpenCV (3):影像屬性、影像感興趣 ROI 區域及通道處理PythonOpenCV
- 【scipy 基礎】--影像處理
- 遙感影像處理流程
- 影像處理之骨架提取
- solidworks2022,影像處理Solid
- 形態學影像處理
- cdr2022,影像處理