【问题标题】:Pupil detection with hough transform使用霍夫变换进行瞳孔检测
【发布时间】:2021-07-12 06:43:05
【问题描述】:

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

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

我会让我的代码在这里看看,如果有人知道我应该如何写这个并且只保留黑色像素会很棒。我还附上了最终图片,看看我得到了什么。

全部关闭 清除所有 path='C:\Users\Ioana PMEC\OneDrive\Ioana personal\Disertatie\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, 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

测试图像 最终图像

【问题讨论】:

    标签: matlab geometry hough-transform


    【解决方案1】:

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

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

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

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

    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 只是完全留在圈子内的安全边距。)

    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 的确定值可能会提高。

    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,:);
    

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

    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);
    

    这是最终输出:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-24
      • 1970-01-01
      • 2017-01-03
      • 1970-01-01
      • 2016-12-09
      • 1970-01-01
      • 2015-05-03
      相关资源
      最近更新 更多