亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

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

系統 1529 0

前言

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

注:以下介紹僅包括對應模塊和函數的基礎用法,故而在介紹時省略了部分參數和選項,更完備的用法和介紹可參考 Pillow 的官方文檔。

安裝

用戶可通過 pip 直接安裝 Pillow,更多安裝方式可以參見這里。

            
pip install Pillow #安裝 pillow
          

使用

在日常應用過程中,使用最多的是 Pillow 提供的 Image 模塊,其提供了包括圖像存儲、變換以及一系列的相關處理功能。Pillow 使用 Image 對象來表示圖像對象并基于其定義圖像的屬性信息以及可針對其進行的操作,后續即主要介紹通過 Image 對象可進行的圖像操作。在 Python 中使用時,用戶首先需從 PIL 中導入對應的 Image 模塊。

            
from PIL import Image #通過 Image 進行圖像處理相關的操作
          

圖像讀取與存儲

通過 Image 提供的 open 方法讀取圖像,其以指定的文件名為參數,返回值為對應圖像的 Image 對象,后續即可針對圖像對應的 Image 對象進行操作。

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

通過 Image 對象的 save 方法存儲圖像對象,其使用存儲目標文件名為參數,也可通過 format 參數指定存儲文件的格式。

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

基本屬性

圖像對應的 Image 對象具備基本屬性。用戶可以通過這些屬性獲得圖像最基本的信息,Image 對象的完整屬性信息可以查看這里。

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

圖像類型轉換

不同的圖像數據具有不同的圖像格式,進而擁有不同的組織數據的方式。對于 RGB 圖像而言,圖像擁有 R、G、B 三個通道,像素數據由三個對應三通道的 8 bit 數據組成;對于黑白圖像而言,其每個像素由一個 8 bit 字節表示等等。在打開圖像時,open 方法會自動解析圖像的格式,用戶可通過 Image 對象的 mode 屬性獲得圖像的狀態。

Image 對象可通過 convert 方法進行圖像類型間的轉換,其使用轉換的目標類型的字符串為參數,返回轉換后的 Image 對象,常見的類型包括 RGB(真彩)、L(黑白)、YCbCr(視頻圖像)、HSV(色調飽和度亮度彩色空間)。

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

與 numpy 數組的轉換

在程序中,一般使用圖像對應的 Image 對象進行圖像相關的操作,針對圖像數據本身的計算處理一般將 Image 對象的數據轉換為 numpy 數據后進行,處理完成之后的 numpy 數據再被轉換為 Image 對象進行保存。

a. 將 Image 對象轉換為 numpy 數組

使用 numpy.asarray 方法( 不唯一,可參見 Array creation routines )將 Image 對象的數據轉換為 numpy 數組,進而可以對其進行計算處理。轉換后 numpy 數組的數據類型根據 Image 數據對象本身的數據類型推斷獲得,使用時也可使用 numpy.asarray 的 dtype 參數指定轉換后的數據類型。  

            
  im = Image.open( "test.png" )         #打開圖像 test.png ,并獲得其對應的 Image 對象
  data = numpy.asarray( im )           #將 Image 對象 im 的數據轉換為 numpy 數組的形式,data 即為可供運算的 numpy 數組
  data = numpy.asarray( im, dtype=np.uint8 )   #轉換圖像數據為 numpy 數組,并指定其類型為 np.uint8
          

b.將 numpy 數組轉換為 Image 對象

對于 numpy 數據形式的圖像數據( 通過數據處理或其他途徑獲得 ),可通過 Image.fromarray 方法將已有的 numpy 圖像數據轉換為 Image 對象。

            
im = Image.fromarray( data ) # data 為 numpy 數組,im 為轉換獲得的 Image 對象
          

注意,在使用 Image.fromarray 方法時可能會出現報錯 raise TypeError("Cannot handle this data type") , 這是由于待轉換的 numpy 數據類型可能并不符合 Image 對象所需的數據類型( 一般為 8 bit 無符號值 ),解決方法是在轉換前先將 numpy 數組的數據類型轉換為 np.uint8 .

            
  im = Image.fromarray( data.astype( np.uint8 ) )  #將 numpy 數組的數據類型轉換為 np.uint8 后再轉換為 Image 對象
          

常用操作

裁剪圖像――crop

可以使用 crop 方法獲得圖像的指定部分。crop 方法以指定 ( 左,上,右,下 ) 切割位置的元祖來定義待分割的圖像部分,可以理解為定義的是切割獲得的矩形的左上角和右下角位置的坐標。在 PIL 所支持的坐標系統中,坐標的( 0 , 0 ) 為圖像的左上角,注意 ( 0 , 0 ) 指向的不是左上角的第一個像素,而是該像素位置前的位置,后續所有的坐標均為像素間的空隙位置,而不是指向像素。也就是說,第一個像素被 ( 0 , 0 ) 和 ( 0 , 1 ) 兩個坐標左右包圍。  

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

通道處理――split / getchannel

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

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

getchannel 方法以圖像的通道的索引或字符名字為參數,返回包含有對應通道數據的 L 類型的圖像( 即為黑白模式 )。  

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

縮放圖像――resize

resize 方法以縮放目標圖像大小的元祖( Width, Heigth ) 為參數,通過指定的采樣方法將圖像縮放為指定的圖像大小。其支持采樣的方法包括 PIL.Image.NEAREST、PIL.Image.BILINEAR、PIL.Image.BICUBIC 等,resize 支持的全部采樣方式見文檔。注意,以上采樣方法的全名為 PIL.Image.xxxx,但實際上由于之前已經使用 from PIL import Image 導入了 Image 這個模塊名,故而后續可以直接使用 Image.xxxx 的形式調用上述方法,反之,在未導入模塊名時需使用完整的名稱來使用上述方法,下同。

            
  data = im.resize( ( 100, 100 ) )             #將 im 對應的 Image 對象縮放為 100×100 的大小,默認采用 PIL.Image.NEAREST 方法
  data = im.resize( ( 100, 100 ), Image.BICUBIC )     #使用 PIL.Image.BICUBIC 方法進行采樣
          

翻轉圖像――rotate/transpose

通過 rotate 方法旋轉圖像,rotate 方法以旋轉的角度為參數,將圖像順時針中心旋轉對應的度數,并返回對應的 Image 對象。注意,通過 rotate 方法進行旋轉時,結果圖像是中心旋轉后圖像在源圖像大小范圍內被截取的部分,其他部分為填充。如大小為寬×高 200 * 100 的圖像,經過 90 度旋轉后,其大小仍為 200 * 100 ,圖像內容為旋轉后的理論為 100 * 200 的圖像與原 200 * 100 區域的重合部分,其余部分為填充。

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

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

在某些圖像訓練的數據生成中,將圖像進行 90 度為單位的旋轉、上下或左右翻轉是更為常見的操作。此時可以使用 transpose 方法,transpose 以翻轉方式為參數,返回經過翻轉后的圖像,其支持的參數如下所示。

            
PIL.Image.FLIP_LEFT_RIGHT  #左右翻轉圖像
  PIL.Image.FLIP_TOP_BOTTOM  #上下翻轉圖像
  PIL.Image.ROTATE_90
  PIL.Image.ROTATE_180
  PIL.Image.ROTATE_270     #順時針旋轉對應度數
  PIL.Image.TRANSPOSE     #類似于左右翻轉后再逆時針旋轉圖像 90 度
  PIL.Image.TRANSVERSE     #類似與左右翻轉后再順時針旋轉圖像 90 度
          

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

            
data = im.transpose( Image.FLIP_LEFT_RIGHT ) #獲得 im 圖像經過左右旋轉后的數據
          

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 国产精品视频免费 | 九九热精品视频在线播放 | 香蕉蕉亚亚洲aav综合 | 久久香蕉国产线看观看亚洲卡 | 日日人人 | 久久久毛片免费全部播放 | 国产大片在线观看 | 天天综合久久久网 | 视频国产91| 99久热国产精品视频尤物不卡 | 神马影院我不卡手机 | 欧美xvideosexo另类 | 91在线你懂的 | 91久久亚洲精品国产一区二区 | 久久两性视频 | 久久国产成人 | 天天综合天天添夜夜添狠狠添 | 国产精品嫩草影院奶水 | 国产成视频 | 久久精品综合国产二区 | 亚洲黄色高清 | 亚洲国产一区二区a毛片日本 | 色www 永久免费网站 | 欧美日韩大尺码免费专区 | 激情综合欧美 | 好吊妞在线播放 | 在线观看片成人免费视频 | 欧美成人四级剧情在线播放 | 99国产精品九九视频免费看 | 国产色视频一区二区三区 | 国产三级在线精品男人的天堂 | 国产激情在线视频 | 亚洲 欧美 另类 天天更新影院 | 日本夜爽爽一区二区三区 | 欧美一级黄色毛片 | 成人一级网站 | 国产精品一区在线麻豆 | 天天操天天射天天 | 国产99在线播放 | 九九视频免费观看 | 国产乱人伦偷精品视频不卡 |