如何使用霍夫变换进行虹膜内外边界的定位,这是虹膜识别中的关键步骤。
准备工作
- 确保已安装 Image Processing Toolbox(用于图像处理和霍夫变换)。
- 准备一张虹膜图像(建议分辨率不低于 320×240,光照均匀)。
- 将图像命名为
iris_image.jpg并放在当前工作目录,或修改代码中的文件名。
MATLAB 代码
%% 虹膜识别例程:基于霍夫变换的内外圆检测
% 作者:AI助手
% 日期:2026年4月17日
% 功能:定位瞳孔(内圆)和虹膜(外圆),并归一化虹膜区域clc; clear; close all;%% 1. 读取图像并预处理
% 读取图像(请替换为您的图像路径)
I = imread('iris_image.jpg');% 转换为灰度图
if size(I, 3) == 3Igray = rgb2gray(I);
elseIgray = I;
end% 显示原始图像
figure('Name', '原始图像', 'NumberTitle', 'off');
imshow(Igray);
title('原始虹膜图像');% 使用中值滤波去除噪声(保持边缘)
I_filtered = medfilt2(Igray, [3 3]);%% 2. 瞳孔检测(内圆)
% 瞳孔通常比虹膜暗,因此我们使用较暗的区域进行检测
% 使用 imfindcircles 函数,该函数基于霍夫变换
% 参数设置:
% - 'ObjectPolarity': 'dark' 表示检测暗色圆
% - 'Sensitivity': 0.9 控制检测的敏感度(越高越容易检测到圆)
% - 'EdgeThreshold': 0.1 控制边缘检测的阈值[pupil_center, pupil_radius] = imfindcircles(I_filtered, [10 50], ...'ObjectPolarity', 'dark', ...'Sensitivity', 0.9, ...'EdgeThreshold', 0.1);% 如果未检测到瞳孔,尝试调整参数
if isempty(pupil_center)warning('未检测到瞳孔,尝试调整参数...');[pupil_center, pupil_radius] = imfindcircles(I_filtered, [10 50], ...'ObjectPolarity', 'dark', ...'Sensitivity', 0.95, ...'EdgeThreshold', 0.05);
end%% 3. 虹膜检测(外圆)
% 虹膜比瞳孔亮,但比眼白暗,我们使用 'bright' 极性检测
% 外圆半径通常比瞳孔大很多,因此需要更大的半径范围[iris_center, iris_radius] = imfindcircles(I_filtered, [50 120], ...'ObjectPolarity', 'bright', ...'Sensitivity', 0.85, ...'EdgeThreshold', 0.1);% 如果未检测到虹膜,尝试调整参数
if isempty(iris_center)warning('未检测到虹膜,尝试调整参数...');[iris_center, iris_radius] = imfindcircles(I_filtered, [50 120], ...'ObjectPolarity', 'bright', ...'Sensitivity', 0.9, ...'EdgeThreshold', 0.05);
end%% 4. 显示检测结果
figure('Name', '瞳孔和虹膜检测', 'NumberTitle', 'off');
imshow(Igray);
hold on;% 绘制瞳孔圆
if ~isempty(pupil_center)viscircles(pupil_center, pupil_radius, 'EdgeColor', 'b', 'LineWidth', 2);plot(pupil_center(1), pupil_center(2), 'bo', 'MarkerSize', 10, 'MarkerFaceColor', 'b');text(pupil_center(1), pupil_center(2)-20, '瞳孔', 'Color', 'b', 'FontSize', 12, 'FontWeight', 'bold');
elsedisp('警告:未检测到瞳孔!');
end% 绘制虹膜圆
if ~isempty(iris_center)viscircles(iris_center, iris_radius, 'EdgeColor', 'r', 'LineWidth', 2);plot(iris_center(1), iris_center(2), 'ro', 'MarkerSize', 10, 'MarkerFaceColor', 'r');text(iris_center(1), iris_center(2)+20, '虹膜', 'Color', 'r', 'FontSize', 12, 'FontWeight', 'bold');
elsedisp('警告:未检测到虹膜!');
endtitle('瞳孔和虹膜检测结果(蓝色:瞳孔,红色:虹膜)');
hold off;%% 5. 虹膜区域归一化(Daugman的橡胶片模型)
% 将环形虹膜区域展开成矩形区域,便于后续特征提取
% 参数设置:
% - 径向分辨率:64(沿着半径方向采样点)
% - 角度分辨率:512(沿着圆周方向采样点)if ~isempty(pupil_center) && ~isempty(iris_center)% 归一化参数radial_res = 64; % 径向采样点数angular_res = 512; % 角度采样点数% 创建极坐标网格theta = linspace(0, 2*pi, angular_res);r = linspace(pupil_radius, iris_radius, radial_res);[Theta, R] = meshgrid(theta, r);% 转换为笛卡尔坐标X = iris_center(1) + R .* cos(Theta);Y = iris_center(2) + R .* sin(Theta);% 提取归一化后的虹膜图像normalized_iris = interp2(double(Igray), X, Y, 'bilinear');% 显示归一化后的虹膜图像figure('Name', '归一化虹膜图像', 'NumberTitle', 'off');imshow(uint8(normalized_iris));title('归一化后的虹膜图像(矩形区域)');xlabel('角度方向(0-512)');ylabel('径向方向(瞳孔-虹膜边界)');% 保存归一化图像(可选)imwrite(uint8(normalized_iris), 'normalized_iris.png');fprintf('归一化虹膜图像已保存为 normalized_iris.png\n');
elsedisp('由于未检测到瞳孔或虹膜,无法进行归一化。');
end%% 6. 特征提取示例(简化的Gabor滤波器)
% 这里仅作演示,实际应用中特征提取更为复杂
if exist('normalized_iris', 'var')% 设计一个简单的Gabor滤波器wavelength = 18; % 波长orientation = 0; % 方向(弧度)sigma = 0.56*wavelength; % 高斯包络的标准差aspect_ratio = 0.5; % 长宽比% 创建Gabor滤波器gabor_filter = gabor(wavelength, orientation, sigma, aspect_ratio);% 应用滤波器filtered_iris = imfilter(normalized_iris, gabor_filter, 'symmetric');% 显示滤波结果figure('Name', 'Gabor滤波结果', 'NumberTitle', 'off');subplot(1,2,1);imshow(uint8(normalized_iris));title('归一化虹膜图像');subplot(1,2,2);imshow(filtered_iris, []);title('Gabor滤波后图像');% 提取特征(例如,取均值、方差等)features = [mean(filtered_iris(:)), var(filtered_iris(:))];fprintf('提取的特征:均值=%.2f, 方差=%.2f\n', features(1), features(2));
elsedisp('未进行特征提取,因为归一化步骤未完成。');
end%% 7. 辅助函数:创建Gabor滤波器
function gabor = gabor(wavelength, orientation, sigma, aspect_ratio)% 创建二维Gabor滤波器% 参数:% wavelength: 正弦波的波长(以像素为单位)% orientation: 滤波器方向(弧度)% sigma: 高斯包络的标准差% aspect_ratio: 高斯包络的长宽比(sigma_x = sigma, sigma_y = sigma/aspect_ratio)% 滤波器尺寸(奇数)filter_size = ceil(3 * sigma * max(1, 1/aspect_ratio));if mod(filter_size, 2) == 0filter_size = filter_size + 1;end% 创建网格[x, y] = meshgrid(-floor(filter_size/2):floor(filter_size/2), ...-floor(filter_size/2):floor(filter_size/2));% 旋转坐标x_theta = x * cos(orientation) + y * sin(orientation);y_theta = -x * sin(orientation) + y * cos(orientation);% 高斯包络gaussian_env = exp(-0.5 * (x_theta.^2 + (aspect_ratio*y_theta).^2) / sigma^2);% 正弦波sinusoidal = cos(2 * pi * x_theta / wavelength);% Gabor滤波器gabor = gaussian_env .* sinusoidal;% 归一化(使其均值为0)gabor = gabor - mean(gabor(:));
end
代码说明
1. 图像预处理
- 将彩色图像转换为灰度图。
- 使用中值滤波去除噪声,同时保留边缘信息。
2. 瞳孔检测(内圆)
- 使用
imfindcircles函数(基于霍夫变换)检测暗色圆形区域(瞳孔)。 - 通过调整
Sensitivity和EdgeThreshold参数来优化检测效果。
3. 虹膜检测(外圆)
- 使用
imfindcircles函数检测亮色圆形区域(虹膜)。 - 虹膜半径通常比瞳孔大,因此需要设置更大的半径范围。
4. 结果显示
- 在原图上叠加显示检测到的瞳孔和虹膜边界。
5. 虹膜区域归一化
- 使用 Daugman 的橡胶片模型将环形虹膜区域展开成矩形图像。
- 归一化后的图像大小为
radial_res × angular_res(默认 64×512)。
6. 特征提取(示例)
- 使用简单的 Gabor 滤波器对归一化后的虹膜图像进行滤波。
- 提取滤波后图像的统计特征(均值和方差)。
参考代码 利用MATLAB的虹膜识别例程,霍夫变换 www.youwenfan.com/contentcnt/77694.html
参数调整指南
| 参数 | 作用 | 调整建议 |
|---|---|---|
Sensitivity |
控制圆检测的敏感度 | 提高该值可增加检测到圆的可能性,但可能引入误检 |
EdgeThreshold |
控制边缘检测的阈值 | 降低该值可使更多边缘被检测,有利于弱边缘的圆 |
半径范围 [min_radius, max_radius] |
指定待检测圆的半径范围 | 根据实际图像中瞳孔和虹膜的大小进行调整 |
radial_res, angular_res |
归一化后的图像尺寸 | 增大这些值可提高特征分辨率,但会增加计算量 |
注意事项
- 图像质量:确保虹膜图像清晰、光照均匀,且眼睑和睫毛遮挡较少。
- 参数调整:不同人的虹膜大小差异较大,可能需要针对特定图像调整半径范围。
- 检测失败:如果检测失败,请尝试:
- 调整
Sensitivity和EdgeThreshold参数。 - 对图像进行对比度增强(例如直方图均衡化)。
- 使用形态学操作(如开运算、闭运算)去除小的噪声点。
- 调整
- 扩展性:本例程仅演示了基本流程。完整的虹膜识别系统还需要包括:
- 眼睑和睫毛检测与去除。
- 更复杂的特征提取方法(如多通道 Gabor 滤波器、小波变换等)。
- 特征匹配算法(如汉明距离、欧氏距离等)。
参考文献
- Daugman, J. (1993). High confidence visual recognition of persons by a test of statistical independence. IEEE Transactions on Pattern Analysis and Machine Intelligence, 15(11), 1148-1161.
- Wildes, R. P. (1997). Iris recognition: an emerging biometric technology. Proceedings of the IEEE, 85(9), 1348-1363.
