clear
clc
[filename,pathname]=uigetfile({'*.bmp';'*.jpg';'*.gif';'*.tif';'*.jpeg';'*.*'},'打开原始图')
if filename==0% 判断打开文件的有效性
errordlg('打开文件失败');
return
end
fullname=fullfile(pathname,filename);
I=imread(fullname);% 读取图像
% 显示原始图像
figure;
imshow(I);
title('原始图像');
M=size(I,1);
N=size(I,2);
[x,y]=getpts;% 获得区域增长的起始点。(由于下面程序的限制,这里只能取一个点)
x=round(x);%横坐标取整
y=round(y);%纵坐标取整
seed=I(x,y);%将生长起始点灰度值存入seed中
Y=zeros(M,N);%做一个全零与原始图像等大的图像矩阵Y,作为输出图像矩阵
Y(x,y)=1;%将Y中与生长起始点对应的点设置为白场
sum=seed;%存储符合区域生长条件的点的灰度值的和
suit=1;%存储符合区域生长条件的点的个数
count=1;%记录每次判断一点邻域中8个点中符合条件的新点的数目
threshold=0.05555;%阀值
while count>0%记录判断一点邻域8点时,符合条件的新点的灰度值之和
s=0;
count=0;
for i=1:M
for j=1:N
if Y(i,j)==1
if i>1&&i<M&&j>0&&j<N%判断此点是否为图像边界上的点
for u=-1:1
for v=-1:1
%若不是图像边界上的点,则根据生长条件判别
if Y(i+u,j+v)>0&&abs(I(i+u,j+v)-seed<threshold)
Y(i+u,j+v)=1;
count=count+1;
s=s+Y(i+u,j+v);
end
end
end
end
end
end
end
seed=s/count;
end
figure;imshow(Y);title('分割后图像');