主要内容

识别圆形对象

此示例显示了如何根据其圆度对对象进行分类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)结尾

图包含一个轴对象。轴对象包含7个类型图像的对象。

步骤5:确定哪些对象是圆形的

估计每个物体的区域和周长。使用这些结果形成一个简单的指标,指示对象的圆度:

公制 = 4 π * 区域 周长 2

对于一个圆而言,该度量仅等于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表示”,,,,...“物体大约圆形”)))

图包含一个轴对象。带有标题指标的轴对象接近1,表明该对象大约包含15个类型图像,线,文本的对象。

也可以看看

|||||||

相关话题