本帖最后由 乂统天下 于 2020-4-20 12:59 编辑
新手学习,多多关照,互相交流,共同进步^-^
【实现功能】识别图像中的圆形物体[Tested]
【处理效果】
NO.1:原图
NO.2:二值化
NO.3:形态学处理
NO.4:圆形度计算、目标标注
【改进分析】暂无
【程序展示】
- %% Identifying Round Objects
- %
- % 功能:此示例显示如何使用对象的圆度对对象进行分类
- % 说明:无
- %% Step 1: 读取图像
- clc,clear,close all
- RGB = imread('pillsetc.png');
- figure
- imshow(RGB);
- %% Step 2: 阈值图像
- % 将图像转换为黑白
- I = rgb2gray(RGB);
- bw = imbinarize(I);
- figure
- imshow(bw)
- %% Step 3: 消除噪音
- % 使用形态学函数,移除不属于感兴趣对象的像素。
- % 删除包含少于30像素的所有对象
- bw = bwareaopen(bw,30);
- % 填补笔帽上的空白
- se = strel('disk',2);
- bw = imclose(bw,se);
- % 填充任何孔,以便区域道具可用于估计
- % 每个边界所包围的区域
- bw = imfill(bw,'holes');
- figure
- imshow(bw)
- %% Step 4: 找到界限
- [B,L] = bwboundaries(bw,'noholes');
- % 显示标签矩阵并绘制每个边界
- figure
- imshow(label2rgb(L, @jet, [.5 .5 .5]))
- hold on
- for k = 1:length(B)
- boundary = B{k};
- plot(boundary(:,2), boundary(:,1), 'w', 'LineWidth', 2)
- end
- %% Step 5: 确定哪些对象是圆的
- % 估计每个物体的面积和周长。
- % 使用这些结果可以形成一个表示对象圆度的简单度量:
- %
- % metric = 4*pi*area/perimeter^2.
- %
- % 此度量值仅对圆等于一,对任何其他形状小于一。
- % 可以通过设置适当的阈值来控制辨别过程。
- % 在这个例子中,使用0.94的阈值,这样只有药片才会被归类为圆形。
- %
- stats = regionprops(L,'Area','Centroid');
- threshold = 0.94;
- % loop over the boundaries
- for k = 1:length(B)
- % 获取与标签“k”对应的(X,Y)边界坐标
- boundary = B{k};
- % 计算物体周长的简单估计
- delta_sq = diff(boundary).^2;
- perimeter = sum(sqrt(sum(delta_sq,2)));
-
- % 获取与标签“k”对应的面积计算
- area = stats(k).Area;
-
- % 计算圆度度量
- metric = 4*pi*area/perimeter^2;
-
- % 显示结果
- metric_string = sprintf('%2.2f',metric);
- % 用黑色圆圈标记阈值以上的对象
- if metric > threshold
- centroid = stats(k).Centroid;
- plot(centroid(1),centroid(2),'ko');
- end
-
- text(boundary(1,2)-35,boundary(1,1)+13,metric_string,'Color','y',...
- 'FontSize',14,'FontWeight','bold');
-
- end
- title(['Metrics closer to 1 indicate that ',...
- 'the object is approximately round']);
复制代码
【源码下载】
下载地址:https://www.lanzous.com/iajjk4h
下载密码:2x7c
代码调试不易。转载请标明出处,谢谢!
如果感觉本文对您有帮助,欢迎评论交流,您的支持是我坚持写作分享的最大动力,谢谢!
0
|
|
|
|