图像处理Pillow详解
一. Pillow簡介
? ? ? ?Pillow作為python的第三方圖像處理庫,提供了廣泛的文件格式支持,強大的圖像處理能力,主要包括圖像儲存、圖像顯示、格式轉換以及基本的圖像處理操作等。
? ? ? ?PIL(Python Image Library)是python的第三方圖像處理庫,因其強大的功能與眾多的使用人數,但由于PIL僅支持到Python 2.7,于是一群志愿者在PIL的基礎上創建了兼容的版本,名字叫Pillow,支持最新Python 3.x,又加入了許多新特性,因此,我們可以直接安裝使用Pillow。
需要在命令行下通過pip安裝:
? ? ?pip install Pillow
二. Pillow的基本操作
? ? ? Pillow中最重要的類是Image,可以通過這個類讀取和處理圖像,還可以創建圖像。
1.使用Image模塊中的open函數打開一張圖片:
from PIL import Image # 打開一個jpg圖像文件,注意是當前路徑: im = Image.open('cat.jpg')如果成功,這個函數返回Image對象。您現在可以使用實例屬性來檢查文件內容:
- print(im.format, im.size, im.mode) JPEG (1920, 1200) RGB
format 定義圖像的格式,屬為圖像來源。如果不是從文件讀取就是None。
size屬性是一個元組,表示圖像的寬度和高度(單位為像素)。
mode屬性表示圖像的模式,定義了圖像中波段的數量和名稱,以及像素類型和深度。常見模式為灰度圖像為“L”(亮度),真彩色圖像為“RGB”,印刷四色為“CMYK”。
如果文件不能打開,則拋出IOError異常。
當有一個Image對象時,就可以利用它來處理操作圖像,例如,加載一張圖像
- im.show()
2.保存指定格式的圖像
save(filename,format) :
- im.save('dog.jpg','png')
上面的代碼將圖像重新保存成png格式
3.圖片轉成jpg格式
- from __future__ import print_function
- import os, sys
- from PIL import Image
- for infile in sys.argv[1:]:
- ? ? f, e = os.path.splitext(infile)
- ? ? outfile = f + ".jpg"
- ? ? if infile != outfile:
- ? ? ? ? try:
- ? ? ? ? ? ? Image.open(infile).save(outfile)
- ? ? ? ? except IOError:
- ? ? ? ? ? ? print("cannot convert", infile)
?
save函數的第二個參數可以用來指定圖片格式,如果文件名中沒有給出一個標準的圖像格式,那么第二個參數是必須的。
4.剪裁矩形區域 crop(box)
box是一個有四個數字的元組(upper_left_x,upper_left_y,lower_right_x,lower_right_y),分別表示裁剪矩形區域的左上角x,y坐標,右下角的x,y坐標,規定圖像的最左上角的坐標為原點(0,0),寬度的方向為x軸,高度的方向為y軸,每一個像素代表一個坐標單位。
crop()返回的仍然是一個Image對象。
?
- im = Image.open("cat.jpg","r")
- box = (300,300,800,800)
- region = im.crop(box)
- region.show()
- im.crop()
5.圖像粘貼 paste(region,box,mask)
region是要粘貼的Image對象,box是要粘貼的位置,可以是一個兩個元素的元組,表示粘貼區域的左上角坐標,也可以是一個四個元素的元組,表示左上角和右下角的坐標。如果是四個元素元組的話,box的size必須要和region的size保持一致,否則將會被convert成和region一樣的size。
- im.paste(region,(100,100),None)
- im.show()
上面的代碼將region圖像粘貼到左上角為(100,100)的位置,效果如圖所示:
6.生成縮略圖?thumbnail(size,resample)
thumbnail可以創建一個指定大小(size)的縮略圖,需要注意的是,thumbnail方法是原地操作,返回值是None。第一個參數是指定的縮略圖的大小,第二個是采樣的,有Image.BICUBIC,PIL.Image.LANCZOS,PIL.Image.BILINEAR,PIL.Image.NEAREST這四種采樣方法。默認是Image.BICUBIC。
- im.thumbnail((200,200),resample=Image.BICUBIC)
- im.show()
上面的代碼形成了一個200×200的縮略圖。
7.動態圖
Pillow支持一些動態圖片的格式如FLI/FLC,GIF和其他一些處于實驗階段的格式。TIFF文件同樣可以包含數幀圖像。
當讀取動態圖時,PIL自動讀取動態圖的第一幀,可以使用seek和tell方法讀取不同幀。
- from PIL import Image
- im = Image.open("animation.gif")
- im.seek(1) # skip to the second frame
- try:
- ? ? while 1:
- ? ? ? ? im.seek(im.tell()+1)
- ? ? ? ? # do something to im
- except EOFError:
- ? ? pass # end of sequence
當讀取到最后一幀時,Pillow拋出EOFError異常。
或者可以使用下述迭代器類
動態圖迭代器類
class ImageSequence:def __init__(self, im):self.im = imdef __getitem__(self, ix):try:if ix:self.im.seek(ix)return self.imexcept EOFError:raise IndexError # end of sequencefor frame in ImageSequence(im):# ...do something to frame...- class ImageSequence:
- ? ? def __init__(self, im):
- ? ? ? ? self.im = im
- ? ? def __getitem__(self, ix):
- ? ? ? ? try:
- ? ? ? ? ? ? if ix:
- ? ? ? ? ? ? ? ? self.im.seek(ix)
- ? ? ? ? ? ? return self.im
- ? ? ? ? except EOFError:
- ? ? ? ? ? ? raise IndexError # end of sequence
- for frame in ImageSequence(im):
- ? ? # ...do something to frame...
- ?
8.旋轉和翻轉?transpose(method)
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,表示將圖像進行轉置,再水平翻轉
- im_rotate_180 = im.transpose(Image.ROTATE_180)
- im_rotate_180.show()
上面的代碼將im逆時針旋轉180°,然后顯示出來。
9.分離和合并通道
- r, g, b = im.split()
- im = Image.merge("RGB", (b, g, r))
?
分離 im.split() ??
合并 Image.merge(mode,channels),?將多個單一通道的序列合并起來,組成一個多通道的圖像,mode是合并之后圖像的模式,比如"RGB",channels是多個單一通道組成的序列。
對于單通道圖片,split()返回圖像本身。為了處理單通道圖片,必須先將圖片轉成RGB。
?10.顏色模式轉換
convert(mode,matrix,dither,palette,colors)
convert方法可以改變圖像的模式(mode),一般是在'RGB'(真彩圖)、'L'(灰度圖)、'CMYK'(壓縮圖)之間轉換。
- im_L = im.convert ("L")
- im_L .show()
上面的代碼就是將圖像轉化為灰度圖。
11.圖像過濾器 filter(filter)
filter方法可以將一些過濾器操作應用于原始圖像,比如模糊,邊緣增強、浮雕等。filter是過濾器函數,在PIL.ImageFilter函數中定義了大量內置的filter函數,比如BLUR(普通模糊),GaussianBlur(高斯模糊) FIND_EDGES(查找邊)等
- from PIL import Image ImageFilterim = Image.open('cat.jpg') # 高斯模糊 im_gaussianblur = im.filter(ImageFilter.GaussianBlur) im_gaussianblur.show() # 普通模糊 im_blur = im.filter(ImageFilter.BLUR) im_blur.show() # 找到邊緣 im_find_edge = im.filter(ImageFilter.FIND_EDGES) im_find_edges.show() # 浮雕 im_emboss = im.filter(ImageFilter.EMBOSS) im_emboss.show() # 輪廓 im_contour = im.filter(ImageFilter.CONTOUR) im_contour.show() # 銳化 im_sharpen = im.filter(ImageFilter.SHARPEN) im_sharpen.show() # 平滑 im_smooth = im.filter(ImageFilter.SMOOTH) im_smooth.show() # 細節 im_detail = im.filter(ImageFilter.DETAIL) im_detail.show()
12.圖像增強ImageEnhance()
圖像增強也是圖像預處理中的一個基本技術,Pillow中的圖像增強函數主要在ImageEnhance模塊下,通過該模塊可以調節圖像的白平衡(Color)、亮度(Brightness)、對比度(Contrast)和銳化(Sharpness)等。
- from PIL import Image
- Enhancebrightness = ImageEnhance.Brightness(im)
- im_brightness = brightness.enhance(1.5)
- im_brightness.show()
上面的代碼將原來圖像的亮度增加50%。
?
引自:
https://www.cnblogs.com/apexchu/p/4231041.html
https://mp.weixin.qq.com/s?src=11×tamp=1585214122&ver=2240&signature=BHuFEUhr8HEwHiNZG-S*iCQUpk84VDicpf7KDhrBQsFZwIowA*WO3FOfAOVY8P2EG7XvnMwumSfKfohjFAfc98fWrUzmb*jf3Xrsoa-W0WEgMV*KZisI5YvhtCPPCjxp&new=1
感謝!
??
總結
以上是生活随笔為你收集整理的图像处理Pillow详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 折半查找python实现
- 下一篇: 希尔排序python实现