首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >利用hough变换进行瞳孔检测

利用hough变换进行瞳孔检测
EN

Stack Overflow用户
提问于 2021-07-12 14:43:05
回答 1查看 107关注 0票数 0

因此,我正在写论文,我必须使用Hough变换从图像中检测瞳孔。到目前为止,我写了一个代码,在我的图像上识别两个圆圈,但现在我必须从瞳孔中保留黑色圆圈。

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

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

关闭所有清除所有路径=‘C:\Users\Ioana PMEC\OneDrive\Ioana personal\Disertatie\test.jpg';

代码语言:javascript
运行
复制
%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, radii, '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

估计值

最终图像

EN

回答 1

Stack Overflow用户

发布于 2021-07-25 20:00:25

我实现了一些可以帮你完成任务的东西。该示例已使用您提供的图像完成。

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

代码语言:javascript
运行
复制
path = %user input;
RGB = imread(path);
lab = rgb2lab(RGB);
grayscale_image = rgb2gray(RGB);

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

代码语言:javascript
运行
复制
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);

带注释的图像如下所示:

步骤3:获取圆形的亮度值。根据圆心和半径值,我们可以推断出它们各自的亮度。仅检查左/右和中心上方/下方的x和y像素值就足够了。(-1只是完全停留在圆圈内的安全余量。)

代码语言:javascript
运行
复制
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, j, 2) = grayscale_image((centers(i,2) - current_radii/2) + j,...
            (centers(i,1) - current_radii/2) + j);
    end    
end

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

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
figure
imshow(grayscale_image);
hold on 
plot(centers(:,1), centers(:,2), 'r+', 'MarkerSize', 20, 'LineWidth', 2);
hold on 
plot(pupils_center(:,1), pupils_center(:,2), 'b+', 'MarkerSize', 20, 'LineWidth', 2);

这是最终输出:

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68342941

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档