Pillow 模塊~Python圖像處理


什么是驗證碼?

驗證碼(CAPTCHA)是“Completely Automated Public Turing test to tell Computers and Humans Apart”(全自動區分計算機和人類的圖靈測試)的縮寫。
是一種用來區分用戶是計算機還是人的公共全自動程序。

驗證碼的作用
認證碼是一種人機識別手段,最終目的是區分正常用戶和機器的操作。
可以防止:惡意破解密碼、注冊、刷票、論壇灌水,防止黑客對用戶的密碼進行暴力破解。
一般是提出一個問題,這個問題可以由計算機生成並評判,但是必須只有人類才能解答。由於計算機無法解答這個的問題,所以回答出問題的用戶就可以被認為是人類。
驗證碼的類別

驗證碼自面世以來就一直在更新,迭代。
圖形驗證碼:這類驗證碼大多是計算機隨機產生一個字符串,在把字符串增加噪點、干擾線、變形、重疊、不同顏色、扭曲組成一張圖片來增加識別難度。
滑動驗證碼:也叫行為驗證碼,比較流行的一種驗證碼,通過用戶的操作行為來完成驗證,其中最出名的就是極驗。
滑動驗證碼的原理就是使用機器學習中的深度學習技術,根據一些特征來區分是否為正常用戶。通過記錄用戶的滑動速度,還有每一小段時間的瞬時速度,用戶鼠標點擊情況,以及滑動后的匹配程度來識別。而且,不是說滑動到正確位置就是驗證通過,而是根據特征識別來區分是否為真用戶,滑到正確位置只是一個必要條件。
點觸驗證碼:點擊類驗證碼都是給出一張包含文字的圖片,通過文字提醒用戶點擊圖中相同字的位置進行驗證。

 

簡介

Python傳統的圖像處理庫PIL(Python Imaging Library),可以說基本上是Python處理圖像的便准庫,功能強大,使用簡單。

 

但是由於PIL不支持Python3,而且更新緩慢。所以由志願者在PIl的基礎上創建了一個分支版本,命名為Pillow,Pillow目前最新支持到

Python3.6,更新活躍,並且增加了許多新的特性。所以在這里講解一下Pillow庫

 


 

安裝

命令行pip安裝

pip install Pillow

 

但是需要注意一點,Pillow和PIL是不能共存在一個環境中的,所以如果安裝有PIL的話,需要先把PIL卸載掉,也不用擔心更能問題,

Pillow具備PIL絕大多數的方法,卸載命令

pip uninstall PIL

 

 

 

由於是繼承PIL的分支,所以Pillow的導入是這樣的:

import PIL

#或者是

from PIL import Image

 


 

使用手冊

Image

Image是Pillow中最為重要的類,實現了Pillow中大部分的功能。要創建這個類的示例主要有三個方法:

  1. 從文件加載圖片

  2. 處理其他圖像獲得

  3. 創建一個新的圖像

讀取圖像

一般來說,我們都是通過文件加載圖像來實例化這個類,如下所示:

from PIl import Image
picture = Image.open('test.png')

如果沒有指定圖片格式的話,那么Pillow會自動識別文件內容為文件格式。

 

新建圖像

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

- 可以直接填入常用的顏色的名稱。如‘red'。

- 也可以填入十六進制表示的顏色,如#F0000表示紅色。

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

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

 

保存圖片

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

picture.save('test.png')

 

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

 圖像的坐標表示

- 在Pillow中,用的是圖像左上角的坐標的原點(0,0).所以這意味着,x軸的數值是從左到右增長的,y軸的數值是從上到下增長的。

- 我們處理圖像時,常常需要去表示一個矩形的圖像區域。Pillow中很多的方法都需要傳入一個表示矩形區域的元組參數。

- 這個元組參數包含四個值,分別代表矩形四條邊的距離X軸或者Y軸的距離。順序是(左,頂,右,底)。其實就相當於,

矩形的左上頂點坐標為(左,頂),矩形的右下頂點坐標為(右,底),兩個頂點就可以確定一個矩形的位置。

- 右和底坐標稍微特殊,跟python列表索引規則一樣,是左閉右開的。可以理解為[左, 右)[頂, 底)這樣左閉右開的區間。

比如(3, 2, 8, 9)就表示了橫坐標范圍[3, 7];縱坐標范圍[2, 8]的矩形區域。

 

 

常用屬性

  • PIL.Image.filename

    打印圖像源文件的文件名或者路徑,只有使用open()方法創建的對象有這個屬性。

    類型:字符串

  • PIL.Image.format

    圖像源文件的文件格式。

  • PIL.Image.mode

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

  • PIL.Image.size

    圖像的大小

  • PIL.Image.width

    圖像的寬度

  • PIL.Image.height

    圖像的高度

  • PIL.Image.info

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

常用方法

裁剪圖片

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

croped_im = img.crop((50, 60, 400, 218))

 

 原圖片:

裁剪以后:

復制與粘貼圖像

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

copyed_im = im.copy()

 

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

croped_im = im.crop((50, 60, 400, 218))
im.paste(croped_im, (0, 0))

 

im對象調用了paste()方法,第一個參數是被裁剪下來用來粘貼的圖像,第二個參數是一個位置參數元祖,這個位置參數是粘貼的圖像的左頂點。

 

調整圖像的大小

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

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

 

resize()方法會返回一個重設了大小的Image對象。

或者使用thumbnail()方法:

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

 

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

 

旋轉圖像和翻轉圖像

旋轉圖像使用rotate()方法,此方法按逆時針旋轉並返回一個新的Image對象

# 逆時針旋轉90度
im.rotate(90)
im.rotate(180)
im.rotate(20, expand=True)

 inn = img.rotate(90)

 

旋轉的時候,會將圖片超出邊界的邊角裁剪掉。如果加入expand=True參數,就可以將圖片邊角保存住。

 

翻轉圖像使用transpose()

# 水平翻轉
im.transpose(Image.FLIP_LEFT_RIGHT)
# 垂直翻轉
im.transpose(Image.FLIP_TOP_BOTTOM)

 


 

 

獲得圖片通道名稱

im.getbands()

 

通過通道分割圖片

split()

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

R, G, B = im.split()

 

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

 

getchannel(channel)

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

R = im.getchannel("R")

模式轉化

img = im.convert("L")   

獲取單個像素的值

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

im.getpixel((100, 100))

 

傳入的xy需要是一個元祖形式的坐標。

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

L模式經常用來處理圖像識別,數據方便分析處理

加載圖片全部數據

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

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

 


 

 

此方法返回的是一個PIL.PyAccess,可以通過這個類的索引來對指定坐標的像素點進行修改。

獲取全部像素內容

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

該方法會將圖片中的像素內容,逐行逐行地拼接起來,作為一個完整的序列返回。方法的返回類型,是 PIL 庫的內部類型。我們可以用 list(im.getdata()) 得到標准的 Python list 對象。

band 意味「通道」。當 band = None 時,方法返回所有通道的像素內容;當 band = 0時,則返回第一個通道的像素內容。例如,對於 RGB 模式的位圖,band = 0 返回 R 通道的內容;band = 2 返回 B 通道的內容。

from PIL import Image
​
im = Image.open('test.jpg')
print(im.getdata())  #獲取所有通道的值 類似生成器的對象
print(list(im.getdata(0)))  #獲取第一個通道的值, 轉化為列表

關閉圖片並釋放內存

此方法會刪除圖片對象並釋放內存

im.close()

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM