Matlab人脸检测算法详解
這是一個Matlab人臉檢測算法詳解
- 前言
- 人臉檢測結果
- 算法詳解
- 源代碼解析
- 所調用函數解析
- bwlabel(BW,n)
- regionprops
- rectangle
- 總結
前言
目前主流的人臉檢測與人臉識別算法主要基于人工神經網絡進行訓練與檢測,本文基于數字圖像處理解析一個非人工神經網絡的有趣人臉檢測算法。圖片與源碼可以從下文獲取或點擊這里獲取:積分下載材料點這里,百度云下載材料點這里,提取碼2333(可以的話積分下載支持一下呀)
人臉檢測結果
算法詳解
該算法主要通過識別二值圖像下的最大連通區域來檢測人臉,定義二值圖像中寬長比小于1.8的最大連通區域(mx)為人臉區域。再將P的左上角坐標作為識別框的左上角坐標,以mx在X軸的延伸長度作為識別框在X與Y的延伸長度,從而繪制出一個黃色2像素寬度的正方形識別框。框中的區域即為該算法所識別的人臉區域。
源代碼解析
clear all %清除工作臺中所有參數與數據
clc %清除界面i=imread('5.jpg'); %讀取所需預測的圖像
I=rgb2gray(i); %將該圖像轉換為灰度圖
BW=im2bw(I); %將灰度圖像轉換為二值圖像
figure(1);
imshow(BW);%將背景最小化處理
[n1, n2]=size(BW);
r=floor(n1/10);
c=floor(n2/10);
x1=1;x2=r;
s=r*c;for i=1:10y1=1;y2=c;for j=1:10if(y2<=c || y2>=9*c) || (x1==1 || x2==r*10)loc=find(BW(x1:x2,y1:y2)==0);[o,p]=size(loc);pr=o*100/s;if pr<=100BW(x1:x2,y1:y2)=0;r1=x1;r2=x2;s1=y1;s2=y2;pr1=0;endimshow(BW);endy1=y1+c;y2=y2+c;endx1=x1+r;x2=x2+c;
end
figure(2)
subplot(1,2,1);
imshow(BW)
title('二值圖像');L=bwlabel(BW,8); %找到連通區域,定義為8連通
BB=regionprops(L,'BoundingBox');%聯通區用邊界框框取包含連通區域的最小矩形
BB1=struct2cell(BB); %把結構體數組轉換成元胞數組,每個元胞中含有4個數據
BB2=cell2mat(BB1); %將元胞展開為行數為一的矩陣,BB2中元素的個數為BB1的4倍[s1,s2]=size(BB2);
mx=0; %mx為最大連通區域,初值為0
for k=3:4:s2-1 %k=3的取值為連通區域的X方向擴展長度,逐級加4,即遍歷每個連通區域的X長度p=BB2(1,k)*BB2(1,k+1); %p為連通區域的面積if p>mx && (BB2(1,k+1)/BB2(1,k))<1.8 %選區寬長比大于1.8的最大連通區域mx=p;j=k;end
endsubplot(1,2,2);
title('人臉檢測');
imshow(I);
hold on;
rectangle('Position',[BB2(1,j-2),BB2(1,j-1),BB2(1,j),BB2(1,j)],'EdgeColor','y','LineWidth',2);
%rectangle各參數為:起點坐標,顏色,寬度
所調用函數解析
imread(‘5.jpg’);
讀取圖像
rgb2gray(i)
將該圖像轉換為灰度圖,參數i為讀取的圖像
im2bw(I)
將灰度圖像轉換為二值圖像,參數I為灰度圖像
floor(n);
朝負無窮大方向取整,參數n為任意數,對于復數,分別對實部和虛部取整
figure(1);
定義繪制圖像的名稱
imshow(I);
繪制圖像,參數I為圖像名稱
subplot(m,n,p);
將多個圖畫到一個平面上的工具。其中,m表示是圖排成m行,n表示圖排成n列,p表示圖所在的位置,p=1表示從左到右從上到下的第一個位置,p也可以為矩陣以表示其他行列
bwlabel(BW,n)
L=bwlabel(BW,n);
定義一個與BW大小相同的L矩陣,其中n的值為4或8,表示定義4連通或8連通
4連通:一個像素的上下左右4個方向有相鄰的像素,則認為他們是連接的,這些像素的組成區域為4連通區域。
8連通:一個像素的上下左右,上左上右下左下右8個方向有相鄰的像素,則認為他們是連接的,這些像素的組成區域為8連通區域。
例如:
BW =
1 1 1 0 0 1 1 0 0
1 1 1 0 0 1 1 0 0
1 1 1 0 1 1 1 1 0
1 1 1 0 0 1 1 0 0
0 0 0 0 0 1 1 0 0
1 1 1 0 0 0 0 1 1
1 1 1 0 0 0 0 1 1
1 1 1 0 0 0 0 1 1
1 1 1 1 1 0 0 1 1
則L=bwlabel(BW,4)為(相同數字表示在同一個連通區域):
L =
1 1 1 0 0 2 2 0 0
1 1 1 0 0 2 2 0 0
1 1 1 0 2 2 2 2 0
1 1 1 0 0 2 2 0 0
0 0 0 0 0 2 2 0 0
3 3 3 0 0 0 0 4 4
3 3 3 0 0 0 0 4 4
3 3 3 0 0 0 0 4 4
3 3 3 3 3 0 0 4 4
例如:
L=bwlabel(BW,8)為(相同數字表示在同一個連通區域):
L =
1 1 1 0 0 2 2 0 0
1 1 1 0 0 2 2 0 0
1 1 1 0 2 2 2 2 0
1 1 1 0 0 2 2 0 0
0 0 0 0 0 2 2 0 0
3 3 3 0 0 0 0 2 2
3 3 3 0 0 0 0 2 2
3 3 3 0 0 0 0 2 2
3 3 3 3 3 0 0 2 2
regionprops
BB=regionprops(L,‘BoundingBox’);
regionprops可以帶有多種參數,BoundingBox表示為選區取包含連通區域的最小矩形
返回的結果為【x,y,w,h】,其中x與y為該矩形的左上角坐標,w與h為x與y方向上的延伸長度即矩形的長與寬。此外,其他參數及意義為:
Area:各區域像素總和
Centroid: 各區域重心
ConvexHull:包含該區域的最小凸多邊形
EquivDiameter:與該區域具有相同面積的圓的直徑
Image:與某區域具有相同大小的邏輯矩陣
FilledImage:與某區域具有相同大小的填充邏輯矩陣
FilledArea:填充區域圖像中的on像素個數
ConvexArea: 填充區域凸多邊形圖像中的on像素個數
EulerNumber:幾何拓撲中的一個拓撲不變量——歐拉數
Extrema:八方向區域極值點’
Solidity: 同時在區域和其最小凸多邊形中的像素比例’
Extent:同時在區域和其最小邊界矩形中的像素比例
PixelIdxList: 存儲區域像素的索引下標
PixelList: 存儲上述索引對應的像素坐標
BB1=struct2cell(BB);
把結構體數組轉換成元胞數組,每個元胞元胞的元素為【x,y,w,h】
BB2=cell2mat(BB1);
將元胞展開為行數為一的矩陣,BB2中元素的個數為BB1的4倍
rectangle
rectangle(‘Position’,[x,y,w,h],‘EdgeColor’,‘y’,‘LineWidth’,2)
該函數為選取框繪制函數,【x,y,w,h】與上述參數含義相同
EdgeColor為顏色參數
LineWidth為邊框線寬度參數
‘Curvature’,[1,1]表示x,y方向上的曲率都為1,即為圓弧
Facecolor為內填充顏色參數
等等
總結
這個算法雖然只是通過玩弄這些像素來實現人臉檢測,精度有限,但是如果想要進行后續的人臉識別,這或許的一個減少手工標注數據集的好方法
總結
以上是生活随笔為你收集整理的Matlab人脸检测算法详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JAVA Web项目中所出现错误及解决方
- 下一篇: 【python】 OSError:sif