霍夫变换瞳孔检测

问题描述

所以我正在为我的论文工作,我必须使用霍夫变换从图像中检测瞳孔。到目前为止,我写了一个代码来识别图像上的 2 个圆圈,但现在我必须让黑色圆圈远离瞳孔。

当我运行代码时,它识别出我的瞳孔,但也在脸颊上随机出现一个圆圈。我的教授说我应该计算像素平均值,并考虑到瞳孔是黑色的事实,只保留该区域的像素。我不知道该怎么做。

我将让我的代码在这里看看,如果有人对我应该如何编写并只保留黑色像素有想法,那就太好了。我还附上了最终的图像,看看我得到了什么。

关闭所有 清除所有 path='C:\Users\Ioana PMEC\OneDrive\Ioana personal\diseratie\test.jpg';

%Citire imagine initiala
xx = imread(path);
figure
imshow(xx)
title('Imagine initiala');% Binarizarea imaginii initiale
yy = rgb2gray(xx);
figure
imshow(yy);
title('Imagine binarizata');

e = edge(yy,'canny');
imshow(e);
radii = 11:1:30;
h = circle_hough(e,radii,'same','normalise');


peaks = circle_houghpeaks(h,'nhoodxy',15,'nhoodr',21,'npeaks',2);

imshow(yy);
hold on;
for peak = peaks
    [x,y]=circlepoints(peak(3));
    plot(x+peak(1),y+peak(2),'r-');
  
end

hold off

测试图片

testimage

最终图像

finalimage

解决方法

我实现了一些应该为您完成任务的东西。该示例使用您提供的图像完成。

第 1 步:读取文件并将其转换为灰度。

path = %user input;
RGB = imread(path);
lab = rgb2lab(RGB);
grayscale_image = rgb2gray(RGB);

第 2 步: 使用给定的参数进行霍夫变换。 这些以及灵敏度可以根据您的任务进行调整。 提示: 使用图像分割器工具箱快速查找参数。接下来,推断的圆被转换为整数值,因为这些是索引所必需的。

min_radius = 10;
max_radius = 50;
% Find circles
[centers,radii,~] = imfindcircles(RGB,[min_radius max_radius],'ObjectPolarity','dark','Sensitivity',0.95);
centers = uint16(centers);
radii = uint16(radii);

带注释的图像如下所示: All circles annotated

第 3 步: 获取圆圈的亮度值。 从圆心和半径值,我们推断出它们各自的亮度。仅检查中心左侧/右侧和上方/下方的 x 和 y 像素值就足够了。 (-1 只是完全留在圈子内的安全边际。)

brightness_checker = zeros(2,max(radii),2);
for i=1:size(centers,1)
    current_radii = radii(i)-1;
    for j=1:current_radii
        % X-center minus radius,step along x-axis
        brightness_checker(i,j,1) = grayscale_image((centers(i,2) - current_radii/2) + j,...
            (centers(i,1) - radii(i)/2) + j);
        % Y-center minus radius,step along y-axis
        brightness_checker(i,2) = grayscale_image((centers(i,1) - current_radii/2) + j);
    end    
end

步骤 4: 检查哪个圆圈是瞳孔。 30 的确定值可能会得到提高。

median_x = median(brightness_checker(:,:,1),2);
median_y = median(brightness_checker(:,2),2);
is_pupil = (median_x<30)&(median_y<30);
pupils_center = centers(is_pupil == true,:);

第 5 步: 画学生。 标记可以更改。参考: https://de.mathworks.com/help/matlab/ref/matlab.graphics.chart.primitive.line-properties.html

figure
imshow(grayscale_image);
hold on 
plot(centers(:,centers(:,'r+','MarkerSize',20,'LineWidth',2);
hold on 
plot(pupils_center(:,pupils_center(:,'b+',2);

这是最终的输出: All pupils annotated.

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...