摘要:为了实现人体的肤色检测,本文将原始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('中值滤波后的图像'); %相比腐蚀,中值滤波效果更好
实验结果如下: