确定圆的对象
这个例子展示了如何根据对象的圆度使用bwboundaries
,一个边界跟踪例程。
第一步:读取图像
读到pills_etc.png
.
RGB = imread (“pillsetc.png”);imshow (RGB)
步骤2:阈值图像
将图像转换为黑白,以便为边界跟踪使用做准备bwboundaries
.
I = rgb2gray (RGB);bw = imbinarize(我);imshow (bw)
步骤3:去除噪音
使用形态学函数,删除不属于感兴趣的对象的像素。
删除所有小于30像素的对象。
bw = bwareaopen (bw, 30);imshow (bw)
把笔帽的空隙填满。
se = strel (“磁盘”2);bw = imclose (bw, se);imshow (bw)
填满所有的洞,这样regionprops
可以用来估计每个边界所包围的面积吗
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)结束
步骤5:确定哪些对象是圆形的
估计每个物体的面积和周长。使用这些结果形成一个简单的度量来表示物体的圆度:
这个度规只对圆是等于1,对任何其他形状都小于1。通过设置适当的阈值,可以控制歧视过程。在本例中,使用阈值为0.94
所以只有药丸才会被归为圆形。
使用regionprops
得到所有物体的面积的估计值。注意返回的标签矩阵bwboundaries
可以通过regionprops
.
统计= regionprops (L,“区域”,“重心”);阈值= 0.94;%循环越过边界为k = 1:长度(B)%获取标签'k'对应的(X,Y)边界坐标边界= B {k};计算出物体周长的简单估计值delta_sq = diff(边界)^ 2;周长=总和(sqrt (sum (delta_sq, 2)));%获取标签“k”对应的面积计算面积= (k) .Area统计数据;%计算圆度度量度量= 4 *π*面积/周长^ 2;%显示结果metric_string = sprintf (' % 2.2 f '、指标);%用黑圈标记高于阈值的对象如果度量>阈值质心= stats(k).质心;情节(质心(1),重心(2),“柯”);结束文本(-35年边界(1、2),边界(1,1)+ 13日metric_string,“颜色”,“y”,...“字形大小”14岁的“FontWeight”,“大胆”)结束标题([“接近1的指标表明”,...“物体近似圆”])
另请参阅
bwboundaries
|imbinarize
|bwareaopen
|imclose
|strel
|imfill
|label2rgb
|regionprops