function [seg,seg_arr,reg_info]=region_grow1(im,seg,criterion,connectivity)
%输入参数:
% im: 用于分区的图像
% seg: 图像初始标签矩阵,与im大小相同。通常它的每个像素都有不同的标签值
% criterion: 判断区域合并与否的条件值
% connectivity: 邻域连通的大小,取4或8
% 输出参数:
% seg: 分割后的图像
% seg_arr: 每次循环处理的图像分割的结果,是中间图像
% reg_info: 记录各个分割区域的信息的结构
rows=size(im,1); %计算图像大小
cols=size(im,2);
reg_info=repmat(struct('size',0,'crt',0,'row_coord',[],'col_coord',[]),1,rows*cols); %记录区域列坐标
%从初始划分中收集已有区域的信息
for m=1:rows
for n=1:cols
c_lab=seg(m,n);
reg_info(c_lab).size = reg_info(c_lab).size+1;
%计算每一个区域的均值
reg_info(c_lab).crt =double((reg_info(c_lab).size-1)*reg_info(c_lab).crt+im(m,n)/reg_info(c_lab).size);
reg_info(c_lab).row_coord = [reg_info(c_lab).row_coord m];
reg_info(c_lab).col_coord = [reg_info(c_lab).col_coord n];
end
end
changed=1; %假设第一次循环区域划分会发生变化
iter=0; %记录循环次数
%图像发生变化时,按照规则继续分割图像
while(changed)
disp(['Currently in iteration: ' num2str(iter+1)]);
changed=0;
for m=1:rows
for n=1:cols
c_lab=seg(m,n); %获得当前像素的标签值
%获取当前像素的4-连通或8-连通邻域的像素坐标
if (connectivity==4)
ngb=get4ngb(rows,cols,m,n);
end
if (connectivity==8)
ngb=get8ngb(rows,cols,m,n);
end
%检查所有邻域像素的标签值,按照规则依次判断是否与当前像素同区
for k=1:size(ngb,2)
n_lab=seg(ngb(1,k),ngb(2,k));
if(n_lab~=c_lab)
if(abs(reg_info(n_lab).crt-reg_info(c_lab).crt)<criterion)
%更改标签值等于c_lab的区域的均值
reg_info(c_lab).crt=(reg_info(c_lab).size*reg_info(c_lab).crt+reg_info(n_lab).size*reg_info(n_lab).crt)/(reg_info(c_lab).size+reg_info(n_lab).size);
%更改该区域的大小
reg_info(c_lab).size=reg_info(c_lab).size+reg_info(n_lab).size;
%给该区域中的所有像素赋标签值c_lab
tmp_row_coord=reg_info(n_lab).row_coord;
tmp_col_coord=reg_info(n_lab).col_coord;
for p=1:reg_info(n_lab).size
seg(tmp_row_coord(p),tmp_col_coord(p))=c_lab;
end
%更改该区域内所有像素的坐标
reg_info(c_lab).row_coord=[reg_info(c_lab).row_coord
reg_info(n_lab).row_coord];
reg_info(c_lab).col_coord=[reg_info(c_lab).col_coord
reg_info(n_lab).col_coord];
reg_info(n_lab).size=0;
changed=1;
end
end
end
end
end
iter=iter+1;
%将本次循环结果存在放到seg_arr中,用于验证。
%其中第一个图像是初始的分割图像
seg_arr(:,:,iter)=seg;
end
%清空reg_info
index=1;
for m=1:max(max(seg))
if (reg_info(m).size>0)
tmp_reg_info(index)=reg_info(m);
index=index+1;
end
end
reg_info=tmp_reg_info;
数字图像处理matlab——图像分割(matlab源文件及训练文件)
需积分: 44 33 浏览量
2022-03-26
13:31:38
上传
评论 4
收藏 25KB RAR 举报
能睡就睡
- 粉丝: 22
- 资源: 3
评论0