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