Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 分离重叠对象_Matlab_Image Processing_Image Segmentation_Edges - Fatal编程技术网

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);@减号的主要含义是什么?这条线计算两点之间的元素减号,并同时获得所有点的两点(中心)之间的距离。您可以在该链接中找到更多详细信息: