【AI基础】OpenCV,PIL,Skimage你pick谁
文章首發(fā)于微信公眾號(hào)《與有三學(xué)AI》
【AI基礎(chǔ)】OpenCV,PIL,Skimage你pick誰
如何對(duì)圖像進(jìn)行處理是深度學(xué)習(xí)圖像處理的基礎(chǔ),我們常常需要對(duì)圖像進(jìn)行讀取、保存、縮放、裁剪、旋轉(zhuǎn)、顏色轉(zhuǎn)換等基本操作。
本文將講解如何利用opencv、PIL、?scikit-image等進(jìn)行圖像處理,并比較它們之間微小的差異。
?
01?三大包的基礎(chǔ)操作
本節(jié)講解如何利用opencv、PIL、?scikit-image等工具進(jìn)行圖像讀取、圖像保存、圖像縮放、裁剪、旋轉(zhuǎn)、顏色轉(zhuǎn)換等基本操作。
下面將基于下面這張圖片演示如何對(duì)圖形進(jìn)行基本的處理
1.1 利用PIL處理圖像? ? ? ? ? ? ? ? ? ? ? ? ? ??
我們首先從讀取圖片開始,很多圖像處理庫(如opencv、skimage)都以imread()讀取圖片,但是PIL用open方法。
?如果我們想要使用PIL來處理圖像,必須先導(dǎo)入Image模塊,這是進(jìn)行一切操作的前提。導(dǎo)入方法如下:
from PIL import Image
讀取一幅圖像
#我的圖片是保存在d盤picture文件夾下
img = Image.open('d:/picture/cat.jpg')
執(zhí)行上述代碼返回的結(jié)果如下:
怎樣才能可視化這個(gè)圖像呢?
我們需要調(diào)用matplotlib這個(gè)庫,如果沒有matplotlib.pyplot中的show()方法,圖像只會(huì)在內(nèi)存中,我們當(dāng)然看不見了。話不多說,代碼如下
from PIL import Image
import matplotlib.pyplot as plt
img = Image.open('d:/picture/cat.jpg')
plt.imshow(img)
plt.show()
結(jié)果如下:
查看圖片信息
哈哈!圖片我們已經(jīng)看到了,這是萬里長征的第一步。如果我們想要了解圖片格式,大小應(yīng)該怎么辦呢?方法如下:
print(img.format)#查看圖片格式
print(img.size)#查看圖片大小
print(img.mode)#查看圖片模式
我只列舉了常用的三個(gè)其實(shí)還有很多,可以自行搜索
更改圖像形式
使用PIL中的crop()方法可以從一幅圖像中裁剪指定區(qū)域,該區(qū)域使用四元組來指定,四元組的的坐標(biāo)依次是(b1,a1,b2,a2),通常一張圖片的左上角為0。示意圖如下:
?
如何對(duì)圖像進(jìn)行裁剪,具體代碼如下:
裁剪后的圖片
調(diào)整圖片尺寸和旋轉(zhuǎn)
我們可以使用resize()來調(diào)整圖片尺寸,該方法的參數(shù)是一個(gè)元組,用來指定圖像的大小,代碼如下:
#把圖片的尺寸改為400x400,tuple里面是圖像的weight和height
Img2 = img1.resize((400,400))
調(diào)整大小后的圖片
要旋轉(zhuǎn)一幅圖像,可以使用逆時(shí)針方法表示角度,調(diào)用rotate()方法,代碼如下:
img2 = img1.rotate((45))
旋轉(zhuǎn)后的圖片
對(duì)圖像旋轉(zhuǎn)(旋轉(zhuǎn)90度的整數(shù)倍)和翻轉(zhuǎn)也可以用transpose,方法如下:
#左右對(duì)換。
img2=img1.transpose(Image.FLIP_LEFT_RIGHT)?
#上下對(duì)換。
img2=img1.transpose(Image.FLIP_TOP_BOTTOM)??
#旋轉(zhuǎn) 90 度角。注意只能旋轉(zhuǎn)90度的整數(shù)倍
img2=img1.transpose(Image.ROTATE_90)??
左右翻轉(zhuǎn)
上下翻轉(zhuǎn)
圖像顏色變化
PIL中可以使用convet()方法來實(shí)現(xiàn)圖像一些顏色的變化,convert()函數(shù)會(huì)根據(jù)傳入?yún)?shù)的不同將圖片變成不同的模式。在PIL中有9種模式,如下表所示:
下面我們以灰度圖像為例,將目標(biāo)圖像轉(zhuǎn)換成灰度圖像,方法如下:
img1 = img.convert('F')#將圖片轉(zhuǎn)化為32位浮點(diǎn)灰色圖像,結(jié)果如下圖:
下面再使用skimage和opencv對(duì)圖像進(jìn)行基本操作,只附上具體實(shí)現(xiàn)代碼和注釋,效果和上面的其實(shí)沒什么差別。
1.2 使用skimage對(duì)圖像處理? ? ? ? ? ? ? ? ??
#導(dǎo)入io模塊
from skimage import io
#以彩色模式讀取圖片
img=io.imread('d:/picture/cat.jpg')
#以灰色圖像模式讀取圖片
img=io.imread('d:/picture/cat.jpg',as_grey=True)
#將圖片保存在c盤,picture文件夾下
io.imsave('c:/picture/cat.jpg')
#將圖片的大小變?yōu)?00x500
img1 = transform.resize(img, (500,500))
#縮小為原來圖片大小的0.1
img2 = transform.rescale(img, 0.1)?
#縮小為原來圖片行數(shù)一半,列數(shù)四分之一
img3 = transform.rescale(img, [0.5,0.25])
#放大為原來圖片大小的2倍
img4 =transform.rescale(img, 2)
#旋轉(zhuǎn)60度,不改變大小
img5 =transform.rotate(img, 60)
#旋轉(zhuǎn)60度,同時(shí)改變大小
img6=transform.rotate(img, 60,resize=True)?
#將圖片調(diào)暗,。如果gamma大于1,新圖像比原圖像暗,如果gamma<1,新圖像比原圖像亮
img7= exposure.adjust_gamma(img, 4)?
#將圖片調(diào)亮
img8= exposure.adjust_gamma(img, 0.3)
1.3使用opencv對(duì)圖像進(jìn)行處理?
#導(dǎo)入opencv
import cv2
#讀取圖片返回的是numpy.array格式
#cv2.imread共兩個(gè)參數(shù),第一個(gè)參數(shù)為要讀入的圖片文件名,第二個(gè)參數(shù)為如何讀取圖片,包括cv2.IMREAD_COLOR:讀入一副彩色圖片;cv2.IMREAD_GRAYSCALE:以灰度模式讀入圖片;cv2.IMREAD_UNCHANGED:讀入一幅圖片,并包括其alpha通道。
img = cv2.imread('d:/picture/cat.jpg')
#獲取圖片屬性
print(img.shape)#返回圖片的長,寬和通道數(shù)
#保存圖片,共兩個(gè)參數(shù),第一個(gè)為保存文件名,第二個(gè)為讀入圖片
cv2.imwrite('c:/picture/cat4.jpg',img)
#創(chuàng)建一個(gè)窗口顯示圖片,共兩個(gè)參數(shù),第一個(gè)參數(shù)表示窗口名字,可以創(chuàng)建多個(gè)窗口中,但是每個(gè)窗口不能重名;第二個(gè)參數(shù)是讀入的圖片。
cv2.imshow()
#鍵盤綁定函數(shù),共一個(gè)參數(shù),表示等待毫秒數(shù),將等待特定的幾毫秒,看鍵盤是否有輸入,返回值為ASCII值。如果其參數(shù)為0,則表示無限期的等待鍵盤輸入
cv2.waitKey()
#刪除建立的全部窗口
cv2.destroyAllWindows()
刪除指定的窗口
cv2.destroyWindows()
#opencv中圖像彩色空間變換函數(shù)cv2.cvtColor
cv2.cvtColor(input_image,fiag)
參數(shù)一: input_image表示將要變換色彩的圖像ndarray對(duì)象?
參數(shù)二: 表示圖像色彩空間變換的類型,以下介紹常用的兩種:?
·?cv2.COLOR_BGR2GRAY:?表示將圖像從BGR空間轉(zhuǎn)化成灰度圖,最常用?
·?cv2.COLOR_BGR2HSV:?表示將圖像從RGB空間轉(zhuǎn)換到HSV空間?
如果想查看參數(shù)flag的全部類型,請(qǐng)執(zhí)行以下程序便可查閱,總共有274種空間轉(zhuǎn)換類型:
import cv2
flags = [i for i in dir(cv2) if i.startswith('COLOR_')]
print(flags)
?
02?比較細(xì)節(jié)差異
2.1讀取方式上的不同
我們首先從讀取圖片開始,PIL用open方法來讀取圖片,但opencv、skimage都以imread()讀取圖片。
2.2讀進(jìn)來內(nèi)容的差異
opencv讀進(jìn)來的圖片已經(jīng)是一個(gè)numpy矩陣了,彩色圖片維度是(高度,寬度,通道數(shù))。數(shù)據(jù)類型是uint8;
opencv對(duì)于讀進(jìn)來的圖片的通道排列是BGR,而不是主流的RGB!謹(jǐn)記!
opencV存儲(chǔ)的格式:BGR
PIL讀進(jìn)來的圖像是一個(gè)對(duì)象,而不是我們所熟知的numpy 矩陣
PIL儲(chǔ)存的格式
針對(duì)PIL讀進(jìn)來的圖像是一個(gè)對(duì)象,那么如何才能將讀進(jìn)來的圖片轉(zhuǎn)為矩陣呢,方法如下:
from PIL import Image
import numpy as np
img1 = Image.open('d:/picture/cat.jpg')
arr = np.array(img1)
轉(zhuǎn)換后的格式
skimage讀取一張圖像時(shí)也是以numpy array形式讀入skimage的存儲(chǔ)格式是RGB。如下圖所示:
skimage的存儲(chǔ)格式RGB
skimage有一個(gè)巨大的不同是讀取灰度圖時(shí)其圖像的矩陣的值被歸一化了,注意注意!
我們skimage先看讀取灰度圖的方式,代碼如下:
from skimage import io
img=io.imread('d:/picture/cat.jpg',as_grey=True)
讀取的結(jié)果如下圖所示,明顯看到被歸一化了!
我們?cè)倏磑pencv和PIL讀取灰度圖時(shí)會(huì)不會(huì)被歸一化呢?代碼和對(duì)比如下:
opencv讀取灰度圖
import cv2
img=cv2.imread('d:/picture/cat.jpg',cv2.IMREAD_GRAYSCALE)
opencv讀取灰度圖格式
PIL讀取灰度圖
from PIL import Image
import numpy as np
img1 = Image.open('d:/picture/cat.jpg').convert('L')
arr = np.array(img1)
PIL讀取灰度圖格式
從上面的對(duì)比可以看出skimage讀取灰度圖時(shí)的巨大不同就是其圖像的矩陣的值被歸一化了!!!
?
03?總結(jié)
總的來說OpenCV、Skimage、PIL各有千秋。各種框架中進(jìn)行進(jìn)行混用,所以我們都必須要掌握,而且要注意區(qū)分他們之間微小的差異。
感謝各位看官的耐心閱讀,不足之處希望多多指教。后續(xù)內(nèi)容將會(huì)不定期奉上,歡迎大家關(guān)注有三公眾號(hào) 有三AI!
?
總結(jié)
以上是生活随笔為你收集整理的【AI基础】OpenCV,PIL,Skimage你pick谁的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【资源总结】“十大深度学习方向” 专栏
- 下一篇: 【杂谈】为什么你学了AI,企业却不要你