簡單的基於YCrCb顏色空間的人臉檢測(膚色)

2023-10-12 00:58

本文主要是介绍簡單的基於YCrCb顏色空間的人臉檢測(膚色),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

簡單的基於YCrCb顏色空間的人臉檢測(膚色)


http://www.cnblogs.com/blue-lg/archive/2011/12/07/2279879.html


環境:Windows XP+MATLAB 2010b

基本思路:

1)將基於彩色空間的RGB模型轉換為YCbCr模型(考慮到人臉的生理特征,只采取了Cr分量作為輔助)

2)閾值分割,根據多次實驗發現,正常黃種人的Cr分量大約在140~·160之間

3)濾波,本實驗采用性能較好的中值濾波

4)特征區域提取,利用matlab的bwlabel函數

5)對標記的特征區域利用高寬度之比和面積兩個指數來進一步簡化特征區域

 

具體實驗代碼及原理講解

1)rgb->ycbcr

%公式 Y = 0.2990*R + 0.5780*G + 0.1140*B + 0 
%公式 Cr = 0.5000*R - 0.4187*G - 0.0813*B + 128 
%公式 Cb = -0.1687*R - 0.3313*G + 0.5000*B + 128

(參見http://en.wikipedia.org/wiki/YCbCr)

本實驗直接采用mtalab自帶函數rgb2ycbcr()轉換就OK了。

I1=imread('blue_lg.jpg');
si=size(I1);
m=si(1);n=si(2);
img1=rgb2ycbcr(I1);
cr1=img1(:,:,3);%大小為mxn的二維矩陣

  

2)閾值分割

cr3=cr1;
for i=1:m
for j=1:n
if(cr3(i,j)>140&&cr3(i,j)<160)%140~160為本人實驗多次得到的合理值cr3(i,j)=255;
elsecr3(i,j)=0;
end
end
end

3)中值濾波器(本實驗采用的是5x5的子模板)

c_r=cr3;
for i=3:m-2for j=3:n-2;temp=cr3(i-2:i+2,j-2:j+2);%提取5x5區域temp1=sort(temp);%排序c_r(i,j)=temp1(13);%中值end
end

4)利用bwlabel進行特征區域提取

關於matlab函數bwlabel:[L, num] = bwlabel(BW, n);

根據領域的鏈接性質,將整個區域分為num個子區域,L為一矩陣,其中每個子區域在此矩陣中的值為子區域的序號。值得注意的是,序號為0的情況(我理解為背景,直接棄之不用)。n指的是領域性質,4鄰域or8鄰域。

舉個例子,

BW = logical ([1     1     1     0     0     0     0     01     1     1     0     1     1     0     01     1     1     0     1     1     0     01     1     1     0     0     0     1     01     1     1     0     0     0     1     01     1     1     0     0     0     1     01     1     1     0     0     1     1     01     1     1     0     0     0     0     0]);
3種背景顏色分別表示3個子區域,剩下的即為區域0,理解為背景吧。
對應生成的L矩陣即為
% L = bwlabel(BW,4);L =1     1     1     0     0     0     0     01     1     1     0     2     2     0     01     1     1     0     2     2     0     01     1     1     0     0     0     3     01     1     1     0     0     0     3     01     1     1     0     0     0     3     01     1     1     0     0     3     3     01     1     1     0     0     0     0     0
(參考mtlab自帶文檔)

我的做法是在當前路徑下重新定義了一個子函數findlimit()。

function [l,kk]=findlimit(I)
%l為已分類有序矩陣
%kk為特征區域的序號tt=size(size(I));
if tt(2)==3  %若I為3維矩陣,則需要轉換為灰度圖像J=rgb2gray(I);
else        %I為3維矩陣J=I;
end%[m,n]=size(J);[l,num]=bwlabel(J,8);
area=zeros(1,num+1);%面積
zhonghengbi=zeros(1,num+1);%比例
%re=zeros(num+1,4);
re1=zeros(num+1,2);
for k=0:num[r,c]= find(l==k);% re(k+1,1)=min(r);     %垂直方向最小值(上)% re(k+1,2)=max(r);    %垂直方向最大值(下)% re(k+1,3)=min(c);     %水平方向最小值(左)% re(k+1,4)=max(c);    %水平方向最大值(右)re1(k+1,1)=max(r)-min(r);%高度re1(k+1,2)=max(c)-min(c);%寬度zhonghengbi(k+1)=re1(k+1,1)/re1(k+1,2);%高寬比if(re1(k+1,2)==0) zhonghengbi(k+1)=0;end%防止出現單條垂直線的情況area(k+1)=re1(k+1,1)*re1(k+1,2);
endj=1;
for i=1:num+1if zhonghengbi(i)>0.2&&zhonghengbi(i)<3.0&&area(i)>1000
%高寬比設置為0.2~3.0之間,面積認為大於1000,注意面積為隨機項,與圖片大小有很大的關系kk(j)=i-1;j=j+1;end
end

5)把特征區域整個提取出來

在此之前定義了一個判斷序號是否在提取出的特征區域內的isson()函數,如下:

function x=isson(y,I)
x=0;
z=size(I);
for i=1:z(2)if(y==I(i))x=1;break;end
end

  

[l,kk]=findlimit(c_r);
J=l;
for i=1:mfor j=1:nif(l(i,j)~=0&&isson(l(i,j),kk)==1)J(i,j)=255;elseJ(i,j)=0;endend
end
figure;imshow(J,[]);

然後就可以達到最後的人臉頭像了。

原始圖像:

處理後

 

2原始圖像

處理後:

 

到這裡,本文即將完結,但是可能大家都注意到,許多圖像之中,由於手臂的膚色與人臉一致,以及背景不可避免的顏色巧合,導致最終的效果不是特別理想。

這裡主要討論手與臉的區分問題(考慮使用類圓相似度來解決,可能在下一篇中解決,當然這是後話)。


这篇关于簡單的基於YCrCb顏色空間的人臉檢測(膚色)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/192091

相关文章

QT開篇——一個簡單的文本查看器

打算趁着假期這幾天用QT寫一個簡單的計算器。所以便開始動手學習QT。所以這篇文章是我邊摸索邊寫的。其中肯定會有不對的地方。所以如果有哪位看我的博客的話,歡迎之出來錯誤。大家共同進步。 QT是一套跨平臺的應用程序開發框架,貌似遊戲爐石傳說就是用這個做出來的。 其實它和微軟年久失修的MFC都是MVC軟件設計模式的一種實現。至於MVC軟件設計模式,作爲一個剛入門的程序員我也說不清,我也說不了。大概意

Swit轉場動畫的簡單分析

首先, 我們得了解什麼是轉場動畫.  1. 轉場動畫即是對一個view呈現和關閉時所做的動畫, 叫轉場動畫.  動畫是如何做出來的呢? 一. 了解CALayer與CGContext和UIView之間的關係 1. 以前我們學習UIView的時候, 應該知道, 當創建一個UIView的時候,系統會默認將UIView的LayerClass設置為layer類型.那麼什麼是layer呢?  -1.

好的設計:易于擴展且能夠保持簡單、健壯

好的設計:易于擴展且能夠保持簡單、健壯。

RGB-YCrCb

今天对颜色一些格式转换有些不明白的地方,在网上找了一些文章,感谢原作者,现张贴如下:颜色空间是一个三维坐标系统,每一种颜色由一个点表示。在 RGB 颜色空间中,红,绿,蓝是基本元素。RGB 格式是显示器通常使用的格式。在 YUV 空间中,每一个颜色有一个亮度信号 Y,和两个色度信号 U 和 V。亮度信号是强度的感觉,它和色度信号断开,这样的话强度就可以在不影响颜色的情况下改变。YUV 格式通常用于

GCC簡單介紹

GCC簡單介紹 GCC 编译器在编译一个C语言程序时需要经过以下 4 步: 将C语言源程序预处理,生成.i文件。预处理后的.i文件编译成为汇编语言,生成.s文件。将汇编语言文件经过汇编,生成目标文件.o文件。将各个模块的.o文件链接起来生成一个可执行程序文件。 GCC查看版本 gcc 与 g++ 分别是 gnu 的 c & c++ 编译器. 在命令行提示符后键入$ cc --version

顏色漸變的特效!

例<body style="filter:progid:DXImageTransform.Microsoft.Gradient(gradientType='0',startColorstr='#00ffcc00',endcolorstr='#c099ccff') ">注:gradientType 可以是 1或是0startcolorstr 開始的顏色endcolorstr 結束時的顏色顏色

c++做存檔(很簡單)

今天來教怎麼做存檔 要加頭文件 #include<windows.h>#include<time.h>#include<conio.h>  認識個新函數: ifstream(輸入) and ofstream(保存) ifstream 隨便名字(“文件夾名字.類型”); 隨便名字>>變量(讀入) ofstream 隨便名字(“文件夾名字.類型”); 隨便名字<<變量(保存) 隨

【肤色检测 (I)】实测Ycrcb之cr分量+otsu阈值化

效果还不错,不过问题就是代码都是用的较老的opencv语法,里面有一些处理不好容易报错。。 #include "cv.h"#include "highgui.h"#include <opencv2/highgui/highgui.hpp>#include <opencv2/imgproc/imgproc.hpp>#include <opencv2/core/core.hpp>#i

OpenCV ycrcb颜色空间

Opencv中有一个Ycrcb的选项,这个选项其实是Yuv444packet. 下面代码从文件中获取到一个yuv444planar的文件,通过手动转换,将其转为YcrCb,然后进行颜色空间csc. 所以可以确定这是一个packet的存储格式 def yuv444p_2_bgr8_opencv(file, w, h):yuv444p = utils.io.load_file_to_ndarray

檢測項目簡體字

某些項目可能要求代碼中不允許使用簡體字 安裝stcheck檢查 yarn add stcheck --dev 在項目根目錄創建 st.config.json 文件 {"patterns": ["./**/*.(ts|js|tsx|jsx|vue|html)","!**/node_modules/**","!.git/**"],"gitignore": true,"ignoreTexts"