新聞中心
這篇文章主要介紹Python環(huán)境Pillow圖像處理工具怎么用,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
安裝
用戶可通過 pip 直接安裝 Pillow,更多安裝方式可以參見這里。
pip install Pillow #安裝 pillow
使用
在日常應用過程中,使用最多的是 Pillow 提供的 Image 模塊,其提供了包括圖像存儲、變換以及一系列的相關(guān)處理功能。Pillow 使用 Image 對象來表示圖像對象并基于其定義圖像的屬性信息以及可針對其進行的操作,后續(xù)即主要介紹通過 Image 對象可進行的圖像操作。在 Python 中使用時,用戶首先需從 PIL 中導入對應的 Image 模塊。
from PIL import Image #通過 Image 進行圖像處理相關(guān)的操作
圖像讀取與存儲
通過 Image 提供的 open 方法讀取圖像,其以指定的文件名為參數(shù),返回值為對應圖像的 Image 對象,后續(xù)即可針對圖像對應的 Image 對象進行操作。
im = Image.open( "test.png" ) # open 方法以圖像名(或圖像對象)為參數(shù),返回一個 Image 對象
通過 Image 對象的 save 方法存儲圖像對象,其使用存儲目標文件名為參數(shù),也可通過 format 參數(shù)指定存儲文件的格式。
im.save( "test.png" ) # im 為 Image 對象,其被保存至 test.png,不指定 format 參數(shù)時,該方法通過文件后綴推測文件類型 im.save( "test.jpg" , format="JPEG") # 以 JPEG 格式保存 Image 對象 im 至文件 test.jpg 中
基本屬性
圖像對應的 Image 對象具備基本屬性。用戶可以通過這些屬性獲得圖像最基本的信息,Image 對象的完整屬性信息可以查看這里。
im.filename # Image 對象 im 對應的文件/路徑名 im.mode # Image 對象圖像數(shù)據(jù)的解釋方式,如灰度圖為 “L”,彩色圖為 “RGB”等 im.size # 返回圖像的尺寸信息,為( width , height ) 格式的元祖
圖像類型轉(zhuǎn)換
不同的圖像數(shù)據(jù)具有不同的圖像格式,進而擁有不同的組織數(shù)據(jù)的方式。對于 RGB 圖像而言,圖像擁有 R、G、B 三個通道,像素數(shù)據(jù)由三個對應三通道的 8 bit 數(shù)據(jù)組成;對于黑白圖像而言,其每個像素由一個 8 bit 字節(jié)表示等等。在打開圖像時,open 方法會自動解析圖像的格式,用戶可通過 Image 對象的 mode 屬性獲得圖像的狀態(tài)。
Image 對象可通過 convert 方法進行圖像類型間的轉(zhuǎn)換,其使用轉(zhuǎn)換的目標類型的字符串為參數(shù),返回轉(zhuǎn)換后的 Image 對象,常見的類型包括 RGB(真彩)、L(黑白)、YCbCr(視頻圖像)、HSV(色調(diào)飽和度亮度彩色空間)。
data = im.convert( "L" ) #獲得 RGB 圖像 im 的灰度圖
與 numpy 數(shù)組的轉(zhuǎn)換
在程序中,一般使用圖像對應的 Image 對象進行圖像相關(guān)的操作,針對圖像數(shù)據(jù)本身的計算處理一般將 Image 對象的數(shù)據(jù)轉(zhuǎn)換為 numpy 數(shù)據(jù)后進行,處理完成之后的 numpy 數(shù)據(jù)再被轉(zhuǎn)換為 Image 對象進行保存。
a. 將 Image 對象轉(zhuǎn)換為 numpy 數(shù)組
使用 numpy.asarray 方法( 不唯一,可參見 Array creation routines )將 Image 對象的數(shù)據(jù)轉(zhuǎn)換為 numpy 數(shù)組,進而可以對其進行計算處理。轉(zhuǎn)換后 numpy 數(shù)組的數(shù)據(jù)類型根據(jù) Image 數(shù)據(jù)對象本身的數(shù)據(jù)類型推斷獲得,使用時也可使用 numpy.asarray 的 dtype 參數(shù)指定轉(zhuǎn)換后的數(shù)據(jù)類型。
im = Image.open( "test.png" ) #打開圖像 test.png ,并獲得其對應的 Image 對象 data = numpy.asarray( im ) #將 Image 對象 im 的數(shù)據(jù)轉(zhuǎn)換為 numpy 數(shù)組的形式,data 即為可供運算的 numpy 數(shù)組 data = numpy.asarray( im, dtype=np.uint8 ) #轉(zhuǎn)換圖像數(shù)據(jù)為 numpy 數(shù)組,并指定其類型為 np.uint8
b.將 numpy 數(shù)組轉(zhuǎn)換為 Image 對象
對于 numpy 數(shù)據(jù)形式的圖像數(shù)據(jù)( 通過數(shù)據(jù)處理或其他途徑獲得 ),可通過 Image.fromarray 方法將已有的 numpy 圖像數(shù)據(jù)轉(zhuǎn)換為 Image 對象。
im = Image.fromarray( data ) # data 為 numpy 數(shù)組,im 為轉(zhuǎn)換獲得的 Image 對象
注意,在使用 Image.fromarray 方法時可能會出現(xiàn)報錯 raise TypeError("Cannot handle this data type") , 這是由于待轉(zhuǎn)換的 numpy 數(shù)據(jù)類型可能并不符合 Image 對象所需的數(shù)據(jù)類型( 一般為 8 bit 無符號值 ),解決方法是在轉(zhuǎn)換前先將 numpy 數(shù)組的數(shù)據(jù)類型轉(zhuǎn)換為 np.uint8 .
im = Image.fromarray( data.astype( np.uint8 ) ) #將 numpy 數(shù)組的數(shù)據(jù)類型轉(zhuǎn)換為 np.uint8 后再轉(zhuǎn)換為 Image 對象
常用操作
裁剪圖像——crop
可以使用 crop 方法獲得圖像的指定部分。crop 方法以指定 ( 左,上,右,下 ) 切割位置的元祖來定義待分割的圖像部分,可以理解為定義的是切割獲得的矩形的左上角和右下角位置的坐標。在 PIL 所支持的坐標系統(tǒng)中,坐標的( 0 , 0 ) 為圖像的左上角,注意 ( 0 , 0 ) 指向的不是左上角的第一個像素,而是該像素位置前的位置,后續(xù)所有的坐標均為像素間的空隙位置,而不是指向像素。也就是說,第一個像素被 ( 0 , 0 ) 和 ( 0 , 1 ) 兩個坐標左右包圍。
part = im.crop( ( 0 , 0 , 100 , 100 ) ) #截取獲得圖像 im 左上角大小為 100 × 100 像素的矩形圖像
通道處理——split / getchannel
split 方法將圖像數(shù)據(jù)按通道分離,其返回值為包含各個通道分離數(shù)據(jù)的元組tuple,如對于 RGB 圖像而言,其被分成 R、G、B 三個通道的數(shù)據(jù)。
R, G, B = im.split() # im 為真彩色 Image 對象,其被分為獨立的 R、G、B 通道信息
getchannel 方法以圖像的通道的索引或字符名字為參數(shù),返回包含有對應通道數(shù)據(jù)的 L 類型的圖像( 即為黑白模式 )。
R = im.getchannel( 0 ) # 獲得 RGB 圖像的第一個通道的數(shù)據(jù),即 R 通道信息 R = im.getchannel( "R" ) #同上
縮放圖像——resize
resize 方法以縮放目標圖像大小的元祖( Width, Heigth ) 為參數(shù),通過指定的采樣方法將圖像縮放為指定的圖像大小。其支持采樣的方法包括 PIL.Image.NEAREST、PIL.Image.BILINEAR、PIL.Image.BICUBIC 等,resize 支持的全部采樣方式見文檔。注意,以上采樣方法的全名為 PIL.Image.xxxx,但實際上由于之前已經(jīng)使用 from PIL import Image 導入了 Image 這個模塊名,故而后續(xù)可以直接使用 Image.xxxx 的形式調(diào)用上述方法,反之,在未導入模塊名時需使用完整的名稱來使用上述方法,下同。
data = im.resize( ( 100, 100 ) ) #將 im 對應的 Image 對象縮放為 100×100 的大小,默認采用 PIL.Image.NEAREST 方法 data = im.resize( ( 100, 100 ), Image.BICUBIC ) #使用 PIL.Image.BICUBIC 方法進行采樣
翻轉(zhuǎn)圖像——rotate/transpose
通過 rotate 方法旋轉(zhuǎn)圖像,rotate 方法以旋轉(zhuǎn)的角度為參數(shù),將圖像順時針中心旋轉(zhuǎn)對應的度數(shù),并返回對應的 Image 對象。注意,通過 rotate 方法進行旋轉(zhuǎn)時,結(jié)果圖像是中心旋轉(zhuǎn)后圖像在源圖像大小范圍內(nèi)被截取的部分,其他部分為填充。如大小為寬×高 200 * 100 的圖像,經(jīng)過 90 度旋轉(zhuǎn)后,其大小仍為 200 * 100 ,圖像內(nèi)容為旋轉(zhuǎn)后的理論為 100 * 200 的圖像與原 200 * 100 區(qū)域的重合部分,其余部分為填充。
rotate 方法可以指定 expand 參數(shù)為 1 ,此時生成的新圖像為完整包含有旋轉(zhuǎn)后圖像內(nèi)容的最小矩形大小( 空白處為填充),如上例中,圖像經(jīng)過 90 度旋轉(zhuǎn)后,獲得的新圖像的大小即為 100 * 200。更多介紹見 Image.rotate.
data = im.rotate( 90 ) #將圖像順時針旋轉(zhuǎn) 90 度 data = im.rotate( 90 , expand=1 ) #將圖像順時針旋轉(zhuǎn) 90 度,同時保留圖像的完整內(nèi)容
在某些圖像訓練的數(shù)據(jù)生成中,將圖像進行 90 度為單位的旋轉(zhuǎn)、上下或左右翻轉(zhuǎn)是更為常見的操作。此時可以使用 transpose 方法,transpose 以翻轉(zhuǎn)方式為參數(shù),返回經(jīng)過翻轉(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 #順時針旋轉(zhuǎn)對應度數(shù) PIL.Image.TRANSPOSE #類似于左右翻轉(zhuǎn)后再逆時針旋轉(zhuǎn)圖像 90 度 PIL.Image.TRANSVERSE #類似與左右翻轉(zhuǎn)后再順時針旋轉(zhuǎn)圖像 90 度
可以直接使用上述參數(shù)對圖像進行變換,transpose 方法返回變換后的完整圖像( 由于是 90 度倍數(shù)的變換,也不存在空白區(qū)域 )。
data = im.transpose( Image.FLIP_LEFT_RIGHT ) #獲得 im 圖像經(jīng)過左右旋轉(zhuǎn)后的數(shù)據(jù)
以上是“Python環(huán)境Pillow圖像處理工具怎么用”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對大家有幫助,更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)成都網(wǎng)站設(shè)計公司行業(yè)資訊頻道!
另外有需要云服務器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。
網(wǎng)頁名稱:Python環(huán)境Pillow圖像處理工具怎么用-創(chuàng)新互聯(lián)
轉(zhuǎn)載源于:http://www.ef60e0e.cn/article/doeihj.html