MATLAB 虹膜识别例程(基于霍夫变换)

MATLAB 虹膜识别例程(基于霍夫变换)

如何使用霍夫变换进行虹膜内外边界的定位,这是虹膜识别中的关键步骤。

准备工作

MATLAB 代码

%% 虹膜识别例程:基于霍夫变换的内外圆检测
% 作者:AI助手
% 日期:2026年4月17日
% 功能:定位瞳孔(内圆)和虹膜(外圆),并归一化虹膜区域

clc; clear; close all;

%% 1. 读取图像并预处理
% 读取图像(请替换为您的图像路径)
I = imread('iris_image.jpg');

% 转换为灰度图
if size(I, 3) == 3
    Igray = rgb2gray(I);
else
    Igray = 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');
else
    disp('警告:未检测到瞳孔!');
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');
else
    disp('警告:未检测到虹膜!');
end

title('瞳孔和虹膜检测结果(蓝色:瞳孔,红色:虹膜)');
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');
else
    disp('由于未检测到瞳孔或虹膜,无法进行归一化。');
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));
else
    disp('未进行特征提取,因为归一化步骤未完成。');
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) == 0
        filter_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. 瞳孔检测(内圆)

3. 虹膜检测(外圆)

4. 结果显示

5. 虹膜区域归一化

6. 特征提取(示例)

参考代码 利用MATLAB的虹膜识别例程,霍夫变换 www.youwenfan.com/contentcst/77694.html

参数调整指南

参数 作用 调整建议
Sensitivity 控制圆检测的敏感度 提高该值可增加检测到圆的可能性,但可能引入误检
EdgeThreshold 控制边缘检测的阈值 降低该值可使更多边缘被检测,有利于弱边缘的圆
半径范围 [min_radius, max_radius] 指定待检测圆的半径范围 根据实际图像中瞳孔和虹膜的大小进行调整
radial_res, angular_res 归一化后的图像尺寸 增大这些值可提高特征分辨率,但会增加计算量

注意事项

  1. 图像质量:确保虹膜图像清晰、光照均匀,且眼睑和睫毛遮挡较少。

  2. 参数调整:不同人的虹膜大小差异较大,可能需要针对特定图像调整半径范围。

  3. 检测失败:如果检测失败,请尝试:

    • 调整 SensitivityEdgeThreshold 参数。
    • 对图像进行对比度增强(例如直方图均衡化)。
    • 使用形态学操作(如开运算、闭运算)去除小的噪声点。
  4. 扩展性:本例程仅演示了基本流程。完整的虹膜识别系统还需要包括:

    • 眼睑和睫毛检测与去除。
    • 更复杂的特征提取方法(如多通道 Gabor 滤波器、小波变换等)。
    • 特征匹配算法(如汉明距离、欧氏距离等)。

参考文献

专注于matlab/simulink,电子电路,编程