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

Изображение

enter image description here

Ожидаемый результат

enter image description here

Я безуспешно использовал следующий код:

[centers, radii] = imfindcircles(W,[30 65],'ObjectPolarity','bright');
figure,imshow(W);% title('Sobel gradient');
viscircles(centers,radii,'Color','b');

Обратите внимание, что размер круга может варьироваться в зависимости от изображения

Какие-либо предложения.

1
Hadi 31 Дек 2017 в 02:13

2 ответа

Лучший ответ

Так близко! Вам просто нужно немного настроить чувствительность. Диапазон значений от 0 до 1, чем выше, тем больше кругов. По умолчанию это 0,85. Также пришлось немного подправить радиус:

imshow(W) % assuming W is logical
[centers,radii] = imfindcircles(W,[40 60],'ObjectPolarity','bright','Sensitivity',0.925)
viscircles(centers, radii,'EdgeColor','b');

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

resultimage

4
Leander Moesinger 31 Дек 2017 в 10:03

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

img = imread('1GBtO.png');
img = im2bw(img);

rp = regionprops('table',img,'Centroid','Eccentricity','EquivDiameter','MajorAxisLength','MinorAxisLength');
rp.Radii = mean([rp.MajorAxisLength rp.MinorAxisLength],2) / 2;

rp([rp.Eccentricity] > 0.75,:) = [];
rp(rp.EquivDiameter < 10 | rp.EquivDiameter > 30,:) = [];

imshow(img);
hold on;
viscircles(rp.Centroid,rp.Radii);
hold off;

Результат далек от желаемого, но я чувствую, что это лучше по сравнению с вашим первым испытанием:

Output

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

1
Tommaso Belluzzo 31 Дек 2017 в 02:18