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/15abs(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/15abs(I(i+u,j+v)-seed))>0.8恒成立
存储为m文件,调用函数
I=imread('rice.png');
I=regionGrow(I);
imshow(I)
上一篇: 微信小程序如何引用阿里icon字体