實(shí)現(xiàn)從項(xiàng)目調(diào)研稚字、數(shù)據(jù)收集、數(shù)據(jù)預(yù)處理、深度卷積神經(jīng)網(wǎng)絡(luò)訓(xùn)練再到服務(wù)器部署的人臉表情識別小項(xiàng)目
在數(shù)據(jù)預(yù)處理方面胆描,常見的方法有:圖像灰度化瘫想、幾何變換、對比度增強(qiáng)等昌讲。進(jìn)一步就有圖像平滑国夜、閾值分割、形態(tài)學(xué)處理短绸、邊緣檢測车吹、幾何形狀檢測和擬合、傅里葉變換醋闭、頻率域?yàn)V波等相應(yīng)技術(shù)窄驹。
(后期慢慢更新)
1,圖像灰度化目尖、幾何變換馒吴、對比度增強(qiáng)
1.1, 圖像灰度化
問題:很多圖片識別為什么將彩色圖像灰度化?
知乎上的回答:
我們識別物體瑟曲,最關(guān)鍵的因素是梯度(現(xiàn)在很多的特征提取饮戳,SIFT,HOG等等本質(zhì)都是梯度的統(tǒng)計(jì)信息),梯度意味著邊緣洞拨,這是最本質(zhì)的部分扯罐,而計(jì)算梯度,自然就用到灰度圖像了烦衣。顏色本身歹河,非常容易受到光照等因素的影響,同類的物體顏色有很多變化花吟。所以顏色本身難以提供關(guān)?("在此處鍵入公式秸歧。" ) 鍵信息。
包含色彩的話衅澈,特征量键菱,計(jì)算量成指數(shù)倍數(shù)增加。比如一個(gè)點(diǎn)今布,灰度的話经备,就256個(gè)維度而已,但是如果算上RGB色彩的話部默,那就是1600萬以上維度侵蒙。然后再相互組合,或者說找梯度傅蹂,可以想象看看~~計(jì)算量太大纷闺,但是好在就算是全色盲也可以分辨物體,于是就x先降維(灰度)來計(jì)算。
灰度圖像能以較少的數(shù)據(jù)表征圖像的大部分特征急但,因此在某些算法的預(yù)處理階段需要進(jìn)行彩色圖像灰度化澎媒,以提高后續(xù)算法的效率。將彩色圖像轉(zhuǎn)換為灰度圖像的過程稱為彩色圖像灰度化波桩。在RGB模型中戒努,位于空間位置(x,y)的像素點(diǎn)的顏色用該像素點(diǎn)的R分量R(x,y)、G分量G(x,y)和B分量B(x,y)3個(gè)數(shù)值表示镐躲〈⒚担灰度圖像每個(gè)像素用一個(gè)灰度值(又稱強(qiáng)度值、亮度值)表示即可萤皂。
設(shè)f(x,y)表示位于空間位置(x,y)處的像素(該像素的R分量撒穷、G分量、B分量值分別為R(x,y)裆熙、G(x,y)端礼、B(x,y))的灰度化:
(1). 最大值灰度化:
算法:最大值灰度化方法將彩色圖像中像素的R分量、G分量和B分量3個(gè)數(shù)值的最大值作為灰度圖的灰度值入录。
公式:f(x, y)=max?(R(x,y), G(x,y), B(x,y))
(2). 平均灰度化:
算法:平均值灰度化方法將彩色圖像中像素的R分量蛤奥、G分量和B分量3個(gè)數(shù)值的平均值作為灰度圖的灰度值。
公式:f(x, y)=(R(x,y)+G(x,y)+ B(x,y))/3
(3). 加權(quán)平均值灰度化:
由于人眼對綠色最為敏感僚稿,紅色次之凡桥,對藍(lán)色的敏感性最低,因此使W_G>W_R>W_B 將得到較易識別的灰度圖像蚀同。一般時(shí)缅刽,W_R=0.299,W_b=0.587,W_G=0.114得到的灰度圖像效果最好
Gray= 0.072169B+ 0.715160G+ 0.212671*R
Gray= 0.11B+ 0.59G+ 0.3*R
前一種是OpenCV開放庫所采用的灰度權(quán)值,后一種為從人體生理學(xué)角度所提出的一種權(quán)值(人眼對綠色的敏感最高蠢络,對藍(lán)色敏感最低)
算法:加權(quán)平均值灰度化方法將彩色圖像中像素的R分量衰猛、G分量和B分量3個(gè)數(shù)值的加權(quán)平均值作為灰度圖的灰度值。
公式:f(x, y)=W_R?R(x,y)+W_G?G(x,y)+ W_B?B(x,y)
(4). gamma校正加權(quán)均值進(jìn)行圖像灰度化:
注意這里的2.2次方和2.2次方根, RGB顏色值不能簡單直接相加刹孔,而是必須用2.2次方換算成物理光功率腕侄。因?yàn)镽GB值與功率并非簡單的線性關(guān)系,而是冪函數(shù)關(guān)系芦疏,這個(gè)函數(shù)的指數(shù)稱為Gamma值,一般為2.2微姊,而這個(gè)換算過程酸茴,稱為Gamma校正。
公式:
總結(jié):由上圖進(jìn)行各個(gè)灰度化結(jié)果比較可以清晰的看出:
最大值法灰度化后圖像過于亮兢交,丟失的圖像細(xì)節(jié)較多薪捍,常用于對原本色調(diào)較暗的圖像進(jìn)行處理
加權(quán)平均值法灰度化后過于暗,不易于進(jìn)行目標(biāo)對象與背景區(qū)域的區(qū)分,常用于對原本色調(diào)較亮的圖像進(jìn)行處理
直接調(diào)用函數(shù)進(jìn)行灰度化顏色依舊偏暗
gamma修正灰度化的效果很好酪穿,但是gamma修正法的系數(shù)太多凳干,而且設(shè)計(jì)到了指數(shù)以及開方運(yùn)算,運(yùn)算時(shí)間長被济,對于大量圖片的處理更是不適用救赐,對設(shè)備的要求非常高
均值的效果跟gamma修正法差不多,可能不及gamma修正法只磷,但是其方法計(jì)算便捷经磅,且結(jié)果較佳
因此一般使用均值法進(jìn)行圖片的灰度處理
2,圖像平滑钮追、閾值分割
3预厌,形態(tài)學(xué)處理、邊緣檢測、幾何形狀檢測和擬合
3.1,形態(tài)學(xué)
數(shù)學(xué)形態(tài)學(xué)的基本運(yùn)算有4個(gè):膨脹靠粪、腐蝕箩溃、開啟和閉合。它們在二值圖像中和灰度圖像中各有特點(diǎn)恢口。基于這些基本運(yùn)算還可以推導(dǎo)和組合成各種數(shù)學(xué)形態(tài)學(xué)實(shí)用算法。
結(jié)構(gòu)元素多用于圖像形態(tài)學(xué)處理中的膨脹腰埂、腐蝕、開蜈膨、閉等運(yùn)算中屿笼,也可以作為高斯,濾波器等核的創(chuàng)建翁巍。
圖像的膨脹(Dilation)和腐蝕(Erosion)是兩種基本的形態(tài)學(xué)運(yùn)算驴一,主要用來尋找圖像中的極大區(qū)域和極小區(qū)域。其中膨脹類似于“領(lǐng)域擴(kuò)張”灶壶,將圖像中的高亮區(qū)域或白色部分進(jìn)行擴(kuò)張肝断,其運(yùn)行結(jié)果圖比原圖的高亮區(qū)域更大;腐蝕類似于“領(lǐng)域被蠶食”驰凛,將圖像中的高亮區(qū)域或白色部分進(jìn)行縮減細(xì)化胸懈,其運(yùn)行結(jié)果圖比原圖的高亮區(qū)域更小。
-
膨脹膨脹
origin & dilate -
腐蝕腐蝕
origin & erosion
3.2,邊緣檢測
邊緣檢測是圖像處理與計(jì)算機(jī)視覺中極為重要的一種分析圖像的方法蝗锥,在做圖像分析與識別時(shí)跃洛,邊緣是圖像特征的重要特征之一。邊緣檢測的目的就是找到圖像中亮度變化劇烈的像素點(diǎn)構(gòu)成的集合汇竭,表現(xiàn)出來往往是輪廓。如果圖像中邊緣能夠精確的測量和定位穴张,那么细燎,就意味著實(shí)際的物體能夠被定位和測量,包括物體的面積皂甘、物體的直徑玻驻、物體的形狀等就能被測量。
邊緣檢測根據(jù)檢測算子不同有許多偿枕,例如:Sobel璧瞬、Prewitt、Roberts渐夸、Canny嗤锉、Marr-Hildreth
3.2.1 數(shù)字圖像處理基礎(chǔ)知識與算法
- 數(shù)字圖像
數(shù)字圖像指的是現(xiàn)在的圖像都是以二維數(shù)字表示,每個(gè)像素的灰度值均由一個(gè)數(shù)字表示墓塌,范圍為0-255(2^8)
- 二值圖像瘟忱、灰度圖像、彩色圖像
二值圖像(Binary Image):圖像中每個(gè)像素的灰度值僅可取0或1苫幢,即不是取黑访诱,就是取白,二值圖像可理解為黑白圖像
灰度圖像(Gray Scale Image):圖像中每個(gè)像素可以由0-255的灰度值表示韩肝,具體表現(xiàn)為從全黑到全白中間有255個(gè)介于中間的灰色值可以取
彩色圖像(Color Image):每幅圖像是由三幅灰度圖像組合而成盐数,依次表示紅綠藍(lán)三通道的灰度值,即我們熟知的RGB伞梯,此時(shí)彩色圖像要視為三維的[height玫氢,width, 3]
彩色圖像轉(zhuǎn)為灰度圖的計(jì)算公式:
Gray表示灰度圖像,RGB則表示彩色圖像的紅(red)谜诫、綠(green)漾峡、藍(lán)(blue)三通道灰度值
- 鄰接性、連通性
4鄰域:假設(shè)有一點(diǎn)像素p坐標(biāo)為(x, y)喻旷,則它的4領(lǐng)域是(x + 1, y), (x - 1, y), (x, y + 1), (x, y - 1)
D鄰域:假設(shè)有一點(diǎn)像素p坐標(biāo)為(x, y), 則它的D領(lǐng)域是(x + 1, y + 1), ( x + 1, y - 1), (x - 1, y + 1)
(x - 1, y - 1)
8鄰域:將4領(lǐng)域與D領(lǐng)域的集合取并集生逸,即表示為8鄰域
4連通:對于在像素點(diǎn)p的4鄰域內(nèi)的像素均與像素點(diǎn)p形成4連通
8連通:對于在像素點(diǎn)p的8鄰域內(nèi)的像素均與像素點(diǎn)p形成8連通
3.2.2 主要介紹一下Canny邊緣檢測算法
Canny邊緣檢測算法 由計(jì)算機(jī)科學(xué)家 John F. Canny 于 1986 年提出,主要可以分為以下幾個(gè)步驟
- 圖像灰度化(降維處理)
def img_grey(img):
"""
Grey(i,j) = 0.3 * R(i,j) + 0.59 * G(i,j) + 0.11 * B(i,j)
"""
img_grey = np.dot(img[...,:3], [30, 59, 11])/100
return img_grey
-
高斯濾波(平滑和降噪)
高斯濾波主要使圖像變得平滑且预,減少噪聲槽袄,但同時(shí)也有可能增大了邊緣的寬度。其作用原理和均值濾波器類似锋谐,都是取濾波器窗口內(nèi)的像素的均值作為輸出遍尺,而其系數(shù)按照高斯函數(shù)離散化,具體如下:
如果不是很了解高斯函數(shù)涮拗,可以點(diǎn)擊跳轉(zhuǎn)
def gaussian_kernel(sigma,size):
"""
Create a (2r+1)x(2r+1) gaussian_kernel
H[i, j] = (1/(2*pi*sigma**2))*exp(-1/2*sigma**2((i-r-1)**2 + (j-r-1)**2))
Parameters
===========
sigma: Standard deviation
size: Kernel width size
"""
r = int(size/2)
kernel = np.zeros((size,size))
k_sum = 0
for i in range(size):
for j in range(size):
kernel[i, j] = np.exp((-1/(2*sigma**2)*(np.square(i-r) + np.square(j-r))))/(2*np.pi*sigma**2)
k_sum = k_sum + kernel[i, j]
# Normalized the kernel
kernel = kernel / k_sum
return kernel
利用高斯函數(shù)得到高斯核乾戏,進(jìn)行平滑濾波計(jì)算(神經(jīng)網(wǎng)絡(luò)里面的卷積運(yùn)算)
卷積掃描過程 https://mlnotebook.github.io/post/CNN1/
- 計(jì)算圖像梯度值和方向
圖像中的邊緣可以指向各個(gè)方向,因此Canny算法使用四個(gè)算子來檢測圖像中的水平三热、垂直和對角邊緣鼓择。邊緣檢測的算子(如Roberts,Prewitt就漾,Sobel等)返回水平Gx和垂直Gy方向的一階導(dǎo)數(shù)值呐能,由此便可以確定像素點(diǎn)的梯度G和方向theta 。
其中G為梯度強(qiáng)度抑堡, theta表示梯度方向摆出,arctan為反正切函數(shù)。下面以Sobel算子為例講述如何計(jì)算梯度強(qiáng)度和方向夷野。
x和y方向的Sobel算子分別為:
- 應(yīng)用非極大值抑制NMS
非極大值抑制是一種邊緣稀疏技術(shù)懊蒸,非極大值抑制的作用在于“瘦”邊。對圖像進(jìn)行梯度計(jì)算后悯搔,僅僅基于梯度值提取的邊緣仍然很模糊骑丸。對于標(biāo)準(zhǔn)3,對邊緣有且應(yīng)當(dāng)只有一個(gè)準(zhǔn)確的響應(yīng)妒貌。而非極大值抑制則可以幫助將局部最大值之外的所有梯度值抑制為0通危,對梯度圖像中每個(gè)像素進(jìn)行非極大值抑制的算法是:
(一) 將當(dāng)前像素的梯度強(qiáng)度與沿正負(fù)梯度方向上的兩個(gè)像素進(jìn)行比較。
(二) 如果當(dāng)前像素的梯度強(qiáng)度與另外兩個(gè)像素相比最大灌曙,則該像素點(diǎn)保留為邊緣點(diǎn)菊碟,否則該像素點(diǎn)將被抑制。
- 雙閾值檢測確定邊界
在施加非極大值抑制之后在刺,剩余的像素可以更準(zhǔn)確地表示圖像中的實(shí)際邊緣逆害。然而头镊,仍然存在由于噪聲和顏色變化引起的一些邊緣像素。為了解決這些雜散響應(yīng)魄幕,必須用弱梯度值過濾邊緣像素相艇,并保留具有高梯度值的邊緣像素,可以通過選擇高低閾值來實(shí)現(xiàn)纯陨。如果邊緣像素的梯度值高于高閾值坛芽,則將其標(biāo)記為強(qiáng)邊緣像素;如果邊緣像素的梯度值小于高閾值并且大于低閾值翼抠,則將其標(biāo)記為弱邊緣像素咙轩;如果邊緣像素的梯度值小于低閾值,則會(huì)被抑制阴颖。閾值的選擇取決于給定輸入圖像的內(nèi)容活喊。
確定上下兩個(gè)閥值,位于minVal之上的都可以作為候選邊緣膘盖,梯度大于maxVal的任何邊緣肯定是真邊緣胧弛,介于minVal和maxVal之間的像素點(diǎn),如果它們連接到“真邊緣”像素侠畔,則它們被視為邊緣的一部分结缚,否則也會(huì)被丟棄,這樣就可能提高準(zhǔn)確度软棺。
實(shí)現(xiàn)代碼:
import cv2
import matplotlib.pyplot as plt
import numpy as np
img = cv2.imread('1.png')
v1 = cv2.Canny(img, 80, 150)
# v2 = cv2.Canny(img, 50, 100)
# res = np.hstack((v1, v2))
cv2.imshow('origin', img)
cv2.imshow('res', v1)
cv2.waitKey(0)
cv2.destroyAllWindows()
效果圖:
3.3 幾何形狀檢測和擬合
-
點(diǎn)集的最小外包
點(diǎn)集是指坐標(biāo)點(diǎn)的集(即經(jīng)過Canny邊緣檢測提取出來的目標(biāo)物體的輪廓)红竭,如何確定邊緣是否滿足某種幾何形狀,如直線喘落、圓茵宪、橢圓等,或者擬合出邊緣像素點(diǎn)的最小外包圓瘦棋、矩陣稀火、凸包等幾何圖形。
計(jì)算圓心和半徑過程:
- 遍歷所有點(diǎn)赌朋,找出最左凰狞、最右、最上沛慢、最下的像素點(diǎn)赡若,分別標(biāo)位A/B/C/D。
- 求出這四個(gè)點(diǎn)的最小圓C1的圓心及半徑团甲。
- 遍歷所有點(diǎn)逾冬,檢查是否有點(diǎn)不在圓中,沒有則輸出圓C1。否則身腻,則繼續(xù)第4步产还。
- 找出圓外一點(diǎn)E(到圓C1圓心距離最遠(yuǎn)),則有四種組合:A/B/C/E嘀趟,A/B/D/E雕沉,A/C/D/E,B/C/D/E去件。
- 分別求出這四種組合的圓,例如C/B/D/E,求出圓C2后扰路,判斷A點(diǎn)是否在園C2內(nèi)尤溜,如果A在園C2內(nèi),則以圓C2為基礎(chǔ),遍歷所有點(diǎn)汗唱,判斷是否有點(diǎn)在圓外宫莱,有則重復(fù)第4步,沒有則輸出圓哩罪。
效果圖:
- 霍夫直線檢測
笛卡兒坐標(biāo)系中的直線與極坐標(biāo)中的點(diǎn)的對應(yīng)關(guān)系:
- 例如直線方程:y = 10 – x ,過xoy平面內(nèi)的點(diǎn)(5,5)授霸。
- 在極坐標(biāo)??????中點(diǎn)的位置(??/4,10/√2)。
- 過XOY平面內(nèi)的一點(diǎn)(????,????)有無數(shù)條直線际插,則對應(yīng)霍夫空間中的無數(shù)個(gè)點(diǎn)碘耳,這無數(shù)個(gè)點(diǎn)連接在一起就是??????坐標(biāo)系中的一條曲線方程: ??=???? * cos???+???? * sin??? )。如過(5框弛,5)的多條直線對應(yīng)的極坐標(biāo)中的曲線辛辨。
- 驗(yàn)證多個(gè)點(diǎn)是否共線(??1,??1)(x2,y2), …… , 則有多條曲線??=???? * cos???+???? * sin???。那些點(diǎn)對應(yīng)的霍夫空間曲線交于一點(diǎn)則判斷在xoy平面內(nèi)是共線瑟枫。
直線霍夫變換的應(yīng)用
- 霍夫圓檢測
- 在XOY坐標(biāo)系上有多個(gè)點(diǎn)A(x1,y1),B(x2,y2),C(x3,y3)斗搞、……,由于三點(diǎn)確定一圓慷妙,例如A,B,C三點(diǎn)確定一圓為(?????)2+(y?b)2=r^2 僻焚。
- 圓上任意一點(diǎn)(????,????)被映射到三維空間????????,該圓錐曲面表達(dá)式為(???????)^2+(?????b)2=r2 膝擂。
- XOY坐標(biāo)系上有多個(gè)點(diǎn)(x1,y1),(x2,y2),(x3,y3)虑啤、……,將圓上每一個(gè)點(diǎn)進(jìn)行映射形成一個(gè)圓錐面(??????? )^2+(??????? )2=r2 猿挚。
- 假如這些點(diǎn)所對應(yīng)的圓錐面都相交于一點(diǎn)(??,??,r)咐旧,則所有的點(diǎn)都在這三個(gè)參數(shù)所在的圓上。
霍夫圓檢測弊端:
標(biāo)準(zhǔn)霍夫直線檢測和圓檢測內(nèi)存消耗大绩蜻,執(zhí)行時(shí)間長铣墨,其中概率霍夫直線檢測和基于梯度的霍夫圓檢測是相應(yīng)的改進(jìn)方法。
直線檢測在真正程序?qū)崿F(xiàn)自變量0≤??≤〖180〗0有無數(shù)個(gè)直線穿過目標(biāo)點(diǎn)办绝,需要進(jìn)行離散化處理伊约,也就是設(shè)定一個(gè)增量???姚淆,通常取1?? 。而圓檢測也需要先固定r,則r必須給定一個(gè)半徑范圍[r_min,r_max]屡律,則圓心(a,b)的范圍中a為[-r_max,W-1+r_max]腌逢,b為[-r_max,H-1+r_max] 。