Matlab论坛
直播中

乂统天下

5年用户 232经验值
擅长:可编程逻辑 测量仪表 嵌入式技术 控制/MCU
私信 关注

源码交流=图像处理 识别圆形物体

本帖最后由 乂统天下 于 2020-4-20 12:59 编辑

新手学习,多多关照,互相交流,共同进步^-^
【实现功能】识别图像中的圆形物体[Tested]

【处理效果】
NO.1:原图
LY_result1.jpg
NO.2:二值化
LY_result2.jpg
NO.3:形态学处理
LY_result3.jpg
NO.4:圆形度计算、目标标注
LY_result4.jpg

【改进分析】暂无

【程序展示】
  1. %% Identifying Round Objects
  2. %
  3. % 功能:此示例显示如何使用对象的圆度对对象进行分类
  4. % 说明:无


  5. %% Step 1: 读取图像
  6. clc,clear,close all
  7. RGB = imread('pillsetc.png');
  8. figure
  9. imshow(RGB);

  10. %% Step 2: 阈值图像
  11. % 将图像转换为黑白

  12. I = rgb2gray(RGB);
  13. bw = imbinarize(I);
  14. figure
  15. imshow(bw)

  16. %% Step 3: 消除噪音
  17. % 使用形态学函数,移除不属于感兴趣对象的像素。

  18. % 删除包含少于30像素的所有对象
  19. bw = bwareaopen(bw,30);

  20. % 填补笔帽上的空白
  21. se = strel('disk',2);
  22. bw = imclose(bw,se);

  23. % 填充任何孔,以便区域道具可用于估计
  24. % 每个边界所包围的区域
  25. bw = imfill(bw,'holes');
  26. figure
  27. imshow(bw)

  28. %% Step 4: 找到界限

  29. [B,L] = bwboundaries(bw,'noholes');

  30. % 显示标签矩阵并绘制每个边界
  31. figure
  32. imshow(label2rgb(L, @jet, [.5 .5 .5]))
  33. hold on
  34. for k = 1:length(B)
  35.   boundary = B{k};
  36.   plot(boundary(:,2), boundary(:,1), 'w', 'LineWidth', 2)
  37. end

  38. %% Step 5: 确定哪些对象是圆的
  39. % 估计每个物体的面积和周长。
  40. % 使用这些结果可以形成一个表示对象圆度的简单度量:
  41. %
  42. %  metric = 4*pi*area/perimeter^2.
  43. %
  44. % 此度量值仅对圆等于一,对任何其他形状小于一。
  45. % 可以通过设置适当的阈值来控制辨别过程。
  46. % 在这个例子中,使用0.94的阈值,这样只有药片才会被归类为圆形。
  47. %

  48. stats = regionprops(L,'Area','Centroid');

  49. threshold = 0.94;

  50. % loop over the boundaries
  51. for k = 1:length(B)

  52.   % 获取与标签“k”对应的(X,Y)边界坐标
  53.   boundary = B{k};

  54.   % 计算物体周长的简单估计
  55.   delta_sq = diff(boundary).^2;   
  56.   perimeter = sum(sqrt(sum(delta_sq,2)));
  57.   
  58.   % 获取与标签“k”对应的面积计算
  59.   area = stats(k).Area;
  60.   
  61.   % 计算圆度度量
  62.   metric = 4*pi*area/perimeter^2;
  63.   
  64.   % 显示结果
  65.   metric_string = sprintf('%2.2f',metric);

  66.   % 用黑色圆圈标记阈值以上的对象
  67.   if metric > threshold
  68.     centroid = stats(k).Centroid;
  69.     plot(centroid(1),centroid(2),'ko');
  70.   end
  71.   
  72.   text(boundary(1,2)-35,boundary(1,1)+13,metric_string,'Color','y',...
  73.        'FontSize',14,'FontWeight','bold');
  74.   
  75. end

  76. title(['Metrics closer to 1 indicate that ',...
  77.        'the object is approximately round']);



【源码下载】
下载地址:https://www.lanzous.com/iajjk4h
下载密码:2x7c                                             

代码调试不易。转载请标明出处,谢谢!
如果感觉本文对您有帮助,欢迎评论交流,您的支持是我坚持写作分享的最大动力,谢谢!

更多回帖

发帖
×
20
完善资料,
赚取积分