生长的图像分割"/>
多种子区域生长的图像分割
基于多种子区域生长的图像分割
- 区域生长原理
- 步骤:
- 理论基础
- matlab代码
区域生长原理
步骤:
1.选取区域生长的起始点(种子)
2.确定区域生长的规则
3.确定结束生长的条件
4.寻找符合生长条件的点,纳入生长区域
5.以新纳入的点作为种子,继续步骤4,直到满足结束生长条件
理论基础
图像中同一个物体的像素往往具有一定的相似性,或许表现在颜色上,或许表现在明暗上,特别是在物体的边缘部分,像素的性质会发生比较明显的改变,这个相似性可以做为将其与其他物体区分开来的特征。而区域生长从某一点开始寻找周围与其在某些性质上相似的像素点(比如像素差值在某一阈值内的点),将其纳入同一个区域,从而可以将属于同一个物体的部分图片分割出来。
matlab代码
本人基于以上认识,编写区域生长的程序。该程序可以实现多种子区域生长,将物体与背景分割开来。本实验所用的图片如下
实验代码如下
function My_RegionGrowing(I,reg_maxdist)
%J=My_RegionGrowing(I,1);
close all
imshow(I);title('点击图片获取区域生长起始点');hold on;
[y0,x0]=ginput();%获取鼠标位置
plot(y0,x0,'p');hold off;%打起始印点
y0=int16(y0);%数据转换,防止矩阵索引错误
x0=int16(x0);
I=int16(I);%数据转换,uint8-->int16。使得像素差值可以为负数
[row, col] = size(I); % 输入图像的维数
[p_c1,p_c2]=size(y0); % 起始点个数
Jc = zeros(row, col); %生长区域矩阵
for c=1:1:p_c1 %遍历每一个起始点J = zeros(row, col); %临时生长区域矩阵 ,若符合生长条件则赋值1J(x0(c), y0(c)) = 1; count = 1; %新增加生长点的个数,用于判断是否停止生长 reg_choose = zeros(row*col, 2); %已经被生长的点reg_choose(1, :) = [x0(c),y0(c)];num = 1; reg_num=1;while count > 0count = 0;for k = 1 : num % 从新增的每个点遍历,避免重复i = reg_choose(reg_num - num + k, 1);j = reg_choose(reg_num - num +k, 2);if J(i, j) == 1 && i > 1 && i < row && j > 1 && j < col % 不是边界点% %fprintf('(%d,%d)-%d -->',i,j,I(i,j))%%此处用于检查代码错误,mark一下for u = -1 : 1 %八领域遍历for v = -1 : 1% 未处理且满足生长条件的点if (J(i + u, j + v))==0%该点未生长if (abs(I(i+u, j+v)- I(i, j))<=reg_maxdist)%符合生长条件% %if(abs(I(i+u, j+v)- I(i, j)))<=1% % fprintf('(%d,%d)-%d',i+u,j+v,I(i + u, j + v))% %endJ(i + u, j + v) = 1; % 对应点设置为1count = count + 1;reg_choose(reg_num + count, :) = [i + u, j + v];%保存新的点end endendend% %fprintf('\n')endendnum = count; reg_num = reg_num + count; endJc=Jc+J;%保存所有生长区域
end
I=uint8(I);
Jc=uint8(Jc);
I=I+255*Jc;
figure
imshow(I);title('区域生长完成的图片');
该代码的区域生长的种子点通过鼠标在图片上选取,点击图片上的点选取成功,选择完种子点后按下enter键开始区域生长。采用 对种子周围8领域的像素进行判断,周围点的像素值与种子点像素值的差值的绝对值小于设定的阈值则纳入生长区域(生长规则),当没有新的点纳入到生长区域后停止生长(结束条件)
采用阈值为2,结果如下:
上图中的蓝色的点即为选取的初始种子点
结果可以接受,可以将图中的零件与背景区别开来
不足:只采用像素差值作为生长条件过于简单,可以看到零件中有许多点没有被纳入到生长区域之中。可以选用平均像素等作为生长条件,获得更好的效果。
欢迎指正和交流。
更多推荐
多种子区域生长的图像分割
发布评论