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