求解答,关于matlab实现肤色检测

2019-04-09 11:52:01
%% 基于RGB颜色空间皮肤识别:
clc,clear,close all
%% 读取原始影像(因imread默认以RGB形式读取影像三通道数据)
RGB=imread('1.png');
%% 颜色空间转换(RGB-->YCbCr)
YCbCr=rgb2ycbcr(RGB);%RGB TO YCBCR Y=YCbCr(:,:,1) ; %Y通道
Cb=YCbCr(:,:,2) ; %Cb通道
Cr=YCbCr(:,:,3) ; %CR通道
%% 初始化YI个影像矩阵数组,用来存放后期的处理结果
I2=RGB;%存放RGB空间处理结果
%% 获取图像尺寸rows,columns:行,列
[rows,columns]=size(RGB(:,:,1));
%% 参量设定
k=(2.53/180)*pi; m=sin(k); n=cos(k);
cx=109.38;cy=152.02;ecx=1.60;
ecy=2.41;a=25.39;b=14.03;



%% 依据RGB颜色空间进行行列循环处理
%依据:R通道的数值与某阈值进行比较
%依据:YCbCr转RGB的公式为 R=1.164(Y-16)+1.596(Cr-128);
R=RGB(:,:,1);
for i=1:rows
for j=1:columns
if Y(i,j)<1.1654*(80-16)+1.596*((Cr(i,j))-128)%R=f(Y)
I2(i,j,:)=0;
elseif(R(i,j)<=1.1654*(230-16)+1.596*((Cr(i,j))-128)&&R(i,j)>=1.1654*(80-16)+1.596*((Cr(i,j))-128))%R=f(Y)
x=(double(Cb(i,j))-cx)*n+(double(Cr(i,j))-cy)*m;
y=(double(Cr(i,j))-cy)*n-(double(Cb(i,j))-cx)*m;
if((x-ecx)^2/a^2+(y-ecy)^2/b^2)<=1
I2(i,j,:)=255;
else I2(i,j,:)=0;
end;

elseif R(i,j)>1.1654*(230-16)+1.596*((Cr(i,j))-128)%R=f(Y)
x=(double(Cb(i,j))-cx)*n+(double(Cr(i,j))-cy)*m;
y=(double(Cr(i,j))-cy)*n-(double(Cb(i,j))-cx)*m;
if((x-ecx)^2/(1.1*a)^2+(y-ecy)^2/(1.1*b)^2)<=1
I2(i,j,:)=255;
else I2(i,j,:)=0;
end
end
end
end
%% 绘图
figure('name','基于不同颜色空间皮肤识别','color','w');
subplot(1,2,1);
imshow(RGB);title('原始影像');
subplot(1,2,2);
imshow(I2);title('基于RGB空间的皮肤识别');


可以来个大佬说说中间那个参数设置是怎么出来的么?还有中间的那个if语句,是和什么原理有关呀?有什么算法么?
...全文
136 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

249

社区成员

发帖
与我相关
我的任务
社区描述
其他产品/厂家
社区管理员
  • 其他
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧