Отдельные перекрывающиеся объекты MATLAB

У меня есть это изображение введите описание изображения здесь

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

seg = imread('img.jpg');
lvl = graythresh(seg);
seg = imbinarize(seg,lvl);
seg = imfill(~seg,'holes');
[centres, radii, metric] = imfindcircles(seg, [30, 90]);
imshow(seg);
[l,c] = size(radii);

hold on;

plot(centres(:,1), centres(:,2), 'r*'); 
viscircles(centres, radii, 'EdgeColor', 'b'); 

Этот вывод я получил после рисования кругов введите описание изображения здесь Как я могу это сделать?

1 ответ

Решение

Во-первых, вы можете использовать метод обнаружения ребер Canny, чтобы найти все ребра. Во-вторых, лучше использовать высокое значение чувствительности, чтобы найти все круглые формы, а затем ограничить свои условия, чтобы определить правильное количество кругов. Например, вы можете использовать расстояние между центрами окружностей (или соотношения окружностей). Вот мой код для определения количества монет на заданном изображении.

clc;clear all;close all;
%% Preporocessing
input = imread('img.jpg');
input_edges = edge(input,'Canny');
figure;imshow(input_edges);
input_edges=medfilt2(input_edges,[2 2]);% with this filter size, the edges can be strengthened!
figure;imshow(input_edges);
input_edges=bwareaopen(input_edges,130);%remove small edges
%% Applying  circular Hough transform
[centres, radii, metric] = imfindcircles(input_edges, [35, 90],...
    'ObjectPolarity','bright','Sensitivity',0.9,'EdgeThreshold',0.1);
figure;imshow(input_edges);
[l,c] = size(radii);
hold on;
plot(centres(:,1), centres(:,2), 'r*');
viscircles(centres, radii, 'EdgeColor', 'b');
%% Distinguishing circlar shadow
x_centres=centres(:,1);
y_centres=centres(:,2);
num=size(centres,1);
centre_dists = sqrt( bsxfun(@minus,centres(:,1),centres(:,1)').^2 + ...
    bsxfun(@minus,centres(:,2),centres(:,2)').^2 );

% [x_idx,y_idx] =find(centre_dists<50 & centre_dists>0);
% sort(centre_dists(centre_dists<50 & centre_dists>0));
coin_nm=size(centres,1)-0.5*numel(find(centre_dists<50 & centre_dists>0));

Выход получается как показано ниже: выход

Другие вопросы по тегам