我们前面已经学习了一些图像处理算法的应用,那么本次实验将进行一个比较综合的项目。本次算法中,我们将利用肤色模型检测算法定位人脸的位置。这篇文章我们首先利用MATLAB实现该算法,等到下一篇文章再用FPGA实现该算法。
整个项目的流程图如上图,我们利用上面的程序框图进行书写便可以完成图像定位。
首先将图像从RGB格式转换成YCrCb格式,其中Y是亮度信息、Cr表示红色信息、Cb表示绿色信息。转换成此格式的原因是为了将亮度相关的信息取消掉,进而利用蓝色分量、蓝色分量判断出哪里是肤色。
RGB格式转换成YCrCb的公式如下:
经过数据分析,肤色的分量处于下面的范围:
只要处于此范围内的分量我们就认为是皮肤,可以看出我们的算法是比较粗糙的,但是经过之后的腐蚀效果发现效果比较好。
在肤色检测之后,由于有一些与肤色接近的颜色产生了噪声,需要对肤色检测后的数据进行形态学滤波,即只保留脸部的形状。
基本的形态学滤波包括:腐蚀、膨胀、开运算、闭运算。
开运算:先腐蚀再膨胀
闭运算:先膨胀后腐蚀
在我们的项目中我们利用到了图像腐蚀操作,按理说利用开运算最合理。
对滤波后的图像进行计算白色区域的边界的坐标:x_min,x_max,y_min,y_max。但是这种方法必须使得图像腐蚀之后的图像只有脸部信息。
然后对上面的边界进行定位,利用上面的边界信息进行画框,然后框住人脸。
整个流程特别简单,相信大家可以学会。至于具体的边界定位和利用边界进行画框如何实现在下面的代码中有详细的介绍,从代码中可以学的更好,这里不再多加赘述。
上面的MATLAB的代码如下:
clc;
clear all;
close;
image = imread('aaa.bmp');
image_red = image(:,:,1);
image_green = image(:,:,2);
image_blue = image(:,:,3);
[ROW,COL] = size(image_red);
figure(1)
imshow(image);
title('原图');
YCbCr = rgb2ycbcr(image);
Y = YCbCr(:,:,1);
Cb = YCbCr(:,:,2);
Cr = YCbCr(:,:,3);
pic_gray = zeros(ROW,COL);
for i = 1:ROW
for j = 1:COL
if(Cb(i,j) > 77 && Cb(i,j) < 127 && Cr(i,j) > 133 && Cr(i,j) < 173)
pic_gray(i,j) = 255;
else
pic_gray(i,j) = 0;
end
end
end
figure(2)
imshow(pic_gray);
title('肤色检测图');
se = strel('square',20);
erode = imerode(pic_gray,se);
figure(3)
imshow(erode);
title('形态学滤波');
x_min = 1024;
x_max = 0;
y_min = 768;
y_max = 0;
for i = 1:ROW
for j = 1:COL
if(erode(i,j) > 0 && x_min > j)
x_min = j;
end
if(erode(i,j) > 0 && x_max < j)
x_max = j;
end
end
end
for i = 1:ROW
for j = 1:COL
if(erode(i,j) > 0 && y_min > i)
y_min = i;
end
if(erode(i,j) > 0 && y_max < i)
y_max = i;
end
end
end
for i = 1:ROW
for j = 1:COL
if(j == x_min && i >= y_min && i <= y_max)
image_test(i,j,1) = uint8(255);
image_test(i,j,2) = uint8(255);
image_test(i,j,3) = uint8(255);
elseif(j == x_max && i >= y_min && i <= y_max)
image_test(i,j,1) = uint8(255);
image_test(i,j,2) = uint8(255);
image_test(i,j,3) = uint8(255);
elseif(i == y_max && j >= x_min && j <= x_max)
image_test(i,j,1) = uint8(255);
image_test(i,j,2) = uint8(255);
image_test(i,j,3) = uint8(255);
elseif(i == y_min && j >= x_min && j <= x_max)
image_test(i,j,1) = uint8(255);
image_test(i,j,2) = uint8(255);
image_test(i,j,3) = uint8(255);
else
image_test(i,j,1) = image(i,j,1);
image_test(i,j,2) = image(i,j,2);
image_test(i,j,3) = image(i,j,3);
end
end
end
%subplot(2,2,4);
figure(4)
imshow(image_test);
title('头像检测');
从上面的程序再结合我们前面的描述,可以很好的学习图像的定位方法。
原图:
肤色检测图:
算法腐蚀之后:
图像定位之后:
经过上面的仿真结果,我们成功对自己的人脸进行定位。证明了算法的有效性。接下来我们将利用FPGA实现上面的流程,明白了上面MATLAB的算法流程,改变成FPGA实现是比较简单的。
1、开源骚客
创作不易,认为文章有帮助的同学们可以关注、点赞、转发支持。(txt文件、图片文件在群中)对文章有什么看法或者需要更近一步交流的同学,可以加入下面的群: