Обнаружение зрачков с помощью преобразования Хафа

#matlab #geometry #hough-transform

Вопрос:

итак, я работаю над диссертацией, и мне нужно определить ученика по изображениям с помощью преобразования Хафа. До сих пор я писал код, который идентифицирует 2 круга на моем изображении, но сейчас я должен держать черный круг подальше от зрачка.

Когда я запускаю код, он идентифицирует меня как ученика, но также и случайный круг на щеке. Мой профессор сказал, что я должен рассчитать среднее значение пикселей и, учитывая тот факт, что зрачок черный, сохранить пиксели только из этой области. Я не знаю, как это сделать.

Я позволю своему коду посмотреть здесь, и если у кого-то есть идеи о том, как мне это написать, и оставить только черные пиксели, было бы здорово. Я также прикрепил к этому окончательное изображение, чтобы увидеть, что я получил.

закрыть все очистить весь путь=’C:UsersIoana PMECOneDriveИоана personalDisertatietest.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
 

свидетельство
свидетельство
окончательное изображение
окончательное изображение

Ответ №1:

Я реализовал кое-что, что должно помочь вам выполнить эту задачу. Пример выполнен с предоставленным вами изображением.

Шаг 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);
 

Аннотированное изображение выглядит следующим образом:
Все круги аннотированы

Шаг 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)amp;(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(:,1), centers(:,2), 'r ', 'MarkerSize', 20, 'LineWidth', 2);
hold on 
plot(pupils_center(:,1), pupils_center(:,2), 'b ', 'MarkerSize', 20, 'LineWidth', 2);
 

Это конечный результат:
Все ученики снабжены комментариями.