欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python環(huán)境Pillow( PIL )圖像處理工具使用解析

 更新時(shí)間:2019年09月12日 08:51:42   作者:yhjoker  
這篇文章主要介紹了Python環(huán)境Pillow( PIL )圖像處理工具使用解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

前言

由于筆者近期的研究課題與圖像后處理有關(guān),需要通過(guò)圖像處理工具對(duì)圖像進(jìn)行變換和處理,進(jìn)而生成合適的訓(xùn)練圖像數(shù)據(jù)。該系列文章即主要記錄筆者在不同的環(huán)境下進(jìn)行圖像處理時(shí)常用的工具和庫(kù)。在 Python 環(huán)境下,對(duì)圖像的處理筆者主要使用 Pillow 庫(kù),主要操作包括對(duì)圖像的讀取、存儲(chǔ)和變換等。實(shí)際應(yīng)用中,Pillow 中提供的 Image 模塊適合對(duì)圖像整體進(jìn)行變換處理操作。

注:以下介紹僅包括對(duì)應(yīng)模塊和函數(shù)的基礎(chǔ)用法,故而在介紹時(shí)省略了部分參數(shù)和選項(xiàng),更完備的用法和介紹可參考 Pillow 的官方文檔。

安裝

用戶(hù)可通過(guò) pip 直接安裝 Pillow,更多安裝方式可以參見(jiàn)這里。

pip install Pillow #安裝 pillow

使用

在日常應(yīng)用過(guò)程中,使用最多的是 Pillow 提供的 Image 模塊,其提供了包括圖像存儲(chǔ)、變換以及一系列的相關(guān)處理功能。Pillow 使用 Image 對(duì)象來(lái)表示圖像對(duì)象并基于其定義圖像的屬性信息以及可針對(duì)其進(jìn)行的操作,后續(xù)即主要介紹通過(guò) Image 對(duì)象可進(jìn)行的圖像操作。在 Python 中使用時(shí),用戶(hù)首先需從 PIL 中導(dǎo)入對(duì)應(yīng)的 Image 模塊。

from PIL import Image #通過(guò) Image 進(jìn)行圖像處理相關(guān)的操作

圖像讀取與存儲(chǔ)

通過(guò) Image 提供的 open 方法讀取圖像,其以指定的文件名為參數(shù),返回值為對(duì)應(yīng)圖像的 Image 對(duì)象,后續(xù)即可針對(duì)圖像對(duì)應(yīng)的 Image 對(duì)象進(jìn)行操作。

  im = Image.open( "test.png" )  # open 方法以圖像名(或圖像對(duì)象)為參數(shù),返回一個(gè) Image 對(duì)象

通過(guò) Image 對(duì)象的 save 方法存儲(chǔ)圖像對(duì)象,其使用存儲(chǔ)目標(biāo)文件名為參數(shù),也可通過(guò) format 參數(shù)指定存儲(chǔ)文件的格式。

  im.save( "test.png" )          # im 為 Image 對(duì)象,其被保存至 test.png,不指定 format 參數(shù)時(shí),該方法通過(guò)文件后綴推測(cè)文件類(lèi)型
  im.save( "test.jpg" , format="JPEG")  # 以 JPEG 格式保存 Image 對(duì)象 im 至文件 test.jpg 中

基本屬性

圖像對(duì)應(yīng)的 Image 對(duì)象具備基本屬性。用戶(hù)可以通過(guò)這些屬性獲得圖像最基本的信息,Image 對(duì)象的完整屬性信息可以查看這里。

  im.filename    # Image 對(duì)象 im 對(duì)應(yīng)的文件/路徑名
  im.mode      # Image 對(duì)象圖像數(shù)據(jù)的解釋方式,如灰度圖為 “L”,彩色圖為 “RGB”等
  im.size      # 返回圖像的尺寸信息,為( width , height ) 格式的元祖

圖像類(lèi)型轉(zhuǎn)換

不同的圖像數(shù)據(jù)具有不同的圖像格式,進(jìn)而擁有不同的組織數(shù)據(jù)的方式。對(duì)于 RGB 圖像而言,圖像擁有 R、G、B 三個(gè)通道,像素?cái)?shù)據(jù)由三個(gè)對(duì)應(yīng)三通道的 8 bit 數(shù)據(jù)組成;對(duì)于黑白圖像而言,其每個(gè)像素由一個(gè) 8 bit 字節(jié)表示等等。在打開(kāi)圖像時(shí),open 方法會(huì)自動(dòng)解析圖像的格式,用戶(hù)可通過(guò) Image 對(duì)象的 mode 屬性獲得圖像的狀態(tài)。

Image 對(duì)象可通過(guò) convert 方法進(jìn)行圖像類(lèi)型間的轉(zhuǎn)換,其使用轉(zhuǎn)換的目標(biāo)類(lèi)型的字符串為參數(shù),返回轉(zhuǎn)換后的 Image 對(duì)象,常見(jiàn)的類(lèi)型包括 RGB(真彩)、L(黑白)、YCbCr(視頻圖像)、HSV(色調(diào)飽和度亮度彩色空間)。

  data = im.convert( "L" )    #獲得 RGB 圖像 im 的灰度圖

與 numpy 數(shù)組的轉(zhuǎn)換

在程序中,一般使用圖像對(duì)應(yīng)的 Image 對(duì)象進(jìn)行圖像相關(guān)的操作,針對(duì)圖像數(shù)據(jù)本身的計(jì)算處理一般將 Image 對(duì)象的數(shù)據(jù)轉(zhuǎn)換為 numpy 數(shù)據(jù)后進(jìn)行,處理完成之后的 numpy 數(shù)據(jù)再被轉(zhuǎn)換為 Image 對(duì)象進(jìn)行保存。

a. 將 Image 對(duì)象轉(zhuǎn)換為 numpy 數(shù)組

使用 numpy.asarray 方法( 不唯一,可參見(jiàn) Array creation routines )將 Image 對(duì)象的數(shù)據(jù)轉(zhuǎn)換為 numpy 數(shù)組,進(jìn)而可以對(duì)其進(jìn)行計(jì)算處理。轉(zhuǎn)換后 numpy 數(shù)組的數(shù)據(jù)類(lèi)型根據(jù) Image 數(shù)據(jù)對(duì)象本身的數(shù)據(jù)類(lèi)型推斷獲得,使用時(shí)也可使用 numpy.asarray 的 dtype 參數(shù)指定轉(zhuǎn)換后的數(shù)據(jù)類(lèi)型?! ?/p>

  im = Image.open( "test.png" )         #打開(kāi)圖像 test.png ,并獲得其對(duì)應(yīng)的 Image 對(duì)象
  data = numpy.asarray( im )           #將 Image 對(duì)象 im 的數(shù)據(jù)轉(zhuǎn)換為 numpy 數(shù)組的形式,data 即為可供運(yùn)算的 numpy 數(shù)組
  data = numpy.asarray( im, dtype=np.uint8 )   #轉(zhuǎn)換圖像數(shù)據(jù)為 numpy 數(shù)組,并指定其類(lèi)型為 np.uint8

b.將 numpy 數(shù)組轉(zhuǎn)換為 Image 對(duì)象

對(duì)于 numpy 數(shù)據(jù)形式的圖像數(shù)據(jù)( 通過(guò)數(shù)據(jù)處理或其他途徑獲得 ),可通過(guò) Image.fromarray 方法將已有的 numpy 圖像數(shù)據(jù)轉(zhuǎn)換為 Image 對(duì)象。

im = Image.fromarray( data ) # data 為 numpy 數(shù)組,im 為轉(zhuǎn)換獲得的 Image 對(duì)象

注意,在使用 Image.fromarray 方法時(shí)可能會(huì)出現(xiàn)報(bào)錯(cuò) raise TypeError("Cannot handle this data type") , 這是由于待轉(zhuǎn)換的 numpy 數(shù)據(jù)類(lèi)型可能并不符合 Image 對(duì)象所需的數(shù)據(jù)類(lèi)型( 一般為 8 bit 無(wú)符號(hào)值 ),解決方法是在轉(zhuǎn)換前先將 numpy 數(shù)組的數(shù)據(jù)類(lèi)型轉(zhuǎn)換為 np.uint8 .

  im = Image.fromarray( data.astype( np.uint8 ) )  #將 numpy 數(shù)組的數(shù)據(jù)類(lèi)型轉(zhuǎn)換為 np.uint8 后再轉(zhuǎn)換為 Image 對(duì)象

常用操作

裁剪圖像——crop

可以使用 crop 方法獲得圖像的指定部分。crop 方法以指定 ( 左,上,右,下 ) 切割位置的元祖來(lái)定義待分割的圖像部分,可以理解為定義的是切割獲得的矩形的左上角和右下角位置的坐標(biāo)。在 PIL 所支持的坐標(biāo)系統(tǒng)中,坐標(biāo)的( 0 , 0 ) 為圖像的左上角,注意 ( 0 , 0 ) 指向的不是左上角的第一個(gè)像素,而是該像素位置前的位置,后續(xù)所有的坐標(biāo)均為像素間的空隙位置,而不是指向像素。也就是說(shuō),第一個(gè)像素被 ( 0 , 0 ) 和 ( 0 , 1 ) 兩個(gè)坐標(biāo)左右包圍?! ?/p>

part = im.crop( ( 0 , 0 , 100 , 100 ) ) #截取獲得圖像 im 左上角大小為 100 × 100 像素的矩形圖像

通道處理——split / getchannel

split 方法將圖像數(shù)據(jù)按通道分離,其返回值為包含各個(gè)通道分離數(shù)據(jù)的元組tuple,如對(duì)于 RGB 圖像而言,其被分成 R、G、B 三個(gè)通道的數(shù)據(jù)。

R, G, B = im.split() # im 為真彩色 Image 對(duì)象,其被分為獨(dú)立的 R、G、B 通道信息

getchannel 方法以圖像的通道的索引或字符名字為參數(shù),返回包含有對(duì)應(yīng)通道數(shù)據(jù)的 L 類(lèi)型的圖像( 即為黑白模式 )?! ?/p>

  R = im.getchannel( 0 )  # 獲得 RGB 圖像的第一個(gè)通道的數(shù)據(jù),即 R 通道信息
  R = im.getchannel( "R" ) #同上

縮放圖像——resize

resize 方法以縮放目標(biāo)圖像大小的元祖( Width, Heigth ) 為參數(shù),通過(guò)指定的采樣方法將圖像縮放為指定的圖像大小。其支持采樣的方法包括 PIL.Image.NEAREST、PIL.Image.BILINEAR、PIL.Image.BICUBIC 等,resize 支持的全部采樣方式見(jiàn)文檔。注意,以上采樣方法的全名為 PIL.Image.xxxx,但實(shí)際上由于之前已經(jīng)使用 from PIL import Image 導(dǎo)入了 Image 這個(gè)模塊名,故而后續(xù)可以直接使用 Image.xxxx 的形式調(diào)用上述方法,反之,在未導(dǎo)入模塊名時(shí)需使用完整的名稱(chēng)來(lái)使用上述方法,下同。

  data = im.resize( ( 100, 100 ) )             #將 im 對(duì)應(yīng)的 Image 對(duì)象縮放為 100×100 的大小,默認(rèn)采用 PIL.Image.NEAREST 方法
  data = im.resize( ( 100, 100 ), Image.BICUBIC )     #使用 PIL.Image.BICUBIC 方法進(jìn)行采樣

翻轉(zhuǎn)圖像——rotate/transpose

通過(guò) rotate 方法旋轉(zhuǎn)圖像,rotate 方法以旋轉(zhuǎn)的角度為參數(shù),將圖像順時(shí)針中心旋轉(zhuǎn)對(duì)應(yīng)的度數(shù),并返回對(duì)應(yīng)的 Image 對(duì)象。注意,通過(guò) rotate 方法進(jìn)行旋轉(zhuǎn)時(shí),結(jié)果圖像是中心旋轉(zhuǎn)后圖像在源圖像大小范圍內(nèi)被截取的部分,其他部分為填充。如大小為寬×高 200 * 100 的圖像,經(jīng)過(guò) 90 度旋轉(zhuǎn)后,其大小仍為 200 * 100 ,圖像內(nèi)容為旋轉(zhuǎn)后的理論為 100 * 200 的圖像與原 200 * 100 區(qū)域的重合部分,其余部分為填充。

rotate 方法可以指定 expand 參數(shù)為 1 ,此時(shí)生成的新圖像為完整包含有旋轉(zhuǎn)后圖像內(nèi)容的最小矩形大小( 空白處為填充),如上例中,圖像經(jīng)過(guò) 90 度旋轉(zhuǎn)后,獲得的新圖像的大小即為 100 * 200。更多介紹見(jiàn) Image.rotate.

data = im.rotate( 90 ) #將圖像順時(shí)針旋轉(zhuǎn) 90 度
data = im.rotate( 90 , expand=1 ) #將圖像順時(shí)針旋轉(zhuǎn) 90 度,同時(shí)保留圖像的完整內(nèi)容

在某些圖像訓(xùn)練的數(shù)據(jù)生成中,將圖像進(jìn)行 90 度為單位的旋轉(zhuǎn)、上下或左右翻轉(zhuǎn)是更為常見(jiàn)的操作。此時(shí)可以使用 transpose 方法,transpose 以翻轉(zhuǎn)方式為參數(shù),返回經(jīng)過(guò)翻轉(zhuǎn)后的圖像,其支持的參數(shù)如下所示。

PIL.Image.FLIP_LEFT_RIGHT  #左右翻轉(zhuǎn)圖像
  PIL.Image.FLIP_TOP_BOTTOM  #上下翻轉(zhuǎn)圖像
  PIL.Image.ROTATE_90
  PIL.Image.ROTATE_180
  PIL.Image.ROTATE_270     #順時(shí)針旋轉(zhuǎn)對(duì)應(yīng)度數(shù)
  PIL.Image.TRANSPOSE     #類(lèi)似于左右翻轉(zhuǎn)后再逆時(shí)針旋轉(zhuǎn)圖像 90 度
  PIL.Image.TRANSVERSE     #類(lèi)似與左右翻轉(zhuǎn)后再順時(shí)針旋轉(zhuǎn)圖像 90 度

可以直接使用上述參數(shù)對(duì)圖像進(jìn)行變換,transpose 方法返回變換后的完整圖像( 由于是 90 度倍數(shù)的變換,也不存在空白區(qū)域 )。

data = im.transpose( Image.FLIP_LEFT_RIGHT ) #獲得 im 圖像經(jīng)過(guò)左右旋轉(zhuǎn)后的數(shù)據(jù)

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論