%%
%编写一个基于YCbCr色彩空间的肤色分割程序
%YCbCr是DVD、摄像机、数字电视等消费类视频产品中常用的色彩编码方案
%YCbCr在模拟分量视频(analog component video)中也被常称为YPbPr
%常见的3个基本色彩模型是RGB、CMYK、YUV
%YCbCr其中Y是指亮度分量,Cb指蓝色色度分量,而Cr指红色色度分量
%YCbCr与RGB的相互转换 来自baidu
%Y=0.299R+0.587G+0.114B
%Cb=0.564(B-Y)
%Cr=0.713(R-Y)
%R=Y+1.402Cr
%G=Y-0.344Cb-0.714Cr
%B=Y+1.772Cb
%来自 wiki
%YPbPr (analog version of Y'CbCr) from R'G'B'
%Y' = Kr * R' + (1 - Kr - Kb) * G' + Kb * B'
%Pb = 0.5 * (B' - Y') / (1 - Kb)
%Pr = 0.5 * (R' - Y') / (1 - Kr)
....................................................
%R', G', B' in [0; 1]
%Y' in [0; 1]
%Pb in [-0.5; 0.5]
%Pr in [-0.5; 0.5]
%人脸检测算法:
%1.精确定位人脸检测候选区
%2.验证已侦测人脸候选区的面部特征
%先要估算和纠正基于光补偿技术的肤色模型,在进行色彩空间的非线性转换
%空间转换的椭圆肤色模型,参数式的椭圆就相当于假设的肤色高斯分布下的马氏距离常数
%检测到得肤色像素被反复的分割成局部颜色变化来连接基于这些部分的空间排列和类似他们颜色人脸候选区
%候选出来的大小能在13*13的像素和大约是输入图像大小的3/4之间变动。
%面部特征检测模块抑制了不包括任何面部特征
%Color Image --> Lighting Compensation --> Color Space Transformation
%--> Skin Color Detection --> Variance-based Segmentation -->
%Connected Component & Grouping --> Eye/Mouth Detection -->
%Face Boundary Detection --> Verifying/Weighting Eyes-Mouth Triangles
%%
%basic operation
clc;
clear all;
close all;
img = imread('2.jpg');
figure ;imshow(img);title('原始图像');
[row col dim] = size(img);
img_double = double(img);
%get RGB channel
R = img_double(:,:,1);G = img_double(:,:,2);B = img_double(:,:,3);
figure ;
subplot(1,3,1);imshow(uint8(R));title('红色分量');
subplot(1,3,2);imshow(uint8(G));title('绿色分量');
subplot(1,3,3);imshow(uint8(B));title('蓝色分量');
%%
%convert RGB space to YcbCr-color space
R = double(R);G = double(G);B = double(B);
H =[65.4810 128.5530 24.9660;
-37.7970 -74.2030 112.0000;
112.0000 -93.7860 -18.2140];
% I = H/(sum(sum(H)));%按照常规进行矩阵的归一化
I = H/255;%颜色像素空间的标准归一化
Ymax = 235;Ymin = 16;
img_YCbCr(:,:,1) = I(1,1)*R+I(1,2)*G+I(1,3)*B+16;
img_YCbCr(:,:,2) = I(2,1)*R+I(2,2)*G+I(2,3)*B+128;
img_YCbCr(:,:,3) = I(3,1)*R+I(3,2)*G+I(3,3)*B+128;
if(img_YCbCr(:,:,1) > Ymax)
img_YCbCr(:,:,1) = Ymax;
elseif(img_YCbCr(:,:,1)<Ymin)
img_YCbCr(:,:,1)=Ymin;
end
if(img_YCbCr(:,:,2) > Ymax)
img_YCbCr(:,:,2) = Ymax;
elseif(img_YCbCr(:,:,2)<Ymin)
img_YCbCr(:,:,2)=Ymin;
end
if(img_YCbCr(:,:,3) > Ymax)
img_YCbCr(:,:,3) = Ymax;
elseif(img_YCbCr(:,:,3)<Ymin)
img_YCbCr(:,:,3)=Ymin;
end
%%
%在YCbCr色彩空间里做肤色检测,椭圆模型检测Cb和Cr
y=img_YCbCr(:,:,1);
Cx = 109.38;Cy = 152.02;theta = 2.53;
ecx = 1.60;ecy = 2.41;a = 25.39;b = 14.03;
img_bin = zeros(row,col);
for i=1:row
for j=1:col
temp=cos(theta)*(img_YCbCr(i, j, 2) - Cx)+...
sin(theta)*(img_YCbCr(i, j, 3) - Cy);
y(i,j)=-sin(theta)*(img_YCbCr(i, j, 2) - Cx)+...
cos(theta)*(img_YCbCr(i, j, 3) - Cy);
lea = (temp - ecx).^2 / (a^2) + (y(i, j) - ecy).^2 / (b^2);
if(lea<=1) %将可能为肤色的点标记为白色
img_bin(i,j) = 255;
end
if(img_YCbCr(i,j,1) <= 80) %去除图像中色彩很暗的点
img_bin(i,j) = 0;
end
end
end
%%
%show image
img_YCbCr = uint8(img_YCbCr);
figure ;imshow(img_YCbCr);title('YCBCR模型');
figure ;
subplot(1,3,1);imshow(img_YCbCr(:,:,1));title('Y分量');
subplot(1,3,2);imshow(img_YCbCr(:,:,2));title('CB分量');
subplot(1,3,3);imshow(img_YCbCr(:,:,3));title('CR分量');
figure ;imshow(img_bin);title('分割');
%用3*3模板对二值图像进行膨胀操作
se = strel('diamond', 3);
img_bin = imdilate(img_bin, se);
figure ;
subplot(3,2,1);imshow(img_bin);title('diamond-膨胀');
se = strel('square', 3);
img_bin = imdilate(img_bin, se);
subplot(3,2,2);imshow(img_bin);title('square-膨胀');
se = strel('pair', [1,1]);
img_bin = imdilate(img_bin, se);
subplot(3,2,3);imshow(img_bin);title('pair-膨胀');
se = strel('disk', 3);
img_bin = imdilate(img_bin, se);
subplot(3,2,4);imshow(img_bin);title('disk-膨胀');
se = strel('rectangle', [1,3]);
img_bin = imdilate(img_bin, se);
subplot(3,2,5);imshow(img_bin);title('rectangle-膨胀');
se = strel('octagon', 3);
img_bin = imdilate(img_bin, se);
subplot(3,2,6);imshow(img_bin);title('octagon-膨胀');
分享到:
相关推荐
这是用来检测肤色的matlab代码,已调试,下载后可直接用,希望对大家有帮助。
基于matlab的人脸检测KL的人脸识别基于肤色分割和特征提取-fdv41.zip 基于MATLAB的彩色图像皮肤区域分割算法研究与实现 人脸检测系统
matlab肤色检测, ycbcr效果一般
基于RGB颜色空间的简单阈值肤色识别,matlab代码
将RGB彩色图像转换为YCBCR图像,利用亮度和色度相关性小的特点,在YB{95,168},YC{132,171}的区间内检测肤色,本代码对检测基本方法的实现具有参考价值
毕设做的人脸检测,用的是matlab,首先进行了模板匹配的模板制作。在进行模板匹配。
基于matlab肤色人脸检测系统,基于matlab肤色人脸检测系统,基于matlab肤色人脸检测系统,
人脸肤色检测matlab,基于ycc肤色模型
打开main.m文件,按下F5即可开始运行,根据弹出框的提示进行操作,最终可实现人脸检测
基于ycbcr空间的MATLAB人脸检测代码,非常简单,注释和代码都写得很好,新手也可以很容易看懂。
本文提出了一种基于肤色信息和眼睛粗略定位的人脸检测算法。该算法先对 Anil K.Jain的 Cb 、 Cr 椭圆聚类方法进行了改进,用改进的算法进行肤色提取,经过肤色区域的分析,对人脸区域进行预检测,确定人脸可能区域,...
经典的高斯混合模型背景建模+肤色检测的Matlab实现
基于彩色模型设计一个简单的肤色检测器。 内含MATLAB文件、xlsx文件、训练图片、测试图片以及实验报告。
基于肤色的人脸检测程序,件检测结果进行显示。
资源名:基于肤色检测再用Adaboost人脸检测_肤色检测_Adaboost_人脸检测_matlab 资源类型:matlab项目全套源码 源码说明: 全部项目源码都是经过测试校正后百分百成功运行的,如果您下载后不能运行可联系我进行指导...
MATLAB肤色分割程序 将照片转换成黑白二色 以区分皮肤以及其他
自己写的一个基于肤色模型的人脸检测的matlab代码。
基于肤色的人脸识别定位Matlab程序,包含GUI界面,提出利用候选人脸图像区域和模板质心作为配准的原点,抑制人脸图像噪声的干扰。最后构建了基于肤色分割和模板验证的人脸检测试验系统,并对该系统采用自制人脸图像...