【图像处理】人眼区域分割(2)之梯度积分投影曲线

## 人眼区域分割(2)

在人眼区域分割(1)中,对人脸图片求水平投影曲线(也叫IPF),其反映的是每行像素和的变化曲线,即反应了整体的灰度变化,并没有反映眼睛局部灰度变化明显的特点,所以在曲线中不能唯一而又准确的显示眼睛的位置,若想找到眼睛,则必须要良好的滤波。对于此,采用了其他的投影方法,并通过该曲线来截取人眼区域。

目录:

一、梯度积分投影

其实我们用sobel算子计算人脸水平梯度图像,很容易发现,眼睛这一区域局部灰度变化明显。这也从侧面验证了计算梯度图的投影曲线的正确性。首先我们生成尺度不变行梯度算子,用该算子与图像进行卷积运算,再对图像进行水平投影计算。
  1. 生成尺度不变梯度算子

L = r o u n d ( n / 100 ) ∗ 2 + 1 L=round(n/100)*2+1 L=round(n/100)2+1

其中n是图像的宽度,L为该算子的长度,该算子的形式为下:

 ![这里写图片描述](https://img-blog.csdn.net/20171130205543668?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemh1bGluemh1bGlubGlu/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)

尺度不变梯度算子长度应该跟随图片的宽度而变化,即图片宽度除以的数字是可以改变的,例如图片宽度不足100,则可除以10,再乘以2加1。

  1. 卷积运算

用该算子与图片进行卷积运算,注意遍历图像进行计算时行列的初始值

代码:

//卷积,卷积后的梯度图片保存到test中
	int border = len / 2;//len为尺度不变行梯度算子的长度
	Mat test(Gauss.size(), Gauss.type(), Scalar(0));
	uchar *t = test.data;
	uchar *g = Gauss.data;
	int step = Gauss.step[0];
	double sum = 0; 
	for (int i = 0; i < rows; i++)
	{
		for (int j = border; j < cols - border; j++)
		{
			sum = 0;
			for (int k = -border; k <= border; k++)
			{
				sum += Scale[border+k] * g[i*step + j+k];
			}
			//一定要做饱和处理
			if (sum > 255)sum = 255;
			if (sum < 0)sum = 0;
			t[i*step + j] = sum;
		}
	}

结果图:从图片也可以看出,水平方向上眼睛梯度值较大而且滤去了眉毛的影响。

这里写图片描述

3 计算水平灰度曲线

	// 这里计算了上半张图的投影曲线(rows/2)
	vector<int>curve(rows / 2);
	for (int i = 0; i < rows / 2; i++)
	{
		curve[i] = 0;
		for (int j = 0; j < cols; j++)
		{
			uchar *p = test.data + i*test.step[0] + j;
			curve[i] += *p;
		}
	}

二、分析投影曲线

  1. 画出该投影曲线

其实曲线的最大值点就为眼睛所在的行标eyePos

三、人眼区域分割

  1. 对eyePos向前向后求波谷,可以确定人眼区域的上下部分,如下图

这里写图片描述

note:求波谷前可对曲线进行滤波
同时注意曲线波谷的求法,因为曲线显示在图片时经过缩放了,但实则曲线可能在波谷是尖锐的点,即用一阶导为0,二阶导为正的方法不能正确的找到我们期待的波谷,因为在尖锐处的点是没有导数的。

//利用简单的数值比较方法寻找波谷
for (int i = eyePosx; i < curve.size()-1; i++)
	{
		
		if (curve[i - 1]>curve[i] && curve[i + 1]>curve[i])
		{
			range2 = i;
			break;
		}
	}

2.区域分割
若所获得人脸图片大部分包含人脸,则只需要截取上图中绿色横线包含的区域,若图像中不包含大部分人脸,可以对图片求取肤色部分,然后进行二值化求取轮廓,其中最大的轮廓就为人脸的轮廓,如下图其中红色方框与绿色坐标的相交部分即为人眼区域。如下图所示:

总结

利用尺度不变梯度算子进行卷积从而计算梯度投影曲线发现曲线中的最大值点就为眼睛所在的行坐标。利用眼睛局部灰度变化明显的特征从而将眼睛区域分割开,为下一步精准定位去除更多干扰,同时这一中方法抗噪性强并不依赖于滤波。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值