目录
-
- 一、基本介绍
- 二、程序代码
-
- 2.1 加载图像
- 2.2 灰度化和二值化
- 2.3 形态学处理
- 2.4 寻找边界
- 2.5 确定圆形物体
一、基本介绍
本案例将介绍检测图像中的圆度并判断其圆度。
二、程序代码
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
使用 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,以上便是本文的全部内容了,如果对你有所帮助,记得点个赞哟~