基于积分投影法的人脸图像三段式分割系统
项目介绍
本项目是一个基于 MATLAB 开发的图像处理系统,旨在通过积分投影算法自动检测人脸区域,并根据面部特征分布将人脸图像在垂直方向上分割为“上庭”、“中庭”和“下庭”三个部分。系统集成了图像预处理、特征区域提取(ROI)、特征点定位以及可视化展示功能,能够直观地反映人脸的几何结构特征。
主要功能特性
- 图像读取与兼容性:支持通过 GUI 对话框选择读取 JPG, BMP, PNG 等常见格式的图片。
- 图像增强预处理:包含灰度转换、直方图均衡化以增强对比度,以及基于 Otsu 算法的自动阈值二值化。
- 噪声处理:利用形态学操作(填补孔洞、开闭运算)去除背景噪声,并自动筛选最大连通区域以锁定人脸。
- 自动人脸 ROI 裁剪:通过全局水平和垂直积分投影,自动计算人脸的上下左右边界,去除无效背景。
- 特征精确定位:通过 Sobel 边缘检测结合水平积分投影,定位眉眼(波峰)、鼻底(波谷)和嘴巴(波峰)的位置。
- 智能三段式分割:根据特征波峰波谷位置动态计算分割线,包含几何比例修正机制(三庭均分思想)以防止分割失效。
- 全流程可视化:在单一窗口中同时展示原图定位、二值化蒙、投影曲线分析图以及最终的三段分割子图。
系统要求
- MATLAB R2016a 或更高版本
- Image Processing Toolbox(图像处理工具箱)
使用方法
- 确保 MATLAB 当前路径包含本项目的
main.m 文件。 - 在 MATLAB 命令窗口输入
main 并回车,或直接运行脚本。 - 系统将弹出文件选择对话框,请选择一张包含单人脸的图像文件(建议背景相对简单,人脸端正)。
- 系统运行结束后,会自动弹出一个图形窗口展示处理过程及分割结果。
系统实现逻辑与算法详解
系统主要流程代码主要包含在 main 函数中,具体处理逻辑如下:
1. 图像载入与初始化
- 使用
uigetfile 获取用户选择的图像路径。 - 创建图形窗口并根据屏幕比例初始化布局。
2. 图像预处理
为了准确提取人脸轮廓,代码依次执行以下操作:
- 灰度化:判断输入图像是否为 RGB,若是则转换为灰度图。
- 直方图均衡化 (
histeq):增强图像对比度,使面部特征更明显。 - 二值化:使用
graythresh (Otsu算法) 自动计算阈值,将灰度图转换为二值图像。 - 形态学处理:
*
imfill:填充二值图像内部的孔洞(如眼睛、眉毛等黑色区域)。
*
imopen 与
imclose:使用半径为 5 的圆盘结构元素进行开运算(去噪点)和闭运算(平滑边缘)。
*
bwareafilt:仅保留面积最大的连通区域,假设该区域为人脸,排除背景干扰。
3. 全局积分投影与 ROI 定位
利用二值化图像确定人脸的大致矩形框:
- 垂直投影:计算二值图像每一列的像素和,用于确定左右边界。
- 水平投影:计算二值图像每一行的像素和,用于确定上下边界。
- 边界计算:设置阈值为最大投影值的 5%,从两侧向中心扫描,定位投影值超过阈值的第一个和最后一个位置,从而确定
Left, Right, Top, Bottom 坐标。 - ROI 裁剪:根据上述坐标,从原灰度图中裁剪出仅包含人脸的区域 (
faceROI),后续操作均基于此区域进行。
4. 内部特征定位与分割点计算
在获取 ROI 后,为了更精准地找到五官位置,代码并未直接使用灰度积分,而是采用了边缘投影法:
- 边缘检测:使用 Sobel 算子检测 ROI 的水平边缘 (
edgeImage),这能更好地突显眉毛、眼睛和嘴唇的横向线条。 - 特征投影:对边缘图像进行水平方向积分投影。
- 曲线平滑:通过移动平均滤波器(Moving Average Filter)平滑投影曲线,去除毛刺,便于波峰波谷检测。
- 特征点判定:
*
眼部/眉毛位置:搜索 ROI 上半部分 (0-50%) 的最大波峰。
*
嘴部位置:搜索 ROI 下半部分 (60%-100%) 的最大波峰。
*
分割点 1 (上庭/中庭):设定为眼部峰值位置向上偏移 ROI 高度的 12%。
*
分割点 2 (中庭/下庭):在眼部峰值和嘴部峰值之间寻找投影曲线的最小值(波谷,对应鼻底区域)。
- 异常修正:代码通过逻辑判断分割点的合理性(如分割点间距过小),若检测失败或异常,则自动回退到几何均分策略(ROI 高度的 1/3 和 2/3 处)。
5. 图像分割与可视化
- 利用计算出的分割点坐标,将 ROI 灰度图像矩阵在垂直方向上切片,生成三个子图像矩阵。
- 利用 MATLAB 的
subplot 功能构建网格布局,分别绘制:
* 叠加了定位框(红色)和分割线(绿/蓝)的原始图像。
* 预处理后的二值化图像。
* 用于定位左右边界的垂直投影柱状图。
* 旋转 90 度的 ROI 水平边缘投影曲线,并在图上标示出计算出的眼部、嘴部峰值位置及两条分割线位置。
* 最终分割出的上、中、下三部分人脸子图。
* 底部用于显示图像尺寸、人脸区域大小及分割坐标的文本信息区。
关键函数说明
smooth_curve(data, spansize): 这是一个辅助函数,实现了一维数据的卷积平滑处理,用于减少投影曲线中的高频噪声,提高峰值检测的鲁棒性。