此示例显示如何根据其圆度对对象进行分类Bwboundaries.
,一个边界跟踪程序。
阅读Pills_etc.png.
。
rgb = imread('pillsetc.png');imshow(RGB)
将图像转换为黑白,以便使用边界跟踪Bwboundaries.
。
i = RGB2GRAY(RGB);bw = imbinarize(i);imshow(bw)
使用形态函数,删除不属于感兴趣对象的像素。
删除包含少于30个像素的所有对象。
BW = Bwareaopen(BW,30);imshow(bw)
填补笔帽的差距。
se = strel('盘',2);bw = imclose(bw,se);imshow(bw)
填充任何漏洞,以便可以使用区域分植来估计每个边界包围的区域
bw = imfill(bw,'洞');imshow(bw)
仅限于外界。选项'Noholes'将通过防止加速处理Bwboundaries.
寻找内部轮廓。
[b,l] = bwboundaries(bw,'noholes');
显示标签矩阵并绘制每个边界。
imshow(Label2RGB(L,@ Jet,[5.5 .5]))保持在为了k = 1:长度(b)边界= b {k};绘图(边界(:,2),边界(:,1),'W'那'行宽'2)结尾
估计每个对象的区域和周边。使用这些结果形成一个简单的度量标准,指示对象的圆度:
该度量仅为圆的仅为1,并且对于任何其他形状小于一个。可以通过设置适当的阈值来控制歧视过程。在该示例中,使用0.94的阈值,因此只有药丸将被归类为圆形。
使用区域植物
获取所有对象的区域的估计值。请注意,标签矩阵返回Bwboundaries.
可以重用区域植物
。
统计= RegionProps(L,'区域'那'质心');阈值= 0.94;%循环边界为了k = 1:长度(b)%获得(x,y)边界坐标对应标签'k'边界= B {k};%计算对象的周边的简单估计delta_sq = diff(边界)。^ 2;周边= sum(sqrt(sum(delta__sq,2)));%获得对应于标签'k'的区域计算面积= (k) .Area统计数据;%计算舍入度量度量= 4 * Pi *区域/周边^ 2;%显示结果metric_string = sprintf('%2.2f',公制);用黑色圆圈高于阈值的%标记对象如果公制>阈值Centroid =统计数据(k).Centroid;绘图(质心(1),质心(2),'ko');结尾文本(边界(1,2)-35,边界(1,1)+ 13,Metric_String,'颜色'那'是'那......'字体大小',14,'fontweight'那'大胆的')结尾标题([“较近1的指标表明了”那......"物体大致是圆的"])
Bwareaopen.
|Bwboundaries.
|imbinarize.
|快到了
|imfill
|label2rgb
|区域植物
|str