Python圖像處理庫(kù)----Pillow(十五)

一、 安裝

參考文檔:https://pillow.readthedocs.io/en/latest/installation.html

Pillow的安裝比較的簡(jiǎn)單,直接pip安裝即可:

pip install Pillow

但是要注意的一點(diǎn)是,PillowPIL不能共存在同一個(gè)環(huán)境中,所以如果安裝的有PIL的話,那么安裝Pillow之前應(yīng)該刪除PIL

由于是繼承自PIL的分支,所以Pillow的導(dǎo)入是這樣的:

import PIL 
# 或者
from PIL import Image

注意:圖像處理庫(kù)PIL(Python Imaging Library )支持python2,不支持python3。

二、使用手冊(cè)

1、Image類的使用

Image是Pillow中最為重要的類,實(shí)現(xiàn)了Pillow中大部分的功能。要?jiǎng)?chuàng)建這個(gè)類的實(shí)例主要有三個(gè)方式:

  1. 從文件加載圖像
  2. 處理其他圖像獲得
  3. 創(chuàng)建一個(gè)新的圖像
(1) 讀取圖像

一般來說,我們都是都過從文件加載圖像來實(shí)例化這個(gè)類,如下所示:

from PIL import Image
picture = Image.open('happy.png')

如果沒有指定圖片格式的話,那么Pillow會(huì)自動(dòng)識(shí)別文件內(nèi)容為文件格式。

(2)新建圖像

Pillow新建空白圖像使用new()方法, 第一個(gè)參數(shù)是mode即顏色空間模式,第二個(gè)參數(shù)指定了圖像的分辨率(寬x高),第三個(gè)參數(shù)是顏色。

  • 可以直接填入常用顏色的名稱。如'red'。
  • 也可以填入十六進(jìn)制表示的顏色,如#FF0000表示紅色。
  • 還能傳入元組,比如(255, 0, 0, 255)或者(255, 0, 0)表示紅色。
picture = Image.new('RGB', (200, 100), 'red')
(3)保存圖像

保存圖片的話需要使用save()方法:

picture.save('happy.png')

保存的時(shí)候,如果沒有指定圖片格式的話,那么Pillow會(huì)根據(jù)輸入的后綴名決定保存的文件格式。

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

在Pillow中,用的是圖像的左上角為坐標(biāo)的原點(diǎn)(0,0),所以這意味著,x軸的數(shù)值是從左到右增長(zhǎng)的,y軸的數(shù)值是從上到下增長(zhǎng)的。

我們處理圖像時(shí),常常需要去表示一個(gè)矩形的圖像區(qū)域。Pillow中很多方法都需要傳入一個(gè)表示矩形區(qū)域的元組參數(shù)。

這個(gè)元組參數(shù)包含四個(gè)值,分別代表矩形四條邊的距離X軸或者Y軸的距離。順序是(左,頂,右,底)。其實(shí)就相當(dāng)于,矩形的左上頂點(diǎn)坐標(biāo)為(左,頂),矩形的右下頂點(diǎn)坐標(biāo)為(右,底),兩個(gè)頂點(diǎn)就可以確定一個(gè)矩形的位置。

右和底坐標(biāo)稍微特殊,跟python列表索引規(guī)則一樣,是左閉右開的??梢岳斫鉃?code>[左, 右)和[頂, 底)這樣左閉右開的區(qū)間。比如(3, 2, 8, 9)就表示了橫坐標(biāo)范圍[3, 7];縱坐標(biāo)范圍[2, 8]的矩形區(qū)域。

(1) 常用屬性

  • PIL.Image.filename

    圖像源文件的文件名或者路徑,只有使用open()方法創(chuàng)建的對(duì)象有這個(gè)屬性。

    類型:字符串

  • PIL.Image.format

    圖像源文件的文件格式。

  • PIL.Image.mode

    圖像的模式,一般來說是“1”, “L”, “RGB”, 或者“CMYK” 。

  • PIL.Image.size

    圖像的大小

  • PIL.Image.width

    圖像的寬度

  • PIL.Image.height

    圖像的高度

  • PIL.Image.info

    圖像的一些信息,為字典格式

(2)常用方法

  • 裁剪圖片

Image使用crop()方法來裁剪圖像,此方法需要傳入一個(gè)矩形元祖參數(shù),返回一個(gè)新的Image對(duì)象,對(duì)原圖沒有影響。

croped_im = im.crop((100, 100, 200, 200))

注意:圖片在計(jì)算機(jī)中是一個(gè)矩陣形式存在

  • 復(fù)制與粘貼圖像

復(fù)制圖像使用copy()方法:

copyed_im = im.copy()

粘貼圖像使用paste()方法:

croped_im = im.crop((100, 100, 200, 200))
im.paste(croped_im, (0, 0))

im對(duì)象調(diào)用了paste()方法,第一個(gè)參數(shù)是被裁剪下來用來粘貼的圖像,第二個(gè)參數(shù)是一個(gè)位置參數(shù)元祖,這個(gè)位置參數(shù)是粘貼的圖像的左頂點(diǎn)。

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

調(diào)整圖像大小使用resize()方法:

resized_im = im.resize((width, height))

resize()方法會(huì)返回一個(gè)重設(shè)了大小的Image對(duì)象。

或者使用thumbnail()方法

im = Image.open('test.jpg')
#獲得圖像尺寸
w, h = im.size  
# 縮放到50%
im.htumbnail((w//2, h//2))  
#顯示圖片
im.show()  

thumbnail() 方法可以用來制作縮略圖。它接受一個(gè)二元數(shù)組作為縮略圖的尺寸,然后將示例縮小到指定尺寸

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

旋轉(zhuǎn)圖像使用rotate()方法,此方法按逆時(shí)針旋轉(zhuǎn),并返回一個(gè)新的Image對(duì)象:

# 逆時(shí)針旋轉(zhuǎn)90度
im.rotate(90)
im.rotate(180)
im.rotate(20, expand=True)

旋轉(zhuǎn)的時(shí)候,會(huì)將圖片超出邊界的邊角裁剪掉。如果加入expand=True參數(shù),就可以將圖片邊角保存住。

翻轉(zhuǎn)圖像使用transpose()

# 水平翻轉(zhuǎn)
im.transpose(Image.FLIP_LEFT_RIGHT)
# 垂直翻轉(zhuǎn)
im.transpose(Image.FLIP_TOP_BOTTOM)
  • 獲得圖片通道名稱
im.getbands()
  • 通過通道分割圖片
(1) split()

split()可以將多通道圖片按通道分割為單通道圖片。返回各個(gè)通道的灰度圖組成的元組

R, G, B = im.split()

split()方法返回的是一個(gè)元祖,元祖中的元素則是分割后的單個(gè)通道的圖片。

(2)getchannel(channel)

getchannel()可以獲取單個(gè)通道的圖片:

R = im.getchannel("R")
  • 模式轉(zhuǎn)化
img = im.convert("L")   #轉(zhuǎn)為灰度
  • 獲取單個(gè)像素的值

使用getpixel(xy)方法可以獲取單個(gè)像素位置的值:

im.getpixel((100, 100))

傳入的xy需要是一個(gè)元祖形式的坐標(biāo)。

如果圖片是多通道的,那么返回的是一個(gè)元祖。

  • 加載圖片全部數(shù)據(jù)

我們可以使用load()方法加載圖片所有的數(shù)據(jù),并比較方便的修改像素的值:

pixdata = im.load()
pixdata[100,200] = 255

此方法返回的是一個(gè)PIL.PyAccess,可以通過這個(gè)類的索引來對(duì)指定坐標(biāo)的像素點(diǎn)進(jìn)行修改。

  • 獲取全部像素內(nèi)容

getdata(band = None) 方法,用來獲取 Image 類的對(duì)象中的像素內(nèi)容

該方法會(huì)將圖片中的像素內(nèi)容,逐行逐行地拼接起來,作為一個(gè)完整的序列返回。方法的返回類型,是 PIL 庫(kù)的內(nèi)部類型。我們可以用 list(im.getdata()) 得到標(biāo)準(zhǔn)的 Python list 對(duì)象。

band 意味「通道」。當(dāng) band = None 時(shí),方法返回所有通道的像素內(nèi)容;當(dāng) band = 0時(shí),則返回第一個(gè)通道的像素內(nèi)容。例如,對(duì)于 RGB 模式的位圖,band = 0 返回 R 通道的內(nèi)容;band = 2 返回 B 通道的內(nèi)容。

from PIL import Image

im = Image.open('test.jpg')
print(im.getdata())  #獲取所有通道的值 類似生成器的對(duì)象
print(list(im.getdata(0)))  #獲取第一個(gè)通道的值, 轉(zhuǎn)化為列表
  • 關(guān)閉圖片并釋放內(nèi)存

此方法會(huì)刪除圖片對(duì)象并釋放內(nèi)存

im.close()
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 本文地址:http://www.itdecent.cn/p/3740dec1f436 1. 簡(jiǎn)介 Python傳...
    王南北丶閱讀 3,629評(píng)論 4 8
  • Image讀出來的是PIL的類型,而skimage.io讀出來的數(shù)據(jù)是numpy格式的 輸出可以看出Img讀圖片的...
    jiandanjinxin閱讀 97,584評(píng)論 2 52
  • 挫敗感 每個(gè)人都會(huì)很努力的去生活,去學(xué)習(xí),去奮斗,可是如果換來的是失敗,就會(huì)讓人產(chǎn)生失敗感,但是如果相反,如果你成...
    蝸牛吃韭菜閱讀 849評(píng)論 0 0
  • 我是卓佐,這是我的第205篇原創(chuàng)文。 上午,收到福州W寄來的快遞,寄來她自制的燉了12小時(shí)以上的冰糖檸檬膏,還給小...
    迎慶心烘焙閱讀 851評(píng)論 2 5

友情鏈接更多精彩內(nèi)容