欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

demo:图像处理 matlab实现区域生长

程序员文章站 2022-03-31 22:57:13
...

代码网上一搜一把,打上了点备注
进行运算务必转化为double

function J=regionGrow(I)
if isinteger(I)
    I=im2double(I);%uint8转double
end

显示图像,单击以获得生长点坐标,灰度值作基准存在seed

imshow(I)
[M,N]=size(I);
[y,x]=getpts;%单击取点后,按enter结束
x1=round(x);%取整
y1=round(y);
seed=I(x1,y1);

J是用来存储生长图像,
sum存储符合生长条件点的灰度值和,
suit存储符合生长条件的点的个数,
sum/suit平均灰度值作为下一次生长的基准
count记录每次判断一点周围8点符合条件的新点的数目,当count=0,即无法生长,生长结束
threshold为阀值。

J=zeros(M,N);
J(x1,y1)=1;
sum=seed;
suit=1;%点的个数
count=1;
threshold=0.15;

生长

while count>0
    s=0;
    count=0;
    for i=1:M%遍历图像
        for j=1:N
            if J(i,j)==1
                if (i-1)>0&&(i+1)<(M+1)&&(j-1)>0&&(j+1)<(N+1)%判断此点是否为图像边界上的点,是边界点就算了,没有8邻域(很粗糙,有5邻域啊)
                    for u=-1:1%遍历8邻域
                        for v=-1:1
                            if J(i+u,j+v)==0&&abs(I(i+u,j+v)-seed)<=threshold%判断是否需要标记,1、未被标记过,2、和标记区灰度值之差小于阈值
                                J(i+u,j+v)=1;
                                count=count+1;
                                s=s+I(i+u,j+v);
                            end
                        end
                    end
                end
            end
        end
    end
    suit=suit+count;
    sum=sum+s;
    seed=sum/suit;%取所有已标记区的平均值作为下一次的计算基准
end

这句原来百度所有的都是

J(i+u,j+v)==0 && abs(I(i+u,j+v)-seed)<=threshold&&1/(1+1/15abs(I(i+u,j+v)-seed))>0.8
这个1/(1+1/15
abs(I(i+u,j+v)-seed))>0.8貌似鸡儿用没有吧我就删了,他为啥不化简?化简完abs(I(i+u,j+v)-seed>3.75,im2double类型的值在0-1之间不会>3.75。
最后还不放心可以测试一下这句话有没有起作用(恒为真)
a=0
if J(i+u,j+v)==0&&abs(I(i+u,j+v)-seed)<=threshold
J(i+u,j+v)=1;
count=count+1;
s=s+I(i+u,j+v);
if 1/(1+1/15abs(I(i+u,j+v)-seed))<0.8
a=1
end
end
运行完,a=0,所以,1/(1+1/15
abs(I(i+u,j+v)-seed))>0.8恒成立

存储为m文件,调用函数

I=imread('rice.png');
I=regionGrow(I);
imshow(I)

demo:图像处理 matlab实现区域生长
demo:图像处理 matlab实现区域生长