MATLAB 检测一图像中的多个圆形

本文所述方法可以检测同一图像中的多个圆形(准确的说,应该是闭合图像)。

在Matlab2010a中可以实现。

<p>%颗粒圆度
clear;close all;
%%
%读取源图像
I = imread('999.png');
figure;imshow(I);
%%
%灰度化、取反
h = rgb2gray(I);
figure;imshow(h);%灰度图像
h = imcomplement(h);%取反
figure;imshow(h);
%%
%中值滤波、二值化
h = medfilt2(h,[4,4]);
bw = im2bw(h,graythresh(h));
%%
%消除噪点
se = strel('disk',2);
bw = imclose(bw,se);
figure;imshow(bw);
%%
%填补闭合图形,填充色为白色
bw&nbsp; = imfill(bw,'holes');
%%
%边界寻找
[B,L] = bwboundaries(bw,'noholes');
% 为每个闭合图形设置颜色显示
figure;imshow(label2rgb(L, @jet, [.5 .5 .5]))
hold on
for k = 1:length(B)
&nbsp; boundary = B{k};
&nbsp; plot(boundary(:,2), boundary(:,1), 'w', 'LineWidth', 2)
end
%%
%计算面积
stats = regionprops(L,'Area','Centroid');</p><p>threshold = 0.94;</p><p>% 循环处理每个边界,length(B)是闭合图形的个数,即检测到的陶粒对象个数
for k = 1:length(B)</p><p>&nbsp; % 获取边界坐标'
&nbsp; boundary = B{k};</p><p>&nbsp; % 计算周长
&nbsp; delta_sq = diff(boundary).^2;
&nbsp; perimeter = sum(sqrt(sum(delta_sq,2)));</p><p>&nbsp; % 对标记为K的对象获取面积
&nbsp; area = stats(k).Area;</p><p>&nbsp; % 圆度计算公式4*PI*A/P^2
&nbsp; metric = 4*pi*area/perimeter^2;</p><p>&nbsp; % 结果显示
&nbsp; metric_string = sprintf('%2.2f',metric);</p><p>&nbsp; % 用一个黑色小圆圈标记圆度大于threshold = 0.94 的对象
&nbsp; if metric > threshold
&nbsp;&nbsp;&nbsp; centroid = stats(k).Centroid;
&nbsp;&nbsp;&nbsp; plot(centroid(1),centroid(2),'ko');
&nbsp; end
%设置显示字体
&nbsp; text(boundary(1,2)-35,boundary(1,1)+13,metric_string,'Color','y',...
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'FontSize',14,'FontWeight','bold');</p><p>end</p><p>title(['圆度识别结果,越圆越接近1,']);</p><p>&nbsp;</p>

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值