识别圆形物体
这个例子展示了如何根据圆度对对象进行分类bwboundaries
,边界跟踪例程。
第一步:读取图像
读到pills_etc.png
.
RGB = imread(“pillsetc.png”);imshow (RGB)
步骤2:阈值图像
将图像转换为黑色和白色,以便为边界跟踪使用做准备bwboundaries
.
I = rgb2gray(RGB);bw = imbinalize (I);imshow (bw)
第三步:去除杂音
使用形态学函数,删除不属于感兴趣的对象的像素。
删除所有包含小于30像素的对象。
Bw = bwareaopen(Bw,30);imshow (bw)
把笔帽上的空隙填上。
Se = strel(“磁盘”2);Bw = imclose(Bw,se);imshow (bw)
填满所有的洞,这样regionprops
可以用来估计每个边界所包围的面积吗
Bw =填充(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
.
stats = regionprops(L,“区域”,“重心”);阈值= 0.94;越界为k = 1:长度(B)%获取标签“k”对应的(X,Y)边界坐标boundary = B{k};计算出物体周长的简单估计。Delta_sq = diff(边界).^2;周长= sum(√(sum(delta_sq,2)));获得标签‘k’对应的面积计算area = stats(k).Area;计算圆度度量度量= 4*pi*面积/周长^2;%显示结果字符串= sprintf(' % 2.2 f '、指标);%用黑圈标记高于阈值的对象如果度量>阈值centroid = stats(k).Centroid;情节(质心(1),重心(2),“柯”);结束文本(-35年边界(1、2),边界(1,1)+ 13日metric_string,“颜色”,“y”,...“字形大小”14岁的“FontWeight”,“大胆”)结束标题([“接近1的指标表明”,...“物体近似圆”])
另请参阅
bwboundaries
|imbinarize
|bwareaopen
|imclose
|strel
|imfill
|label2rgb
|regionprops