亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Python > 正文

Python編程中使用Pillow來處理圖像的基礎教程

2020-01-04 17:55:48
字體:
來源:轉載
供稿:網友

這篇文章主要介紹了Python編程中使用Pillow來處理圖像的基礎教程,Pillow和PIL都是Python下十分強大的圖片處理利器,朋友可以參考下

安裝

剛接觸Pillow的朋友先來看一下Pillow的安裝方法,在這里我們以Mac OS環境為例:

(1)、使用 pip 安裝 Python 庫。pip 是 Python 的包管理工具,安裝后就可以直接在命令行一站式地安裝/管理各種庫了(pip 文檔)。

 

 
  1. $ wget http://pypi.python.org/packages/source/p/pip/pip-0.7.2.tar.gz 
  2.  
  3. $ tar xzf pip-0.7.2.tar.gz 
  4.  
  5. $ cd pip-0.7.2 
  6.  
  7. $ python setup.py install 

(2)、使用 pip 下載獲取 Pillow:

 

 
  1. $ pip install pillow 

(3)、安裝過程中命令行出現錯誤提示:”error: command ‘clang' failed with exit status 1”。上網查閱,發現需要通過 Xcode 更新 Command Line Tool。于是打開 Xcode->Preferences->Downloads-Components選項卡。咦?竟然沒了 Command Line Tools。再查,發現 Xcode 5 以上現在需要用命令行安裝:

 

 
  1. $ xcode-select —install 

系統會彈出安裝命令行工具的提示,點擊安裝即可。

此時再 pip install pillow,就安裝成功了。

pip freeze 命令查看已經安裝的 Python 包,Pillow 已經乖乖躺那兒了。

好了,下面開始進入教程~

Image類

Pillow中最重要的類就是Image,該類存在于同名的模塊中??梢酝ㄟ^以下幾種方式實例化:從文件中讀取圖片,處理其他圖片得到,或者直接創建一個圖片。

使用Image模塊中的open函數打開一張圖片:

 

 
  1. >>> from PIL import Image 
  2. >>> im = Image.open("lena.ppm"

如果打開成功,返回一個Image對象,可以通過對象屬性檢查文件內容

 

 
  1. >>> from __future__ import print_function 
  2. >>> print(im.format, im.size, im.mode) 

 

 
  1. PPM (512, 512) RGB 

format屬性定義了圖像的格式,如果圖像不是從文件打開的,那么該屬性值為None;size屬性是一個tuple,表示圖像的寬和高(單位為像素);mode屬性為表示圖像的模式,常用的模式為:L為灰度圖,RGB為真彩色,CMYK為pre-press圖像。

如果文件不能打開,則拋出IOError異常。

當有一個Image對象時,可以用Image類的各個方法進行處理和操作圖像,例如顯示圖片:

 

 
  1. >>> im.show() 

ps:標準版本的show()方法不是很有效率,因為它先將圖像保存為一個臨時文件,然后使用xv進行顯示。如果沒有安裝xv,該函數甚至不能工作。但是該方法非常便于debug和test。(windows中應該調用默認圖片查看器打開)

讀寫圖片

Pillow庫支持相當多的圖片格式。直接使用Image模塊中的open()函數讀取圖片,而不必先處理圖片的格式,Pillow庫自動根據文件決定格式。

Image模塊中的save()函數可以保存圖片,除非你指定文件格式,那么文件名中的擴展名用來指定文件格式。

圖片轉成jpg格式

 

 
  1. from __future__ import print_function 
  2. import os, sys 
  3. from PIL import Image 
  4.  
  5. for infile in sys.argv[1:]: 
  6. f, e = os.path.splitext(infile) 
  7. outfile = f + ".jpg" 
  8. if infile != outfile: 
  9. try
  10. Image.open(infile).save(outfile) 
  11. except IOError: 
  12. print("cannot convert", infile) 

save函數的第二個參數可以用來指定圖片格式,如果文件名中沒有給出一個標準的圖像格式,那么第二個參數是必須的。

創建縮略圖

 

 
  1. from __future__ import print_function 
  2. import os, sys 
  3. from PIL import Image 
  4.  
  5. size = (128, 128) 
  6.  
  7. for infile in sys.argv[1:]: 
  8. outfile = os.path.splitext(infile)[0] + ".thumbnail" 
  9. if infile != outfile: 
  10. try
  11. im = Image.open(infile) 
  12. im.thumbnail(size) 
  13. im.save(outfile, "JPEG"
  14. except IOError: 
  15. print("cannot create thumbnail for", infile) 

必須指出的是除非必須,Pillow不會解碼或raster數據。當你打開一個文件,Pillow通過文件頭確定文件格式,大小,mode等數據,余下數據直到需要時才處理。

這意味著打開文件非??欤c文件大小和壓縮格式無關。下面的程序用來快速確定圖片屬性:

確定圖片屬性

 

 
  1. from __future__ import print_function 
  2. import sys 
  3. from PIL import Image 
  4.  
  5. for infile in sys.argv[1:]: 
  6. try
  7. with Image.open(infile) as im: 
  8. print(infile, im.format, "%dx%d" % im.size, im.mode) 
  9. except IOError: 
  10. pass 

裁剪、粘貼、與合并圖片

Image類包含還多操作圖片區域的方法。如crop()方法可以從圖片中提取一個子矩形

從圖片中復制子圖像

 

 
  1. box = im.copy() #直接復制圖像 
  2. box = (100, 100, 400, 400) 
  3. region = im.crop(box) 

區域由4-tuple決定,該tuple中信息為(left, upper, right, lower)。 Pillow左邊系統的原點(0,0)為圖片的左上角。坐標中的數字單位為像素點,所以上例中截取的圖片大小為300*300像素^2。

處理子圖,粘貼回原圖

 

 
  1. region = region.transpose(Image.ROTATE_180) 
  2. im.paste(region, box) 

將子圖paste回原圖時,子圖的region必須和給定box的region吻合。該region不能超過原圖。而原圖和region的mode不需要匹配,Pillow會自動處理。

另一個例子

 

 
  1. Rolling an image 
  2.  
  3. def roll(image, delta): 
  4. "Roll an image sideways" 
  5.  
  6. image = image.copy() #復制圖像 
  7. xsize, ysize = image.size 
  8.  
  9. delta = delta % xsize 
  10. if delta == 0: return image 
  11.  
  12. part1 = image.crop((0, 0, delta, ysize)) 
  13. part2 = image.crop((delta, 0, xsize, ysize)) 
  14. image.paste(part2, (0, 0, xsize-delta, ysize)) 
  15. image.paste(part1, (xsize-delta, 0, xsize, ysize)) 
  16.  
  17. return image 

分離和合并通道

 

 
  1. r, g, b = im.split() 
  2. im = Image.merge("RGB", (b, g, r)) 

對于單通道圖片,split()返回圖像本身。為了處理單通道圖片,必須先將圖片轉成RGB。

幾何變換

Image類有resize()、rotate()和transpose()、transform()方法進行幾何變換。

簡單幾何變換

 

 
  1. out = im.resize((128, 128)) 
  2. out = im.rotate(45) # 順時針角度表示 

置換圖像

 

 
  1. out = im.transpose(Image.FLIP_LEFT_RIGHT) 
  2. out = im.transpose(Image.FLIP_TOP_BOTTOM) 
  3. out = im.transpose(Image.ROTATE_90) 
  4. out = im.transpose(Image.ROTATE_180) 
  5. out = im.transpose(Image.ROTATE_270) 

transpose()和象的rotate()沒有性能差別。

更通用的圖像變換方法可以使用transform()

模式轉換

convert()方法

模式轉換

 

 
  1. im = Image.open('lena.ppm').convert('L'

圖像增強

Filter

ImageFilter模塊包含很多預定義的增強filters,通過filter()方法使用

應用filters

 

 
  1. from PIL import ImageFilter 
  2. out = im.filter(ImageFilter.DETAIL)  

像素點處理

point()方法通過一個函數或者查詢表對圖像中的像素點進行處理(例如對比度操作)。

像素點變換

 

 
  1. # multiply each pixel by 1.2 
  2. out = im.point(lambda i: i * 1.2) 

上述方法可以利用簡單的表達式進行圖像處理,通過組合point()和paste()還能選擇性地處理圖片的某一區域。

處理單獨通道

 

 
  1. # split the image into individual bands 
  2. source = im.split() 
  3.  
  4. R, G, B = 0, 1, 2 
  5.  
  6. # select regions where red is less than 100 
  7. mask = source[R].point(lambda i: i < 100 and 255) 
  8.  
  9. # process the green band 
  10. out = source[G].point(lambda i: i * 0.7) 
  11.  
  12. # paste the processed band back, but only where red was < 100 
  13. source[G].paste(out, None, mask) 
  14.  
  15. # build a new multiband image 
  16. im = Image.merge(im.mode, source) 

注意到創建mask的語句:

 

 
  1. mask = source[R].point(lambda i: i < 100 and 255) 

該句可以用下句表示

 

 
  1. imout = im.point(lambda i: expression and 255) 

如果expression為假則返回expression的值為0(因為and語句已經可以得出結果了),否則返回255。(mask參數用法:當為0時,保留當前值,255為使用paste進來的值,中間則用于transparency效果)

高級圖片增強

對其他高級圖片增強,應該使用ImageEnhance模塊 。一旦有一個Image對象,應用ImageEnhance對象就能快速地進行設置。 可以使用以下方法調整對比度、亮度、色平衡和銳利度。

圖像增強

 

 
  1. from PIL import ImageEnhance 
  2.  
  3. enh = ImageEnhance.Contrast(im) 
  4. enh.enhance(1.3).show("30% more contrast"

動態圖

Pillow支持一些動態圖片的格式如FLI/FLC,GIF和其他一些處于實驗階段的格式。TIFF文件同樣可以包含數幀圖像。

當讀取動態圖時,PIL自動讀取動態圖的第一幀,可以使用seek和tell方法讀取不同幀。

 

 
  1. from PIL import Image 
  2.  
  3. im = Image.open("animation.gif"
  4. im.seek(1) # skip to the second frame 
  5.  
  6. try
  7. while 1: 
  8. im.seek(im.tell()+1) 
  9. # do something to im 
  10. except EOFError: 
  11. pass # end of sequence 

當讀取到最后一幀時,Pillow拋出EOFError異常。

當前版本只允許seek到下一幀。為了倒回之前,必須重新打開文件。

或者可以使用下述迭代器類

動態圖迭代器類

 

 
  1. class ImageSequence: 
  2. def __init__(self, im): 
  3. self.im = im 
  4. def __getitem__(self, ix): 
  5. try
  6. if ix: 
  7. self.im.seek(ix) 
  8. return self.im 
  9. except EOFError: 
  10. raise IndexError # end of sequence 
  11.  
  12. for frame in ImageSequence(im): 
  13. # ...do something to frame... 
  14. Postscript Printing 

Pillow允許通過Postscript Printer在圖片上添加images、text、graphics。

 

 
  1. Drawing Postscript 
  2.  
  3. from PIL import Image 
  4. from PIL import PSDraw 
  5.  
  6. im = Image.open("lena.ppm"
  7. title = "lena" 
  8. box = (1*72, 2*72, 7*72, 10*72) # in points 
  9.  
  10. ps = PSDraw.PSDraw() # default is sys.stdout 
  11. ps.begin_document(title) 
  12.  
  13. # draw the image (75 dpi) 
  14. ps.image(box, im, 75) 
  15. ps.rectangle(box) 
  16.  
  17. # draw centered title 
  18. ps.setfont("HelveticaNarrow-Bold", 36) 
  19. w, h, b = ps.textsize(title) 
  20. ps.text((4*72-w/2, 1*72-h), title) 
  21.  
  22. ps.end_document() 

更多讀取圖片方法

之前說到Image模塊的open()函數已經足夠日常使用。該函數的參數也可以是一個文件對象。

從string中讀取

 

 
  1. import StringIO 
  2.  
  3. im = Image.open(StringIO.StringIO(buffer)) 

從tar文件中讀取

 

 
  1. from PIL import TarIO 
  2.  
  3. fp = TarIO.TarIO("Imaging.tar""Imaging/test/lena.ppm"
  4. im = Image.open(fp) 

草稿模式

draft()方法允許在不讀取文件內容的情況下盡可能(可能不會完全等于給定的參數)地將圖片轉成給定模式和大小,這在生成縮略圖的時候非常有效(速度要求比質量高的場合)。

draft模式

 

 
  1. from __future__ import print_function 
  2. im = Image.open(file) 
  3. print("original =", im.mode, im.size) 
  4.  
  5. im.draft("L", (100, 100)) 
  6. print("draft =", im.mode, im.size) 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产一区二区三区在线观看视频| 欧美成人第一页| 亚洲国产日韩欧美在线99| 精品一区二区三区电影| 国语自产精品视频在线看抢先版图片| 国内精品在线一区| 亚洲天堂成人在线视频| 懂色av中文一区二区三区天美| 欧美成人性色生活仑片| 黑人与娇小精品av专区| 色婷婷亚洲mv天堂mv在影片| 欧美一级视频一区二区| 成人黄色av免费在线观看| 国产一区二区在线免费视频| 亚洲最大成人网色| 高清在线视频日韩欧美| 中文国产成人精品久久一| 91精品国产自产在线老师啪| 国产精品情侣自拍| 日韩免费不卡av| 国产精品免费久久久久久| 91色视频在线观看| 亚洲美女福利视频网站| 国产日韩欧美综合| 91精品国产乱码久久久久久久久| 日韩欧美精品网址| 欧美日本亚洲视频| 在线色欧美三级视频| 欧美在线视频观看免费网站| 精品人伦一区二区三区蜜桃网站| 国产精品久久久久99| 国产精品成人av在线| 国产精品电影网| 亚洲国产一区二区三区四区| 国产性猛交xxxx免费看久久| 亚洲肉体裸体xxxx137| 91中文字幕在线观看| 日韩免费看的电影电视剧大全| 亚洲桃花岛网站| 4k岛国日韩精品**专区| 国产精品白丝jk喷水视频一区| 亚洲va久久久噜噜噜| 亚洲视频在线观看视频| 欧美乱大交xxxxx另类电影| 亚洲国产精品一区二区三区| 青草热久免费精品视频| 欧美电影免费观看网站| 久久久久一本一区二区青青蜜月| 亚洲第一中文字幕在线观看| 亚洲国产美女精品久久久久∴| 欧美黑人xxxx| 国产香蕉一区二区三区在线视频| 毛片精品免费在线观看| 97精品一区二区视频在线观看| 538国产精品一区二区免费视频| 亚洲国产精品久久91精品| 亚洲美女精品成人在线视频| 欧美久久精品一级黑人c片| 亚洲理论片在线观看| 欧美国产欧美亚洲国产日韩mv天天看完整| 亚洲网站在线看| 国自产精品手机在线观看视频| 国产欧美一区二区三区久久| 欧美性猛交xxxx富婆弯腰| 亚洲激情视频在线播放| 奇米成人av国产一区二区三区| 欧美人与性动交| 亚洲第一网站免费视频| 丝袜美腿精品国产二区| 日韩精品在线观看一区二区| 97国产精品视频| www.xxxx精品| 国产亚洲精品成人av久久ww| 国产在线视频2019最新视频| 亚洲国产精彩中文乱码av在线播放| 亚洲免费电影一区| 亚洲男人第一av网站| 欧美裸体男粗大视频在线观看| 欧美成人性生活| 国产欧美日韩中文字幕在线| 麻豆一区二区在线观看| 青草青草久热精品视频在线网站| 欧美成人免费全部| 国产精品观看在线亚洲人成网| 成人欧美一区二区三区在线湿哒哒| 亚洲欧美资源在线| 日韩欧美中文字幕在线观看| 国产日韩精品一区二区| 欧美与黑人午夜性猛交久久久| 人九九综合九九宗合| 亚洲欧洲午夜一线一品| 日本国产精品视频| 91po在线观看91精品国产性色| 欧美大尺度电影在线观看| 久久久久久成人精品| 91免费视频网站| 久久国产精品影片| 国产精品亚洲第一区| 日韩在线免费视频| 久久伊人色综合| 久久免费国产精品1| 国产在线观看一区二区三区| 国产精品99久久久久久白浆小说| 国外成人在线播放| 日韩乱码在线视频| 国产精品极品在线| 国产精品久久婷婷六月丁香| 国产精品亚洲综合天堂夜夜| 国产精品自拍网| 亚洲国产小视频| 精品国产一区二区三区久久久| 成人av.网址在线网站| 亚洲成av人乱码色午夜| 国产丝袜精品视频| 一区二区三区久久精品| 一区二区在线视频播放| 久久99久久99精品免观看粉嫩| 亚洲变态欧美另类捆绑| 亚洲国产成人爱av在线播放| 亚洲美女精品久久| 亚洲一区二区三区乱码aⅴ蜜桃女| 日本免费久久高清视频| 国产一区视频在线播放| 国产精品免费视频久久久| 国产亚洲欧美日韩一区二区| 亚洲天堂av在线播放| 国产亚洲欧美日韩美女| 91国产美女在线观看| 伊人久久男人天堂| 亚洲福利在线观看| 中文字幕亚洲天堂| 久久久久中文字幕2018| 亚洲欧洲午夜一线一品| 亚洲无亚洲人成网站77777| 日韩av快播网址| 亚洲精品视频在线播放| 欧美精品在线免费观看| 欧美高清在线观看| 黑人狂躁日本妞一区二区三区| 国产精品一二区| 久久精彩免费视频| 亚洲精品v欧美精品v日韩精品| 亚洲欧美精品伊人久久| 欧美日本啪啪无遮挡网站| 91精品国产高清自在线看超| 成人精品一区二区三区| 欧美成人精品不卡视频在线观看| 国产精品一区二区性色av| 久久在线免费视频| 日韩在线观看网址| 亚洲国产精品成人一区二区| 精品中文字幕乱| 欧美午夜丰满在线18影院| 亚洲电影免费观看高清| 欧美激情视频一区二区| 亚洲欧美国产日韩中文字幕| 成人免费视频a| 国产亚洲精品91在线| 国产精品视频白浆免费视频| 久久国产精品久久国产精品| 国产精品扒开腿做| 欧美二区乱c黑人| 国产精品视频在线播放| 国产成人一区二区在线|