【数字图像处理】实验四 图像分割

水深无声 2022-10-15 12:58 384阅读 0赞

实验四 图像分割

  • 1 实验目的
  • 2 实验环境
  • 3 实验内容
  • 4 实验心得

1 实验目的

  1. 理解图像分割的基本概念。
  2. 理解图像边缘提取的基本概念。
  3. 掌握用阈值法和边缘提取方法进行图像分割。

2 实验环境

matlab

3 实验内容

1、采用阈值法实现图像分割,分别采用两种阈值选取方法实现。

  1. %(1lab41.m
  2. close all;
  3. clear;
  4. clc;
  5. I=imread('lab4.jpg');
  6. I=rgb2gray(I);
  7. I1=double(I);
  8. figure('NumberTitle','off','name','直方图');
  9. %显示各图像
  10. subplot(1,2,1); imshow(I); title('原始图像','FontName','宋体');
  11. subplot(1,2,2); imhist(I); title('直方图','FontName','宋体'); ylim('auto');
  12. J1=histSeg(I,0,120,0);
  13. % J1=im2bw(I,120/255);
  14. figure('NumberTitle','off','name','直方图门限选择');
  15. %显示各图像
  16. subplot(1,2,1); imshow(I); title('原始图像','FontName','宋体');
  17. subplot(1,2,2); imshow(J1); title('直方图门限选择','FontName','宋体');
  18. J2=iterationSeg(I,0.1,0);
  19. figure('NumberTitle','off','name','迭代阈值分割');
  20. %显示各图像
  21. subplot(1,2,1); imshow(I); title('原始图像','FontName','宋体');
  22. subplot(1,2,2); imshow(J2); title('迭代阈值分割','FontName','宋体');
  23. %Otsu阈值进行分割
  24. T=graythresh(I);
  25. J3=im2bw(I,T);
  26. figure('NumberTitle','off','name','Otsu分割');
  27. subplot(1,2,1); imshow(I); title('原始图像','FontName','宋体');
  28. subplot(1,2,2); imshow(J3); title('Otsu分割——系统函数实现','FontName','宋体');
  29. %(2)直方图门限选择histSeg.m
  30. function j=histSeg(i,T1,T2,n)
  31. [width,height]=size(i);
  32. for x=1:width
  33. for y=1:height
  34. if(i(x,y)>=T1&&i(x,y)<=T2)
  35. j(x,y)=n;
  36. else
  37. j(x,y)=abs(n-1);
  38. end
  39. end
  40. end
  41. %(3)迭代阈值分割iterationSeg.m
  42. function j=iterationSeg(i,val,n)
  43. [width,height]=size(i);
  44. j=zeros(width,height);
  45. T1=(min(i(:))+max(i(:)))/2;%计算输入图像灰度中值
  46. %基于T1将图像分为leftright两部分
  47. left=i<=T1;
  48. right=i>T1;
  49. %计算两部分灰度均值的灰度中值
  50. T2=(mean(i(right))+mean(i(left)))/2;
  51. while abs(T2-T1)<val%判断有无满足精度要求
  52. T1=T2;
  53. right=i>T1;
  54. left=i<=T1;
  55. T2=(mean(i(right))+mean(i(left)))/2;
  56. end
  57. %基于T2进行阈值分割
  58. for row=1:width
  59. for col=1:height
  60. if(i(row,col)<T2)
  61. j(row,col)=n;
  62. else
  63. j(row,col)=abs(n-1);
  64. end
  65. end
  66. end

原始图像的灰度直方图
原始图像的灰度直方图
直方图门限选择
直方图门限选择
迭代阈值分割
迭代阈值分割
Otsu分割系统函数实现
Otsu分割系统函数实现

2、分别用Roberts,Sobel和拉普拉斯高斯算子对图像进行边缘检测,比较三种算子处理的不同之处。

  1. %(1)主函数lab42.m
  2. close all;
  3. clear;
  4. clc;
  5. I=imread('lab4.jpg');%输入图像
  6. I=rgb2gray(I);
  7. I1=im2bw(I);
  8. J1=Roberts(I1);%用Roberts算子进行边缘检测
  9. J2=Sobel(I1);%用Sobel算子进行边缘检测
  10. J3=LOG(I1);%用Log算子进行边缘检测
  11. % J1=edge(I,'roberts');%用Roberts算子进行边缘检测
  12. % J2=edge(I,'sobel'); %用Sobel算子进行边缘检测
  13. % J3=edge(I,'log'); %用Log算子进行边缘检测
  14. figure('NumberTitle','off','name','边缘检测'),
  15. subplot(2,2,1);imshow(I);title('原始图像','FontName','宋体');
  16. subplot(2,2,2);imshow(J1);title('Roberts算子','FontName','宋体');
  17. subplot(2,2,3);imshow(J2);title('Sobel算子','FontName','宋体');
  18. subplot(2,2,4);imshow(J3);title('LOG算子','FontName','宋体');
  19. %(2)自定义Roberts算子Roberts.m
  20. function j=Roberts(i)
  21. [width,height]=size(i);%得到图像的长和宽
  22. j=i;
  23. %Roberts算子
  24. Tx=[-1 0;0 1];
  25. Ty=Tx';
  26. [n,n]=size(Tx);
  27. for row=1:width-(n-1)
  28. for col=1:height-(n-1)%height
  29. mark=i(row:row+(n-1),col:col+(n-1));
  30. temp=Tx.*mark;
  31. tempX=temp(:);
  32. temp=Ty.*mark;
  33. tempY=temp(:);
  34. pointX=0;
  35. pointY=0;
  36. for loc=1:n*n
  37. pointX=pointX+tempX(loc);
  38. pointY=pointY+tempY(loc);
  39. end
  40. j(row,col)=abs(pointX)+abs(pointY);
  41. end
  42. end
  43. %(3)自定义Sobel算子Sobel.m
  44. function j=Sobel(i)
  45. [width,height]=size(i);%得到图像的长和宽
  46. j=i;
  47. %Sobel算子
  48. Tx=[-1 -2 -1;0 0 0;1 2 1];
  49. Ty=Tx';
  50. [n,n]=size(Tx);
  51. for row=1:width-(n-1)
  52. for col=1:height-(n-1)
  53. mark=i(row:row+(n-1),col:col+(n-1));
  54. temp=Tx.*mark;
  55. tempX=temp(:);
  56. temp=Ty.*mark;
  57. tempY=temp(:);
  58. pointX=0;
  59. pointY=0;
  60. for loc=1:n*n
  61. pointX=pointX+tempX(loc);
  62. pointY=pointY+tempY(loc);
  63. end
  64. j(row+(n-1)/2,col+(n-1)/2)=sqrt(pointX^2+pointY^2);
  65. end
  66. end
  67. %(4)自定义LOG算子LOG.m
  68. function j=LOG(i)
  69. [width,height]=size(i);%得到图像的长和宽
  70. j=i;
  71. %LOG算子
  72. T=[-2 -4 -4 -4 -2;-4 0 8 0 -4;-4 8 24 8 -4;-4 0 8 0 -4;-2 -4 -4 -4 -2];
  73. [n,n]=size(T);
  74. for row=1:width-(n-1)
  75. for col=1:height-(n-1)
  76. mark=i(row:row+(n-1),col:col+(n-1));
  77. temp=T.*mark;
  78. temp=temp(:);
  79. point=0;
  80. for loc=1:n*n
  81. point=point+temp(loc);
  82. end
  83. point=point/(n*n);
  84. j(row:row+(n-1),col:col+(n-1))=point;
  85. end
  86. end

自定义算子边缘检测
自定义算子边缘检测
系统函数edge边缘检测
系统函数edge边缘检测

3、实现肺的分割,结果包括两部分:肺(白色显示)和背景(黑色显示)。

  1. % lab43.m
  2. close all;
  3. clear;
  4. clc;
  5. I=imread('lab4.tif');
  6. I=rgb2gray(I);
  7. I1=double(I);
  8. J1=iterationSeg(I,0.1,0);
  9. J2=imcomplement(J1); %图像二值反转
  10. L=bwlabel(J2,8);%连通标记
  11. s = regionprops(L,'Area');%将连通标记结果对应连通区域计算面积
  12. J2=ismember(L,find([s.Area]>=400&[s.Area]<=16000));%去除面积过大的(为背景)和面积过小的(为气管),得到肺实质初始区域
  13. imwrite(J2,'lab52.tif');
  14. figure('NumberTitle','off','name','迭代阈值分割');
  15. %显示各图像
  16. subplot(2,2,1); imshow(I); title('原始图像','FontName','宋体');
  17. subplot(2,2,3); imshow(J1); title('迭代阈值分割','FontName','宋体');
  18. subplot(2,2,4); imshow(J2); title('分割肺','FontName','宋体');

肺(白)和背景(黑)
肺(白)和背景(黑)

4 实验心得

进一步理解了图像分割和边缘检测。edge函数进行边缘检测的边缘并不连续。
关于肺的分割,其核心是将肺实质分割出来,而诸如躯干、气管等如果不加处理,后续计算量将增加。
肺部CT图像

发表评论

表情:
评论列表 (有 0 条评论,384人围观)

还没有评论,来说两句吧...

相关阅读