Python詳細(xì)講解圖像處理的而兩種庫(kù)OpenCV和Pillow
一、簡(jiǎn)介
實(shí)現(xiàn)計(jì)算機(jī)視覺(jué)任務(wù)的過(guò)程中,不可避免地需要對(duì)圖像進(jìn)行讀寫操作以及圖像預(yù)處理操作,下面介紹兩個(gè)常用的Python圖像處理庫(kù):OpenCV和Pillow。
OpenCV全稱是由英特爾公司資助的開源計(jì)算機(jī)視覺(jué)庫(kù)。
- 它由一系列C函數(shù)和少量C++類所組成,實(shí)現(xiàn)圖像處理和計(jì)算機(jī)視覺(jué)方面的很多通用算法,例如特征檢測(cè)與跟蹤、運(yùn)動(dòng)分析、目標(biāo)分割與識(shí)別以及3D重建等。
- OpenCV作為基于C/C++語(yǔ)言編寫的跨平臺(tái)開源軟件,可以運(yùn)行在Linux、Windows、Android和MacOS操作系統(tǒng)上,同時(shí)提供了Python、Ruby、MATLAB等語(yǔ)言的接口,實(shí)現(xiàn)了圖像處理和計(jì)算機(jī)視覺(jué)方面的很多通用算法。
1.1 圖像處理-OpenCV
OpenCV是模塊結(jié)構(gòu)的,有以下主要模塊。
- 【core】–核心功能模塊,包含內(nèi)容有:OpenCV基本數(shù)據(jù)結(jié)構(gòu)、動(dòng)態(tài)數(shù)據(jù)結(jié)構(gòu)、繪圖函數(shù)、數(shù)組操作相關(guān)函數(shù)、輔助功能與系統(tǒng)函數(shù)和宏、與OpenGL的互操作。
- 【imgproc】–圖像處理模塊,包含內(nèi)容有:線性和非線性的圖像濾波、圖像的幾何變換、圖像轉(zhuǎn)換、直方圖相關(guān)、結(jié)構(gòu)分析和形狀描述、運(yùn)動(dòng)分析和對(duì)象跟蹤、特征檢測(cè)、目標(biāo)檢測(cè)等內(nèi)容。
- 【features2D】–2D功能模塊,包含以下內(nèi)容:特征檢測(cè)和描述、特征檢測(cè)器、描述符提取器等內(nèi)容。
- 【highGUI】–高層GUI圖形用戶界面,包含:媒體的I/O輸入輸出、視頻捕捉、圖像和視頻的編碼解碼、圖形交互界面的接口等內(nèi)容。
1.2 圖像處理- PIL和Pillow
作為Python2的第三方圖像處理庫(kù)是Pillow的前身。隨著Python3的更新,PIL移植到Python3更名為Pillow。與OpenCV一樣,Pillow也是模塊結(jié)構(gòu),主要包括以下結(jié)構(gòu)。
- 【Image】–圖像功能模塊,包含內(nèi)容有:讀寫圖像、圖像混合、圖像放縮、圖像裁切、圖像旋轉(zhuǎn)。
- 【ImageFilter】–圖像濾波功能模塊,包含內(nèi)容有:各類圖像濾波核。
- 【ImageEnhance】–圖像增強(qiáng)功能模塊,包含內(nèi)容有:色彩增強(qiáng)、亮度增強(qiáng)、對(duì)比度增強(qiáng)、清晰度增強(qiáng)。
- 【ImageDraw】–圖像繪畫功能模塊,包含內(nèi)容有:繪制幾何形狀、繪制文字。
二、常用圖像類型
2.1 二值圖像
二值圖像只有黑白兩種顏色,如圖所示。圖像中的每個(gè)像素只能是黑或白,沒(méi)有中間的過(guò)渡。因此二值圖像的像素值只能為0或1,0表示黑色,1表示白色。

2.2 灰度圖像
- 灰度圖像只表達(dá)圖像的亮度信息沒(méi)有顏色信息,如(a)圖所示。
- 灰度圖像的每個(gè)像素點(diǎn)上只包含一個(gè)量化的灰度級(jí)(即灰度值)。
- 像素點(diǎn)的亮度水平如(b)圖所示,通常使用1字節(jié)(8位二進(jìn)制數(shù))來(lái)存儲(chǔ)灰度值,因此用正整數(shù)表示灰度值的范圍是0~255。

2.3 RGB圖像
- RGB(Red、Green、Blue)圖像如(a)圖,可以看成是由多個(gè)RGB像素點(diǎn)組成。
- 每個(gè)彩色像素點(diǎn)分別由R、G、B三種顏色空間組成如(b)圖,本質(zhì)是3維數(shù)組。
- 在RGB顏色空間中,任意色光都可以用R、G、B三色不同分量的相加混合而成。

2.4 常用顏色空間簡(jiǎn)介
實(shí)際應(yīng)用中常用的顏色空間很多,通常使用3個(gè)獨(dú)立的變量對(duì)顏色進(jìn)行描述,例如RGB、HSV、YUV等。
一個(gè)圖像的不同的顏色空間是可以轉(zhuǎn)換的,cv2.cvtColor可以實(shí)現(xiàn)顏色的轉(zhuǎn)換。
• cv2.COLOR_BGR2GRAY
• cv2.COLOR_BGR2RGB
• cv2.COLOR_BGR2HSV
• cv2.COLOR_BGR2YUV
• cv2.COLOR_BGR2HLS
三、OpenCV圖像讀寫與顯示
通過(guò)OpenCV庫(kù)對(duì)數(shù)字圖像進(jìn)行處理時(shí),涉及到的基礎(chǔ)操作包括讀取、顯示、寫出圖像文件。
在OpenCV庫(kù)中,圖像數(shù)據(jù)是以NumPy數(shù)組的形式存在。
3.1 讀入圖像
在python的OpenCV中,通過(guò)cv2.imread()函數(shù)讀入圖像數(shù)據(jù),其基本使用格式如下。cv2.imread(filename, flags)
在默認(rèn)情況下通過(guò)cv2.imread()
函數(shù)讀入圖像數(shù)據(jù)為3通道的彩色圖,像素值為8位的非負(fù)整數(shù),圖像數(shù)據(jù)以NumPy中ndarray的方式存在。
如果定義了cv2.imread()讀入模式為cv2.IMREAD_GRAYSCALE那么讀入圖像為單通道的灰度圖。
需要注意的是,通過(guò)OpenCV讀入彩色圖像數(shù)據(jù)的顏色通道順序?yàn)锽GR(藍(lán)、綠、紅)并非常用的RGB(紅、綠、藍(lán))順序。
在OpenCV中,讀取到的圖像數(shù)組維度可以表示為:
(高,寬,通道數(shù))即(height, width, channel)。OpenCV圖像坐標(biāo)與常規(guī)的數(shù)學(xué)坐標(biāo)有區(qū)別,左上角位置為坐標(biāo)原點(diǎn)。
• 在Windows【畫圖】工具中,帽檐紅點(diǎn)坐標(biāo)為(248, 102),但在OpenCV中像素位置應(yīng)為(102, 248)。
• X軸 == 列位置 == 圖像寬
• Y軸 == 行位置 == 圖像高

3.2 顯示圖像
- 在OpenCV中,通過(guò)cv2.imshow()函數(shù)顯示圖像數(shù)據(jù),其基本使用格式如下。
- cv2.imshow(winname, img)
- 在OpenCV中,通過(guò)cv2.waitKey()函數(shù)設(shè)置圖片窗口顯示時(shí)長(zhǎng),其基本使用格式如下。
- cv2.waitKey([,delay])
- waitKey作用是圖像顯示時(shí)等待用戶按鍵觸發(fā),如果用戶按鍵觸發(fā)或時(shí)間超過(guò)了設(shè)置的時(shí)間則退出圖片展示。
- cv2.waitKey(0)的作用是令程序一直停留在顯示圖像的狀態(tài)。如果沒(méi)有增加cv2.waitKey(0),那么程序運(yùn)行完畢后,圖像顯示窗口會(huì)自動(dòng)關(guān)閉,即一閃而逝。
3.3 寫出圖像
- 在OpenCV中,通過(guò)cv2.write()函數(shù)保存圖像數(shù)據(jù),其基本使用格式如下。
- cv2.imwrite(filename, img)
import cv2
import matplotlib.pyplot as plt
import numpy
# 讀寫圖像
img = cv2.imread(filename='lena.jpg', flags=cv2.IMREAD_GRAYSCALE)
img.shape
# (377, 373)
img.dtype
# dtype('uint8')
# 圖像展示
cv2.imshow(winname='lena', mat=img)
cv2.waitKey(0)
# 圖像保存
cv2.imwrite(filename='test_img.jpg', img=img)四、圖像幾何變換
4.1 圖像平移
圖像平移變換將一幅圖像中的所有像素點(diǎn)都按照給定的偏移量在水平方向(沿x軸方向)或垂直方向(沿y軸方向)移動(dòng),是圖像幾何變換中較為簡(jiǎn)單的一種變換。
圖像平移原理示意圖如下圖所示。

假設(shè)對(duì)點(diǎn)P_0 (x_0,y_0 )進(jìn)行平移后得到點(diǎn)P(x,y),其中x方向的平移量為?x,y方向的平移量為?y ,則點(diǎn)P(x,y)的坐標(biāo)如下式。

利用齊次坐標(biāo)表示圖像平移變換前后點(diǎn)P_0 (x_0,y_0 )到點(diǎn)P(x,y)的關(guān)系如下式所示。

實(shí)現(xiàn)步驟:
1. 定義平移變換矩陣: 例如:np.float32([[1,0,50], [0,1,100]])
• [1,0,50]表示在x軸方向移動(dòng)50個(gè)單位
• [0,1,100]表示在y軸方向移動(dòng)100個(gè)單位
2. 執(zhí)行轉(zhuǎn)換:cv2.warpAffine (src, M, dsize)

通過(guò)OpenCV實(shí)現(xiàn)圖像平移操作,結(jié)果如下圖所示,(a)為原圖和(b)為平移后圖像。

import cv2
import matplotlib.pyplot as plt
import numpy as np
img = cv2.imread('lena.jpg')
height, width, channel = img.shape
# 圖像平移
# 1、定義平移變換矩陣
M = np.float32([[1,0,50], [0,1,100]])
# 2、執(zhí)行平移變換
img_tran = cv2.warpAffine(src=img, M=M, dsize=(height, width))
cv2.imshow('image translation', img_tran)
cv2.waitKey(0)
4.2 圖像旋轉(zhuǎn)
圖像旋轉(zhuǎn)(Rotation)是指圖像以某一點(diǎn)為中心旋轉(zhuǎn)一定的角度形成一幅新的圖像的過(guò)程。通常是以圖像的中心為圓心旋轉(zhuǎn),將圖像中的所有像素點(diǎn)都旋轉(zhuǎn)一個(gè)相同的角度。
圖像旋轉(zhuǎn)原理如圖所示,將點(diǎn)(x_0,y_0)繞原點(diǎn)o順時(shí)針旋轉(zhuǎn)至點(diǎn)(x_1,y_1 ),其中a為旋轉(zhuǎn)角,r為點(diǎn)(x_0,y_0 )到原點(diǎn)的距離, b為原點(diǎn)o到點(diǎn)(x_0,y_0 )的線段與x軸之間的夾角。在旋轉(zhuǎn)過(guò)程中, r保持不變。

設(shè)旋轉(zhuǎn)前,x_0、y_0的坐標(biāo)分別為x_0=r cos?b、y_0=r sin?b,當(dāng)旋轉(zhuǎn)a角度后,坐標(biāo)x_1、y_1的值分別如下式所示。

上式的矩陣的形式如下式所示。

實(shí)現(xiàn)步驟:
1. 計(jì)算旋轉(zhuǎn)變換矩陣: cv2.getRotationMatrix2D (center, angle, scale)

2. 執(zhí)行轉(zhuǎn)換:cv2.warpAffine (src, M, dsize)

通過(guò)OpenCV實(shí)現(xiàn)圖像旋轉(zhuǎn),得到的效果如圖所示。

# 圖像旋轉(zhuǎn)
# 1、定義旋轉(zhuǎn)變換矩陣
M = cv2.getRotationMatrix2D(center=(height*0.5, width*0.5), # 旋轉(zhuǎn)的中心位置坐標(biāo)
angle=45, # 旋轉(zhuǎn)的角度
scale=0.8 # 縮放比例
)
# 2、執(zhí)行旋轉(zhuǎn)變換
img_rotation = cv2.warpAffine(img, M, dsize=(height,width))
cv2.imshow('image_rotation', img_rotation)
cv2.waitKey(0)
4.3 圖像縮放
圖像比例縮放是指將給定的圖像在x軸方向按比例縮放f_x倍,在y軸方向按比例縮放f_y倍,從而獲得一幅新的圖像。如果f_x=f_y,即x軸方向和y軸方向縮放的比率相同,此比例縮放為圖像的全比例縮放。如果f_x≠f_y,那么圖像的比例縮放會(huì)改變?cè)紙D像的像素間的相對(duì)位置,產(chǎn)生幾何畸變。
在OpenCV中cv2.resize(src, dsize, fx, fy, interpolation)可以實(shí)現(xiàn)圖像縮放。

具體實(shí)現(xiàn)圖像縮放有多種插值方法,OpenCV的resize函數(shù)提供了如下5種常見方法。
• 最鄰近插值:cv2.INTER_NEAREST
• 雙線性插值:cv2.INTER_LINEAR
• 區(qū)域插值:cv2.INTER_AREA
• 三次樣條插值:cv2.INTER_CUBIC
• Lanczos插值:cv2.INTER_LANCZOS4
# 圖像縮放
# 1、直接指定縮放大小
img_res = cv2.resize(img, dsize=(244,244))
img_res.shape
# (244, 244, 3)
cv2.imshow('image_resize', img_res)
cv2.waitKey(0)
# 2、最近鄰插值
img_near = cv2.resize(img, dsize=None, fx=1.5, fy=1,
interpolation=cv2.INTER_NEAREST)
cv2.imshow('img_near', img_near)
cv2.waitKey(0)
到此這篇關(guān)于Python詳細(xì)講解圖像處理的而兩種庫(kù)OpenCV和Pillow的文章就介紹到這了,更多相關(guān)Python圖像處理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Windows下Python的Django框架環(huán)境部署及應(yīng)用編寫入門
這篇文章主要介紹了Windows下Python的Django框架環(huán)境部署及程序編寫入門,Django在Python的框架中算是一個(gè)重量級(jí)的MVC框架,本文將從程序部署開始講到hellow world web應(yīng)用的編寫,需要的朋友可以參考下2016-03-03
pycharm最新免費(fèi)激活碼至2099年(21.3.18親測(cè)可用)
這篇文章主要介紹了pycharm最新的激活碼及激活碼的使用方法,幫助大家更好的利用pycharm學(xué)習(xí)python,感興趣的朋友可以了解下。2021-03-03
用selenium解決滑塊驗(yàn)證碼的實(shí)現(xiàn)步驟
驗(yàn)證碼作為一種自然人的機(jī)器人的判別工具,被廣泛的用于各種防止程序做自動(dòng)化的場(chǎng)景中,下面這篇文章主要給大家介紹了關(guān)于用selenium解決滑塊驗(yàn)證碼的實(shí)現(xiàn)步驟,需要的朋友可以參考下2023-02-02
Python自動(dòng)化測(cè)試ConfigParser模塊讀寫配置文件
本文主要介紹Python自動(dòng)化測(cè)試,這里詳細(xì)說(shuō)明了ConfigParser模塊讀寫配置文件,有興趣的小伙伴可以參考下2016-08-08
pytorch::Dataloader中的迭代器和生成器應(yīng)用詳解
這篇文章主要介紹了pytorch::Dataloader中的迭代器和生成器應(yīng)用詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-01-01

