当前位置:   article > 正文

Matlab实现图像分割及目标计数-形态学处理+分水岭变换方法_matlab 目标分割

matlab 目标分割

Q号:809315756

基于形态学处理和分水岭变换实现图像中前景目标分割及目标计数,以黄豆图像为例。算法实现如下:

一、读取图像并将图像灰度化,实现代码如下:

  1. img=imread('2.jpg'); %读取到一张图片
  2. figure
  3. subplot(211)
  4. imshow(img);title('原始图像','fontsize',14);
  5. subplot(212)
  6. grayImg=rgb2gray(img);
  7. imshow(grayImg);title('灰度图像','fontsize',14)

二、利用OTSU自适应阈值算法将灰度图像二值化处理后并取反运算,实现代码如下:

  1. %% otsu二值化处理
  2. Th=graythresh(grayImg);
  3. binaryImg1=imbinarize(grayImg,Th);%自适应阈值
  4. binaryImg2=imcomplement(binaryImg1);
  5. figure
  6. subplot(121);imshow(binaryImg1);title('otsu二值化','fontsize',14);
  7. subplot(122);imshow(binaryImg2);title('二值图像求反运算','fontsize',14);

 

 三、对二值图像进行形态学处理:腐蚀运算后进行开运算,实现代码如下:

  1. %% 图像形态学处理
  2. se =strel('disk',3) ;%创建一个指定半径3的平面圆盘形的结构元素
  3. rodeImg=imerode(binaryImg2,se);%腐蚀
  4. openImg=imopen(rodeImg,se);%开运算
  5. figure;
  6. subplot(121);imshow(rodeImg);title('腐蚀运算','fontsize',14)
  7. subplot(122);imshow(openImg);title('开运算','fontsize',14)

  四、对二值图像进行距离变换和初次分水岭变换,实现代码如下:

  1. distBinary = -bwdist(~openImg);%二值图像的距离变换
  2. figure
  3. imshow(distBinary,[])
  4. title('距离变换图像','fontsize',14)
  5. Ld = watershed(distBinary);
  6. figure
  7. imshow(label2rgb(Ld))
  8. title('初次分水岭变换后图像','fontsize',14)

 五、通常,对imextendedmin的以下调用应该只产生大致位于要分割的单元格中间的小点。使用imshowpair将蒙版叠加在原始图像上,并再次进行分水岭变换。实现代码如下:

  1. mask = imextendedmin(distBinary,0.95);
  2. figure
  3. imshowpair(openImg,mask,'blend')
  4. title('复合图像','fontsize',14)
  5. %修改距离变换,使其仅在所需位置具有最小值,然后重复上述分水岭步骤。
  6. distBinary2 = imimposemin(distBinary,mask);
  7. Ld2 = watershed(distBinary2);
  8. openImg2 = openImg;
  9. openImg2(Ld2 == 0) = 0;
  10. figure
  11. imshow(openImg2)
  12. title('去除粘连后二值图像','fontsize',14)

 

六、利用连通区域标记法统计目标数量, 并且标记中心点和最大外接矩形,实现代码如下:

  1. [B,L,N]=bwboundaries(openImg2,4);
  2. centroid = regionprops(L,'Centroid');%'Centroid'每个区域的质心(重心)
  3. figure
  4. imshow(img)
  5. for i=1:N
  6. hold on %绘制质心
  7. plot(centroid(i,1).Centroid(1,1),centroid(i,1).Centroid(1,2), 'ro','MarkerFaceColor','r');
  8. end
  9. status=regionprops( L,'BoundingBox');%regionprops统计被标记的区域的面积分布,显示区域总数。'Bounding
  10. for i=1:N %绘制外接矩形框
  11. rectangle('position',status(i).BoundingBox,'edgecolor','r','LineWidth',1);%绘制矩形,边框颜色为黄色
  12. text(centroid(i,1).Centroid(1,1)-15,centroid(i,1).Centroid(1,2)-15, num2str(i),'Color', 'k','fontsize',16);
  13. end
  14. title(['黄豆数量:',num2str(N) ],'fontsize',14)
  15. disp(['图中黄豆数量为:',num2str(N) ]);

 完整代码如下:

  1. clc;clear;close all;
  2. %读入图片 灰度处理
  3. img=imread('2.jpg'); %读取到一张图片
  4. figure
  5. subplot(121)
  6. imshow(img);title('原始图像','fontsize',14);
  7. subplot(122)
  8. grayImg=rgb2gray(img);
  9. imshow(grayImg);title('灰度图像','fontsize',14)
  10. %% otsu二值化处理
  11. Th=graythresh(grayImg);
  12. binaryImg1=imbinarize(grayImg,Th);%自适应阈值
  13. binaryImg2=imcomplement(binaryImg1);
  14. figure
  15. subplot(121);imshow(binaryImg1);title('otsu二值化','fontsize',14);
  16. subplot(122);imshow(binaryImg2);title('二值图像求反运算','fontsize',14);
  17. % binaryImg2=binaryImg1;
  18. %% 图像形态学处理
  19. se =strel('disk',3,0) ;%创建一个指定半径5的平面圆盘形的结构元素,此时缺省值是4
  20. rodeImg=imerode(binaryImg2,se);%腐蚀
  21. openImg=imopen(rodeImg,se);%开运算
  22. figure;
  23. subplot(121);imshow(rodeImg);title('腐蚀运算','fontsize',14)
  24. subplot(122);imshow(openImg);title('开运算','fontsize',14)
  25. %% 二值图像的距离变换 分水岭变换
  26. % distBinary = -bwdist(~binaryImg2);%二值图像的距离变换
  27. distBinary = -bwdist(~openImg);%二值图像的距离变换
  28. figure
  29. imshow(distBinary,[])
  30. title('距离变换图像','fontsize',14)
  31. Ld = watershed(distBinary);
  32. figure
  33. imshow(label2rgb(Ld))
  34. title('初次分水岭变换后图像','fontsize',14)
  35. %理想情况下,对imextendedmin的以下调用应该只产生大致位于要分割的单元格中间的小点。
  36. %将使用imshowpair将蒙版叠加在原始图像上。
  37. mask = imextendedmin(distBinary,0.95);
  38. figure
  39. imshowpair(openImg,mask,'blend')
  40. title('复合图像','fontsize',14)
  41. %修改距离变换,使其仅在所需位置具有最小值,然后重复上述分水岭步骤。
  42. distBinary2 = imimposemin(distBinary,mask);
  43. Ld2 = watershed(distBinary2);
  44. openImg2 = openImg;
  45. openImg2(Ld2 == 0) = 0;
  46. figure
  47. imshow(openImg2)
  48. title('去除粘连后二值图像','fontsize',14)
  49. [B,L,N]=bwboundaries(openImg2,4);
  50. centroid = regionprops(L,'Centroid');%'Centroid'每个区域的质心(重心)
  51. figure
  52. imshow(img)
  53. for i=1:N
  54. hold on %绘制质心
  55. plot(centroid(i,1).Centroid(1,1),centroid(i,1).Centroid(1,2), 'ro','MarkerFaceColor','r');
  56. end
  57. status=regionprops( L,'BoundingBox');%regionprops统计被标记的区域的面积分布,显示区域总数。'Bounding
  58. for i=1:N %绘制外接矩形框
  59. rectangle('position',status(i).BoundingBox,'edgecolor','r','LineWidth',1);%绘制矩形,边框颜色为黄色
  60. text(centroid(i,1).Centroid(1,1)-15,centroid(i,1).Centroid(1,2)-15, num2str(i),'Color', 'k','fontsize',16);
  61. end
  62. title(['黄豆数量:',num2str(N) ],'fontsize',14)
  63. disp(['图中黄豆数量为:',num2str(N) ]);

 以上就是matlab实现图像分割及目标计数的全部代码。如果有不懂的小伙伴儿,欢迎评论留言或者私信,代码订制也可私信博主。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/523917
推荐阅读
相关标签
  

闽ICP备14008679号