[关闭]
@shaobaobaoer 2018-10-27T15:26:14.000000Z 字数 2683 阅读 2789

《数字图像处理》实验十 区域生长 图像分割算法

matlab 数字图像处理


************************************************************************
> File Name: 《数字图像处理》实验十 区域生长 图像分割算法实验报告
> Author: 罗天涵
> Student-Id: 16121141
> Mail: luotianhan@126.com
************************************************************************
参考文章
https://blog.csdn.net/xiaqunfeng123/article/details/16971913

算法优劣

区域生长是一种串行区域分割的图像分割方法,其优点是基本思想相对简单,通常能将具有相同特征的联通区域分割出来,并能提供很好的边界信息和分割结果。在没有先验知识可以利用时,可以取得最佳的性能,可以用来分割比较复杂的图象,如自然景物。但是,区域生长法是一种迭代的方法,空间和时间开销都比较大,噪声和灰度不均一可能会导致空洞和过分割,并在对图像中的阴影效果处理上往往不是很好。 

算法描述

区域生长的基本思想是将具有相似性质的像素集合起来构成区域。具体先对每个需要分割的区域找一个种子像素作为生长的起点,然后将种子像素周围邻域中与种子像素具有相同或相似性质的像素(根据某种事先确定的生长或相似准则来判定)合并到种子像素所在的区域中。将这些新像素当做新的种子像素继续进行上面的过程,直到再没有满足条件的像素可被包括进来,这样,一个区域就长成了。

区域生长是指从某个像素出发,按照一定的准则,逐步加入邻近像素,当满足一定的条件时,区域生长终止。区域生长的好坏决定于1.初始点(种子点)的选取。2.生长准则。3.终止条件。区域生长是从某个或者某些像素点出发,最后得到整个区域,进而实现目标的提取。

简单来说下三个法则,对出需要分割的图像:1、选取图像中的一点为种子点(种子点的选取需要具体情况具体分析)。2、在种子点处进行8邻域或4邻域扩展,判定准则是:如果考虑的像素与种子像素灰度值差的绝对值小于某个门限T,则将该像素包括进种子像素所在的区域。3、当不再有像素满足加入这个区域的准则时,区域生长停止。

算法实现

代码的思路都在下面

  1. function [ output_args ] = area_growing_alg( input_args, thredshold_input)
  2. %UNTITLED3 此处显示有关此函数的摘要
  3. % input_args raw image as gray format
  4. % thredshold_input input thredshold
  5. % output_args convert image as gray format
  6. I=rgb2gray(input_args);
  7. figure,imshow(I),title('原始图像');
  8. I=double(I);
  9. % show raw png to get y,x
  10. [height,width]=size(I);
  11. [y_double,x_double]=getpts; %获得区域生长起始点
  12. x=round(x_double); %横坐标取整
  13. y=round(y_double); %纵坐标取整
  14. seed=I(x,y); %将生长起始点灰度值存入seed
  15. % show raw png to get y,x
  16. Tmp = zeros([height,width]);
  17. Tmp(x,y) = 1;
  18. sum = seed;
  19. seed_save=1;
  20. seed_count = 1;
  21. thredshold = thredshold_input;
  22. close all;
  23. while seed_count>0
  24. current_seed_gray_level = 0;
  25. seed_count = 0;
  26. for i=1:height
  27. for j=1:width
  28. if Tmp(i,j) == 1
  29. if (i-1)>0 && (i+1)<(height+1) ...
  30. && (j-1)>0 && (j+1)<(width+1)%判断该点不在边缘
  31. for m=-1:1
  32. for n=-1:1
  33. if Tmp(i+m,j+n)==0 && ...%首先该点周围的点应该没有被纳入生成的内容中
  34. abs(I(i+m,j+n)-seed) <= thredshold ... %其次,该点的灰度值需要小于我们设置的阈值
  35. Tmp(i+m,j+n) = 1; % 成功判定,将内容输出到输出矩阵中
  36. seed_count= seed_count+1;%种子数量加一
  37. current_seed_gray_level = current_seed_gray_level + I(i+m,j+n); %累加灰度,最后求均值
  38. end
  39. end
  40. end
  41. end
  42. end
  43. end
  44. end
  45. end
  46. seed_save = seed_save + seed_count;%获取所有种子的个数
  47. sum = sum +current_seed_gray_level;
  48. seed = sum/seed_save;%并计算灰度
  49. output_args = Tmp;
  50. end

实验结果

测试代码如下

  1. test_png1 = imread('easy.png');
  2. t1 = area_growing_alg(test_png1,100);
  3. test_png2 = imread('选区_082.png');
  4. t2 = area_growing_alg(test_png2,100);
  5. figure;% 开一个新的图像区域
  6. subplot(2, 2, 1); imshow(test_png1); title('raw image');
  7. subplot(2, 2, 2); imshow(t1); title('sub image');
  8. subplot(2, 2, 3); imshow(test_png2); title('raw image');
  9. subplot(2, 2, 4); imshow(t2); title('sub image');
  10. grid on

结果如下所示:
可见我们的分割算法还是可行的,但是对于绝对的闭环图形,比如第二行中的图片,我选取的生长点是外侧的白色部分,没此时生长算法就无法便利内部的白色区域了。因为黑色封锁死了白色区域的增长方向。这个现象在第四第三行的图片中可以很明显的表现出来(3,4行选择的是同一个黑色像素点

untitled.jpg-17.6kB
untitled4.jpg-26.2kB
untitled2.jpg-26.6kB

对于彩色的,或者是非二值图像而言。控制相同的选点相同,thredshold 的选定显得尤为重要。可以看下相同选点情况下,对于之前十字架的图片而言,75阈值和125阈值的区别:
但是无论结果如何,都体现出区域生长在处理阴影时候表现并不佳

untitled3.jpg-28.7kB

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注