霍夫变换瞳孔检测

如何解决霍夫变换瞳孔检测

所以我正在为我的论文工作,我必须使用霍夫变换从图像中检测瞳孔。到目前为止,我写了一个代码来识别图像上的 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.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?