MATLAB示例——图像中圆的识别与判断
目录一、基本介绍二、程序代码2.1 加载图像2.2 灰度化与二值化2.3 形态学处理2.4 寻找边界2.5 确定圆形对象一、基本介绍本案例将介绍检测图像中的圆并判断其圆度。二、程序代码2.1 加载图像加载图像代码如下:I = imread('pillsetc.png');figure(1),imshow(I);%显示原始图像运行效果如下:2.2 灰度化与二值化灰度化与二值化代码如下:I2 = rg
一、基本介绍
本案例将介绍检测图像中的圆并判断其圆度。
二、程序代码
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,以上便是本文的全部内容了,如果对你有所帮助,记得点个赞哟~
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)