Matlab 分离重叠对象
我有这个图像 我需要计算图像中的硬币数量,但重叠的硬币有问题,我正在使用此代码执行此操作:Matlab 分离重叠对象,matlab,image-processing,image-segmentation,edges,Matlab,Image Processing,Image Segmentation,Edges,我有这个图像 我需要计算图像中的硬币数量,但重叠的硬币有问题,我正在使用此代码执行此操作: 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;
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');
这是我画圆后得到的输出
如何才能做到这一点?首先,您可以使用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));
clc;清除所有;全部关闭;
%%预处理
输入=imread('img.jpg');
输入_边=边(输入,'Canny');
图形imshow(输入_边);
输入_边=medfilt2(输入_边[2]);%使用此过滤器尺寸,可以加强边缘!
图形imshow(输入_边);
input_edges=BWAREOPEN(input_edges,130);%去除小边缘
%%应用循环Hough变换
[中心,半径,公制]=imfind圆(输入_边,[35,90],。。。
“对象极性”、“亮度”、“灵敏度”分别为0.9和0.1);
图形imshow(输入_边);
[l,c]=尺寸(半径);
等等
地块(中心(:,1),中心(:,2),‘r*’;
内圆(中心、半径、“边缘颜色”、“b”);
%%区分圆形阴影
x_中心=中心(:,1);
y_中心=中心(:,2);
num=大小(中心,1);
中心区=sqrt(bsxfun(@负,中心(:,1),中心(:,1)”)^2+。。。
bsxfun(@负,中心(:,2),中心(:,2)”)^2;
%[x_idx,y_idx]=查找(中心区0);
%分拣(中心区(中心区0));
硬币直径=大小(中心,1)-0.5*numel(发现(中心距离0));
输出如下所示:
在
imbinarize
之后就没有足够的信息了。与其应用灰度阈值,不如考虑使用镜面反射将硬币与阴影分开。可以使用形态学功能,也可以使用regionprops
或bwtraceboundary
。请查看imrestruction
。我认为最好通过bAreaOpen
删除较小的子对象。看看这个:()+100为您的伟大的答案。非常感谢您的优秀代码,非常好。请您解释一下行:sqrt(bsxfun(@减号,中心(:,1),中心(:,1)”)^2+…bsxfun(@减号,中心(:,2),中心(:,2)”。^2);@减号的主要含义是什么?这条线计算两点之间的元素减号,并同时获得所有点的两点(中心)之间的距离。您可以在该链接中找到更多详细信息: