1. 程式人生 > >python 中PIL的用法

python 中PIL的用法

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?

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.BICUBICPIL.Image.LANCZOSPIL.Image.BILINEARPIL.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()