一、基本介绍

本案例将介绍检测图像中的圆并判断其圆度。

二、程序代码

2.1 加载图像

加载图像代码如下:

I = imread('pillsetc.png');
figure(1),imshow(I);%显示原始图像

运行效果如下:
在这里插入图片描述

2.2 灰度化与二值化

灰度化与二值化代码如下:

I2 = rgb2gray(I);%灰度化
bw = imbinarize(I2);%二值化
figure(2),imshow(bw)

运行效果如下:
在这里插入图片描述
可以发现图像有许多噪声,接下来需要对图像进行形态学处理去噪。

2.3 形态学处理

代码如下:

%删除包含少于 30 个像素的所有对象
bw = bwareaopen(bw,30);
figure(3),imshow(bw);
%闭运算
se = strel('disk',2);
bw = imclose(bw,se);
figure(4),imshow(bw);
%填充孔洞
bw = imfill(bw,'holes');
figure(5),imshow(bw);

运行效果如下:
在这里插入图片描述

2.4 寻找边界

接下来需要寻找边界,指定 ‘noholes’ 选项将通过阻止 bwboundaries 搜索内部轮廓来加快处理速度,代码如下:

[B,L] = bwboundaries(bw,'noholes');%只关注外边界
figure(6),imshow(label2rgb(L,@jet,[.5 .5 .5]))%标记矩阵L转化为RGB图像
hold on
for k = 1:length(B)
  boundary = B{k};
  plot(boundary(:,2),boundary(:,1),'w','LineWidth',2);%绘制白色边界线
end

运行效果如下:
在这里插入图片描述

2.5 确定圆形对象

估计每个对象的面积和周长:
圆的面积: a r e a = π r 2 area=\pi r^2 area=πr2
圆的周长: p e r i m e t e r = 2 π r perimeter=2\pi r perimeter=2πr

使用这些结果形成简单的度量来表示对象的圆度:
圆度:
m e t r i c = 4 π ∗ a r e a p e r i m e t e r 2 metric=\frac{4\pi*area}{perimeter^2} metric=perimeter24πarea

只有对于圆,该度量值等于 1;而对于任何其他形状,该度量值都小于 1。可以通过设置适当的阈值来控制判别过程。此示例中使用 0.94 的阈值。

使用 regionprops 获得所有对象的面积估计值。请注意,bwboundaries 返回的标签矩阵可以被 regionprops 重用,代码如下:

stats = regionprops(L,'Area','Centroid');%测量图像区域的属性(实际像素数和质心)
threshold = 0.94;%阈值
% 边界循环
for k = 1:length(B)
	boundary = B{k};%获取标签“k”对应的(X,Y)边界坐标
    %计算物体的近似周长
	delta_sq = diff(boundary).^2;
	perimeter = sum(sqrt(sum(delta_sq,2)));
    
	area = stats(k).Area;%计算标签‘k’对应的面积
	metric = 4*pi*area/perimeter^2;%计算圆度
	metric_string = sprintf('%2.2f',metric);%显示结果

    %如果圆度大于阈值threshold,则用黑色圆圈绘制圆心(代表为圆)
	if metric > threshold
        centroid = stats(k).Centroid;
        plot(centroid(1),centroid(2),'ko');
    end
  
    text(boundary(1,2)-35,boundary(1,1)+13,metric_string,'Color','y',...
       'FontSize',14,'FontWeight','bold')   %在边界左侧显示圆度
  
end
title('指标越接近1代表越接近圆形');

运行效果如下:
在这里插入图片描述

上述即为完整代码的各个步骤,完整代码也可参考资源:https://download.csdn.net/download/didi_ya/85299183


ok,以上便是本文的全部内容了,如果对你有所帮助,记得点个赞哟~

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐