Отдельные перекрывающиеся объекты 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));