99热99这里只有精品6国产,亚洲中文字幕在线天天更新,在线观看亚洲精品国产福利片 ,久久久久综合网

歡迎加入QQ討論群258996829
麥子學(xué)院 頭像
蘋(píng)果6袋
6
麥子學(xué)院

Python學(xué)習(xí)之使用Pillow(PIL)進(jìn)行圖像操作方法詳解

發(fā)布時(shí)間:2017-07-10 12:17  回復(fù):0  查看:3656   最后回復(fù):2017-07-10 12:17  

本文和大家分享的主要是python中使用Pillow(PIL)對(duì)圖像操作相關(guān)內(nèi)容,一起來(lái)看看吧,希望對(duì)大家學(xué)習(xí)python有所幫助。

  顏色與RGBA

  計(jì)算機(jī)通常將圖像表示為RGB值,或者再加上alpha值(通透度,透明度),稱為RGBA值。在Pillow中,RGBA的值表示為由4個(gè)整數(shù)組成的元組,分別是R、G、BA。整數(shù)的范圍0~255。RGB0就可以表示黑色,全255代表黑色。可以猜測(cè)(255, 0, 0, 255)代表紅色,因?yàn)?/span>R分量最大,G、B分量為0,所以呈現(xiàn)出來(lái)是紅色。但是當(dāng)alpha值為0時(shí),無(wú)論是什么顏色,該顏色都不可見(jiàn),可以理解為透明。

  from PIL import ImageColor

  print(ImageColor.getcolor('red', 'RGBA'))# 也可以只以RBG的方式查看

  print(ImageColor.getcolor('black', 'RGB'))

  (255, 0, 0, 255)

  (0, 0, 0)

  圖像的坐標(biāo)表示

  圖像中 左上角 是坐標(biāo)原點(diǎn)(0, 0),這和平常數(shù)學(xué)里的坐標(biāo)系不太一樣。這樣定義的坐標(biāo)系意味著,X軸是從左到右增長(zhǎng)的,而Y軸是從上到下增長(zhǎng)。

  在Pillow中如何使用上述定義的坐標(biāo)系表示一塊矩形區(qū)域?許多函數(shù)或方法要求提供一個(gè)矩形元組參數(shù)。元組參數(shù)包含四個(gè)值,分別代表矩形四條邊的距離X軸或者Y軸的距離。順序是(左,頂,右,底) 。右和底坐標(biāo)稍微特殊,表示直到但不包括??梢岳斫鉃?/span> [)  [頂, 底) 這樣左閉右開(kāi)的區(qū)間。比如(3, 2, 8, 9)就表示了橫坐標(biāo)范圍[3, 7];縱坐標(biāo)范圍[2, 8]的矩形區(qū)域。

  使用Pillow操作圖像

  了解了一些基礎(chǔ)知識(shí),可以上手了。首先從讀取圖片開(kāi)始,很多圖像處理庫(kù)(如opencv)都以imread() 讀取圖片。Pillow中使用 open 方法。

  from PIL import Image

  im_path = r'F:\\Jupyter Notebook\\csv_time_datetime_PIL\\rabbit.jpg'

  im = Image.open(im_path)

  width, height = im.size# 寬高

  print(im.size, width, height)# 格式,以及格式的詳細(xì)描述

  print(im.format, im.format_description)

  im.save(r'C:\\Users\\Administrator\\Desktop\\rabbit_copy.jpg')

  im.show()

  (1920, 1080) 1920 1080

  JPEG JPEG (ISO 10918)

  im.size 返回一個(gè)元組,分別是寬和高。 show() 方法會(huì)調(diào)用系統(tǒng)默認(rèn)圖像查看軟件,打開(kāi)并顯示。 im.format 可查看圖像的格式。 save() 可保存處理后的圖片,如果未經(jīng)處理,保存后的圖像占用的空間(字節(jié)數(shù))一般也與原圖像不一樣,可能經(jīng)過(guò)了壓縮。

  新建圖像

  Pillow也可以新建空白圖像第一個(gè)參數(shù)是mode即顏色空間模式,第二個(gè)參數(shù)指定了圖像的分辨率(x),第三個(gè)參數(shù)是顏色。

 ?。?nbsp;可以直接填入常用顏色的名稱。如'red'

 ?。?nbsp;也可以填入十六進(jìn)制表示的顏色,如 #FF0000 表示紅色。

 ?。?nbsp;還能傳入元組,比如(255, 0, 0, 255)或者(255, 0, 0)表示紅色。

  # 通常使用RGB模式就可以了

  newIm= Image.new('RGB', (100, 100), 'red')

  newIm.save(r'C:\\Users\\Administrator\\Desktop\\1.png')

  # 也可以用RGBA模式,還有其他模式查文檔吧

  blcakIm = Image.new('RGB',(200, 100), 'red')

  blcakIm.save(r'C:\\Users\\Administrator\\Desktop\\2.png')# 十六進(jìn)制顏色

  blcakIm = Image.new('RGBA',(200, 100), '#FF0000')

  blcakIm.save(r'C:\\Users\\Administrator\\Desktop\\3.png')# 傳入元組形式的RGBA值或者RGBRGB模式下,第四個(gè)參數(shù)失效,默認(rèn)255,在RGBA模式下,也可只傳入前三個(gè)值,A值默認(rèn)255

  blcakIm = Image.new('RGB',(200, 100), (255, 255, 0, 120))

  blcakIm.save(r'C:\\Users\\Administrator\\Desktop\\4.png')

  裁剪圖像

  Image 有個(gè) crop() 方法接收一個(gè)矩形區(qū)域元組(上面有提到)。返回一個(gè)新的Image對(duì)象,是裁剪后的圖像,對(duì)原圖沒(méi)有影響。

  im = Image.open(im_path)

  cropedIm = im.crop((700, 100, 1200, 1000))

  cropedIm.save(r'C:\\Users\\Administrator\\Desktop\\cropped.png')

  看下原圖和裁剪后的圖像。

Python學(xué)習(xí)之使用Pillow(PIL)進(jìn)行圖像操作方法詳解

Python學(xué)習(xí)之使用Pillow(PIL)進(jìn)行圖像操作方法詳解

復(fù)制與粘貼圖像到另一個(gè)圖像

  Image  copy 函數(shù)如其名會(huì)產(chǎn)生一個(gè)原圖像的副本,在這個(gè)副本上的任何操作不會(huì)影響到原圖像。 paste() 方法用于將一個(gè)圖像粘貼(覆蓋)在另一個(gè)圖像上面。誰(shuí)調(diào)用它,他就在該Image對(duì)象上直接作修改。

  im = Image.open(im_path)

  cropedIm = im.crop((700, 100, 1200, 1000))

  im.paste(cropedIm, (0, 0))

  im.show()

  im.save(r'C:\\Users\\Administrator\\Desktop\\paste.png')

  im.show() 顯示圖像發(fā)現(xiàn)這時(shí)im(即原圖)已經(jīng)被改變。

Python學(xué)習(xí)之使用Pillow(PIL)進(jìn)行圖像操作方法詳解

這如果之后還會(huì)用到原圖的信息,由于信息被改變就很麻煩。所以paste前最好使用 copy() 復(fù)制一個(gè)副本,在此副本操作,不會(huì)影響到原圖信息。雖然在程序里原圖信息已改變,但由于保存文件時(shí)用的其他文件名,相當(dāng)于改變沒(méi)有生效,所以查看的時(shí)候原圖還是沒(méi)有改變的。

  im = Image.open(im_path)

  cropedIm = im.crop((700, 100, 1200, 1000))

  copyIm = im.copy()

  copyIm.paste(cropedIm, (0, 0))

  im.show()

  copyIm.save(r'C:\\Users\\Administrator\\Desktop\\paste.png')

  這回再看原圖,沒(méi)有改變了。這就保證了之后再次使用im時(shí),里面的信息還是原汁原味。來(lái)看個(gè)有趣的例子。

  im = Image.open(im_path)

  cropedIm = im.crop((700, 100, 1200, 1000))

  crop_width, crop_height = cropedIm.size

  width, height = im.size

  copyIm = im.copy()for left in range(0, width, crop_width):

  for top in range(0, height, crop_height):

  copyIm.paste(cropedIm, (left, top))

  copyIm.save(r'C:\\Users\\Administrator\\Desktop\\dupli-rabbit.png')

  以裁剪后的圖像寬度和高度為間隔,在循環(huán)內(nèi)不斷粘貼在副本中,這有點(diǎn)像是在拍證件照。


Python學(xué)習(xí)之使用Pillow(PIL)進(jìn)行圖像操作方法詳解

調(diào)整圖像的大小

  resize 方法返回指定寬高度的新Image對(duì)象,接受一個(gè)含有寬高的元組作為參數(shù)。 寬高的值得是整數(shù)。

  im = Image.open(im_path)

  width, height = im.size

  resizedIm = im.resize((width, height+(1920-1080)))

  resizedIm.save(r'C:\\Users\\Administrator\\Desktop\\resize.png')


Python學(xué)習(xí)之使用Pillow(PIL)進(jìn)行圖像操作方法詳解

 兔子瘦了,可以看到resize不是等比例縮放的。

  旋轉(zhuǎn)和翻轉(zhuǎn)圖像

  rotate() 返回旋轉(zhuǎn)后的新Image對(duì)象保持原圖像不變。逆時(shí)針旋轉(zhuǎn)。

  im = Image.open(im_path)

  im.rotate(90).save(r'C:\\Users\\Administrator\\Desktop\\rotate90.png')

  im.rotate(270).save(r'C:\\Users\\Administrator\\Desktop\\rotate270.png')

  im.rotate(180).save(r'C:\\Users\\Administrator\\Desktop\\rotate180.png')

  im.rotate(20).save(r'C:\\Users\\Administrator\\Desktop\\rotate20.png')

  im.rotate(20, expand=True).save(r'C:\\Users\\Administrator\\Desktop\\rotate20_expand.png')


Python學(xué)習(xí)之使用Pillow(PIL)進(jìn)行圖像操作方法詳解

Python學(xué)習(xí)之使用Pillow(PIL)進(jìn)行圖像操作方法詳解


Python學(xué)習(xí)之使用Pillow(PIL)進(jìn)行圖像操作方法詳解

Python學(xué)習(xí)之使用Pillow(PIL)進(jìn)行圖像操作方法詳解

Python學(xué)習(xí)之使用Pillow(PIL)進(jìn)行圖像操作方法詳解

由上到下,分別是旋轉(zhuǎn)了90°,180°, 270°、普通的20°,加了參數(shù) expand=True 旋轉(zhuǎn)的20°expand放大了圖像尺寸(變成了2174x1672),使得邊角的圖像不被裁剪(四個(gè)角剛好貼著圖像邊緣)。再看旋轉(zhuǎn)90°、270°時(shí)候圖像被裁剪了,但是如下查看圖像的寬高,確是和原圖一樣,搞不懂。

  im90 = Image.open(r'C:\\Users\\Administrator\\Desktop\\rotate90.png')

  im270 = Image.open(r'C:\\Users\\Administrator\\Desktop\\rotate270.png')# 寬高信息并沒(méi)有改變

  print(im90.size, im270.size)

  (1920, 1080) (1920, 1080)

  圖像的鏡面翻轉(zhuǎn)。 transpose() 函數(shù)可以實(shí)現(xiàn),必須傳入 Image.FLIP_LEFT_RIGHT 或者 Image.FLIP_TOP_BOTTOM ,第一個(gè)是水平翻轉(zhuǎn),第二個(gè)是垂直翻轉(zhuǎn)。

  im = Image.open(im_path)

  im.transpose(Image.FLIP_LEFT_RIGHT).save(r'C:\\Users\\Administrator\\Desktop\\transepose_lr.png')

  im.transpose(Image.FLIP_TOP_BOTTOM).save(r'C:\\Users\\Administrator\\Desktop\\transepose_tb.png')


Python學(xué)習(xí)之使用Pillow(PIL)進(jìn)行圖像操作方法詳解

  水平翻轉(zhuǎn)看不出來(lái),原圖就是水平對(duì)稱的...


Python學(xué)習(xí)之使用Pillow(PIL)進(jìn)行圖像操作方法詳解

垂直翻轉(zhuǎn)就明顯了...

  圖像過(guò)濾

  Pillow使用ImageFilter可以簡(jiǎn)單做到圖像的模糊、邊緣增強(qiáng)、銳利、平滑等常見(jiàn)操作。

  from PIL import Image, ImageFilter

  im = Image.open(im_path)# 高斯模糊

  im.filter(ImageFilter.GaussianBlur).save(r'C:\\Users\\Administrator\\Desktop\\GaussianBlur.jpg')# 普通模糊

  im.filter(ImageFilter.BLUR).save(r'C:\\Users\\Administrator\\Desktop\\BLUR.jpg')# 邊緣增強(qiáng)

  im.filter(ImageFilter.EDGE_ENHANCE).save(r'C:\\Users\\Administrator\\Desktop\\EDGE_ENHANCE.jpg')# 找到邊緣

  im.filter(ImageFilter.FIND_EDGES).save(r'C:\\Users\\Administrator\\Desktop\\FIND_EDGES.jpg')# 浮雕

  im.filter(ImageFilter.EMBOSS).save(r'C:\\Users\\Administrator\\Desktop\\EMBOSS.jpg')# 輪廓

  im.filter(ImageFilter.CONTOUR).save(r'C:\\Users\\Administrator\\Desktop\\CONTOUR.jpg')# 銳化

  im.filter(ImageFilter.SHARPEN).save(r'C:\\Users\\Administrator\\Desktop\\SHARPEN.jpg')# 平滑

  im.filter(ImageFilter.SMOOTH).save(r'C:\\Users\\Administrator\\Desktop\\SMOOTH.jpg')# 細(xì)節(jié)

  im.filter(ImageFilter.DETAIL).save(r'C:\\Users\\Administrator\\Desktop\\DETAIL.jpg')

  另外,若是要進(jìn)行圖案、文字的繪制,可使用ImageDraw。Pillow還有其他強(qiáng)大功能,就不一一列舉了。

  其實(shí),Pillow只是個(gè)基礎(chǔ)的圖像處理庫(kù)。若不深入圖像處理,已經(jīng)夠用。專業(yè)人士使用opencv是更好地選擇。Python中使用 import cv2 開(kāi)始使用吧!

 

 

來(lái)源:博客園

您還未登錄,請(qǐng)先登錄

熱門(mén)帖子

最新帖子

?