【图像处理】人眼区域分割(1)

人眼区域分割(1)

通过尝试计算水平灰度曲线来定位人眼。因为人眼周围灰度变化明显,可以通过灰度曲线图来确定眼睛所在的水平方向坐标。
##步骤:

  1. 灰度化

  2. 求水平方向的灰度投影曲线

    P ( i ) = ∑ j = 1 n M ( i , j ) P(i)= \sum\limits_{j=1}^{n}M(i,j) P(i)=j=1nM(i,j)

图像在内存中庸MxN的矩阵存储,i,j为矩阵的行列。图像的水平灰度投影曲线,其横坐标为矩阵的行号,纵坐标为矩阵每行元素之和(即为图片中每行像素值的和)。则该曲线实则包含了图像每行像素值和的变化。

  1. 在灰度曲线求取的基础上,求出该曲线的波峰和波谷,因黑色灰度值为0,白色的灰度值为255,则在波谷中包含眼睛等灰度值较小区域的坐标信息。实现方法:用matlab的findpeaks.

pks = findpeaks(data)
[pks,locs] = findpeaks(data)
pks为峰值,locs为峰值所在横坐标值

  1. 对波峰波谷横坐标所代表的图像的行信息画出,在这里注意对应关系

|——————————x(矩阵的列标)
|
|
|
|
|
y(矩阵的行标)

灰度投影曲线的波谷与人脸图片的具体对应关系:

波峰和波谷对应的人脸矩阵的行:

##需要注意的地方:
要对该水平投影曲线进行一定的平滑处理,使曲线避免小幅抖动。使波峰波谷定位稳定便于下一步提取包含眼睛区域的图片。

利用滤波函数平滑曲线:

平滑曲线与未平滑对应的图片的行号,(红色为平滑后,绿色为未平滑):

平滑之后条数变少,干扰变少
##实现:
利用matlab实现并验证正确性,因为matlab内有丰富的数学函数。

matlab代码:

clear;
close all;
%求图像的水平方向灰度投影曲线
img=imread('face9.jpg');
gray=rgb2gray(img);
row=size(gray,1);
col=size(gray,2);
%[m,n]=size(img);
%若在未转换为灰度图片时矩阵的列元素为灰度的列元素乘以3
for i=1:row%行
	count(i)=sum(img(i,1:col));%每行的像素值
end

%画图
x=1:1:row;
figure;
plot(x,count);
title('水平方向');
hold on;
% [pks,locs] = findpeaks(count);
% 若加以限制峰值数量会变少
[pks,locs] = findpeaks(count,'minpeakdistance',20);
plot(locs,pks,'*','color','r');
hold on;
[min,locmin]=findpeaks(-count,'minpeakdistance',20);%峰值之间的最小间隔
plot(locmin,count(locmin),'x','color','g');
hold off;

figure;
imshow(img);
title('波峰');
hold on;
for i=1:length(locs)
	y=line([0,col],[locs(i),locs(i)]);
	set(y,'linestyle','-','color','green');
end
hold off;

figure;
imshow(img);
title('波谷');
hold on;
for i=1:length(locmin)
	y=line([0,col],[locmin(i),locmin(i)]);
	set(y,'linestyle','-','color','green');
end
hold off;

##总结:
上述是通过matlab验证了水平灰度投影曲线与人脸部分的对应关系,则初步确定在图片上半部分的波谷的横坐标即为眼睛所在的y轴坐标。

  • 4
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值