matlab

来源:互联网 发布:还有什么推广软件 编辑:程序博客网 时间:2024/04/25 13:24

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('分割后图像');

原创粉丝点击