识别圆形对象
此示例显示了如何根据其圆度对对象进行分类Bwboundaries
,边界追踪程序。
步骤1:阅读图像
阅读pills_etc.png
。
rgb = imread('Pillsetc.png');IMShow(RGB)
步骤2:图像阈值
将图像转换为黑白,以准备使用Bwboundaries
。
i = rgb2gray(rgb);bw = imbinarize(i);imshow(BW)
步骤3:删除噪音
使用形态功能,删除不属于感兴趣对象的像素。
删除所有包含少于30像素的对象。
BW = Bwareaopen(BW,30);imshow(BW)
填补笔帽的空白。
se = strel('磁盘',2);bw = imclose(bw,se);imshow(BW)
填充任何孔,以便地区企业
可用于估计每个边界所包围的区域
bw = imfill(bw,“孔”);imshow(BW)
步骤4:找到边界
仅集中在外部边界上。指定'
选项将通过防止Bwboundaries
从搜索内部轮廓。
[b,l] = bwboundaries(bw,');
显示标签矩阵并绘制每个边界。
imshow(label2rgb(l,@jet,[。5.5 .5]))保持上为了k = 1:长度(b)边界= b {k};图(边界(:,2),边界(:,1),'W',,,,'行宽',2)结尾
步骤5:确定哪些对象是圆形的
估计每个物体的区域和周长。使用这些结果形成一个简单的指标,指示对象的圆度:
对于一个圆而言,该度量仅等于1,而对于任何其他形状,它都不小于一个。可以通过设置适当的阈值来控制歧视过程。在此示例中,使用0.94
因此,只有药丸将被归类为圆形。
利用地区企业
获得所有对象的面积的估计。请注意,标签矩阵返回Bwboundaries
可以通过地区企业
。
统计= regionprops(l,'区域',,,,“质心”);阈值= 0.94;%循环在边界上为了k = 1:长度(b)%获得(x,y)边界坐标对应于标签'k'边界= b {k};%计算对物体周长的简单估计delta_sq = diff(boundary)。^2;外围= sum(sqrt(sum(delta_sq,2)));%获得与标签“ K”相对应的面积计算区域= Stats(k).AREA;%计算圆度度量公制= 4*pi*区域/周长^2;%显示结果metric_string = sprintf('%2.2F',公制);%标记对象在阈值上方用黑色圆圈如果度量>阈值centroid = stats(k).centroid;图(质心(1),质心(2),,'ko');结尾文本(边界(1,2)-35,边界(1,1)+13,metric_string,'颜色',,,,'y',,,,...'字体大小',14,'fontchight',,,,'大胆的')结尾标题([“指标更接近1表示”,,,,...“物体大约圆形”)))
也可以看看
Bwboundaries
|inimbinarize
|Bwareaopen
|快到了
|Strel
|imfill
|Label2RGB
|地区企业