对人眼视觉系统的研究表明,人类对形状的感知一般通过识别边缘、轮廓、前景和背景而形成。在图像处理中,边缘信息也十分重要。边缘是图像中亮度突变的区域,通过计算局部图像区域的亮度差异,从而检测出不同目标或场景各部分之间的边界,是图像锐化,图像分割、区域形状特征提取等技术的重要基础。图像锐化(Image Sharpening)的目的是加强图像中景物的边缘和轮廓,突出图像中的细节或增强被模糊了的细节。
对非肤色部分进行初步过滤
function Out=FirstFilter(In) % 第一次滤波
Out=In;
[height,width,c] = size(In); % 获取输入图像尺寸信息
IR=In(:,:,1); IG=In(:,:,2);IB=In(:,:,3); % 分别获取三个通道
for j=1:height
for i=1:width
if (IR(j,i)<160/255 && IG(j,i)<160/255 && IB(j,i)<160) && (IR(j,i)>IG(j,i) && IG(j,i)>IB(j,i)) % 分别查看各像素点IR IB IG根据取值复制相应像素点值
Out(j,i,:)=0; % 赋值0
end
if IR(j,i)+IG(j,i)>500/255 % IG + IR 值大于500/255 时置输出值为0
Out(j,i,:)=0;
end
if IR(j,i)<70/255 && IG(j,i)<40/255 && IB(j,i)<20/255
Out(j,i,:)=0;
end
end
end
figure,imshow(Out);title('非肤色初步过滤');
end
将RGB颜色模型转化为YCgCr颜色模型,使用中值滤波对图像进行中值滤波
function Out=SecondFilter(In) % 第二次滤波
IR=In(:,:,1); IG=In(:,:,2);IB=In(:,:,3);
[height,width,c] = size(In); % 获取图像size
Out=zeros(height,width); % 根据size创建空矩阵
for i=1:width
for j=1:height
R=IR(j,i); G=IG(j,i); B=IB(j,i); % R G B 赋值
Cg=(-81.085)*R+(112)*G+(-30.915)*B+128; % 颜色模型转换
Cr=(112)*R+(-93.786)*G+(-18.214)*B+128;
if Cg>=85 && Cg<=135 && Cr>=-Cg+260 && Cr<=-Cg+280 % 根据转换颜色模型后 各值的大小得输出
Out(j,i)=1; % 对像素值赋值1
end
end
end
Out=medfilt2(Out,[3 3]); % 中值滤波 中值滤波medfilt2,用法是B = medfilt2(A, [m n]),输入图像A应是二维矩阵,
% 程序中输入图像h是由imread得到的I加上噪声得到的,而imread读到的图像I通常是3维RGB图,
% 是三维矩阵,因此才出现问题,显示A应该为二维的。
figure,imshow(Out),title('YCgCr空间范围肤色检测'); % 输出图像
end
ImageOrigin(双精度化后图像),DBImage(双边滤波后图像),SkinArea(YCgCr空间范围肤色检测处理后图像)
使用三种分别处理图像进行融合计算
function Out=Fuse(ImageOrigin,DBImage,SkinArea)
Skin=zeros(size(ImageOrigin)); % 创建与ImageOrigin的size相等的空矩阵
Skin(:,:,1)=SkinArea; % 通道赋值
Skin(:,:,2)=SkinArea;
Skin(:,:,3)=SkinArea;
Out=DBImage.*Skin+double(ImageOrigin).*(1-Skin); % 输出图像计算公式
figure,imshow(Out);title('肤色与背景图像融合'); % 输出肤色检测图像
end
双边滤波器用于平滑图像并减少噪声,同时保留边缘,是一种非线性双边滤波器。双边滤波的核函数是空间域核与像素范围域核的综合结果:
function Out=DBfilt(In)
[height,width,c] = size(In); % 获取输入相关参数 高 宽 通道
win=15; % 定义双边滤波窗口宽度
sigma_s=6; sigma_r=0.1; % 双边滤波的两个标准差参数
[X,Y] = meshgrid(-win:win,-win:win); % 生成二维网格矩阵
Gs = exp(-(X.^2+Y.^2)/(2*sigma_s^2)); % 计算邻域内的空间权值
Out=zeros(height,width,c); % 生成相关参数的空矩阵
for k=1:c
for j=1:height
for i=1:width
temp=In(max(j-win,1):min(j+win,height),max(i-win,1):min(i+win,width),k);
Gr = exp(-(temp-In(j,i,k)).^2/(2*sigma_r^2)); % 计算灰度邻近权值
% W为空间权值Gs和灰度权值Gr的乘积
W = Gr.*Gs((max(j-win,1):min(j+win,height))-j+win+1,(max(i-win,1):min(i+win,width))-i+win+1); % Gs * Gr
Out(j,i,k)=sum(W(:).*temp(:))/sum(W(:));
end
end
end
figure,imshow(Out),title('双边滤波');
end
拉普拉斯锐化图像是根据图像某个像素的周围像素到此像素的突变程度有关,也就是说它的依据是图像像素的变化程度。我们知道,一个函数的一阶微分描述了函数图像是朝哪里变化的,即增长或者降低;而二阶微分描述的则是图像变化的速度,急剧增长下降还是平缓的增长下降。那么据此我们可以猜测出依据二阶微分能够找到图像的色素的过渡程度,例如白色到黑色的过渡就是比较急剧的。
应用:
function Out=Sharp(In)
H=[0 -1 0;-1 5 -1;0 -1 0]; %Laplacian锐化模板 拉普拉斯算子
Out=imfilter(In,H); % 拉普拉斯算子锐化滤波
% Out=Out/3+In; % 输出值/3 + 输入值
% imwrite(Out,'man4.jpg');
figure,imshow(Out),title('Laplacia锐化图像');
end