基于matlab的高斯模型肤色检测

       摘要:为了实现人体的肤色检测,本文将原始RGB图像转换为YCbCr图像,之后利用肤色的高斯模型,计算输入图像与肤色图像的相似度,从而将输入图像中的肤色分割出来,最后经过简单的去噪处理,可实现图像的肤色检测与分割。

       原理:计算机采集的图像大都为RGB图像,研究发现,肤色图像在YCbCr空间中,以Cb、Cr为维度的二维空间,肤色图像符合高斯模型,故我们首先把RGB图像转换到YCbCr空间中。然后通过计算输入图像和肤色高斯模型之间的相似度,设立合理的阈值,将肤色分割出来。最后通过去噪处理,效果更好。

       matlab代码详解如下: 

RGB_data = imread('E:\qq\毕设\test\1.PNG');      %图像读入
figure(1),imshow(RGB_data),title('RGB图像');      %显示原rgb图像
R_data = RGB_data(:,:,1);
G_data = RGB_data(:,:,2);
B_data = RGB_data(:,:,3);      %提取原图的R,G,B分量
[ROW,COL,DIM] = size(RGB_data); %提取图片的行列数

Y_data = zeros(ROW,COL);
Cb_data = zeros(ROW,COL);
Cr_data = zeros(ROW,COL);
YCbCr_data = RGB_data;  %建立ycbcr图像数据以及各个分量数据

for r = 1:ROW 
    for c = 1:COL
        Y_data(r, c) = 0.299*R_data(r, c) + 0.587*G_data(r, c) + 0.114*B_data(r, c);
        Cb_data(r, c) = -0.16874*R_data(r, c) - 0.33126*G_data(r, c) + 0.5*B_data(r, c) + 128;
        Cr_data(r, c) = 0.5*R_data(r, c) - 0.41869*G_data(r, c) - 0.08131*B_data(r, c) + 128;
    end
end                 %按照rgb转为ycbcr的系数进行转换,也可直接用函数rgb2ycbcr转换

YCbCr_data(:,:,1)=Y_data;
YCbCr_data(:,:,2)=Cb_data;
YCbCr_data(:,:,3)=Cr_data;   %将得到的y cb cr分量传到ycbcr图像中
figure(2);imshow(YCbCr_data),title('YCbCr图像');  %显示转换后的ycbcr图像

M = [124.2125 132.9449]'  ; %肤色均值
Sigma = [75.3881  40.2587
                40.2587   250.2942];  %肤色方差  此均值和方差为经验值,经过大数据统计得到
Img2 = double(YCbCr_data);
cbcr = zeros(2,1); %建立cb cr分量数据,为2*1的矩阵
BinImg=Y_data;    %建立二值化后的图像,即实现手势分割
for u = 1:ROW
    for v =1:COL
        cbcr(1) = Img2(u,v,3); 
        cbcr(2) = Img2(u,v,2);  %提取图像(u,v)点的cb cr分量
        P(u,v) = exp(-0.5*((cbcr-M)')*(inv(Sigma))*(cbcr-M));  %公式,计算输入图像与肤色高斯模型之间的似然度
        if P(u,v) < 0.01    %0.01为阈值,为实验值,不同图像可能取的值不同
             BinImg(u,v) = 255;
        else 
             BinImg(u,v) = 0;%生成二值图像。
        end     
    end
end
for i= 1:ROW
    for j = 1:COL
        MAX = max(max(P));
        Q(i,j) = (P(i,j)/MAX)*255;  %因为p取值为0-1,还原为0-255需乘以255
    end
end
figure(3),imshow(Q,[]),title('肤色似然图');       
figure(4),imshow(BinImg),title('二值化');  %手势分割结束。由二值化结果可以看出分割效果并不好,存在一些噪声,以下为去噪过程,我对比了腐蚀和中值滤波两种操作


% se1=strel('disk',3);%strel函数的功能是运用各种形状和大小构造结构元素,这里是创建一个半径为3的平坦型圆盘结构元素
% result=imerode(BinImg,se1); %腐蚀操作会使手变小,效果并不好

result=medfilt2(BinImg,[9,9]);  %matlab中自带中值滤波函数
figure(5),imshow(result);title('中值滤波后的图像'); %相比腐蚀,中值滤波效果更好

实验结果如下:

基于matlab的高斯模型肤色检测_第1张图片

 

基于matlab的高斯模型肤色检测_第2张图片

 

   

你可能感兴趣的:(基于matlab的高斯模型肤色检测)