区域生长是种已受到人工智能领域中的计算机视觉界十分关注的图像分割方法。这种方法是从把一幅图像分成许多小区域开始的。这些初始的区域可能是小的邻域甚至是单个像素。在每个区域中,对经过适当定义的能反映一个物体内成员隶属程度的性质(度量)进行计算。用于区分不同物体内像素的性质(度量)包括平均灰度值,纹理,或颜色信息。因此,第一步是赋给每个区域一组参数,这些参数的值能够反映区域属于哪个物体。接下来,对相邻区域的所有边界进行考查,相邻区域的平均度量之间的差异是计算边界强度的一个尺度。如果给定边界两侧的度量差异明显,那么这个边界很强,反之则弱。强边界允许继续存在,而弱边界被消除,相邻区域被合并。
- I = imread('coins.png');%读取图像
- if isinteger(I)
- I = im2double(I);%将uint类型转换成double类型
- end
- figure,imshow(I);%显示原始图像
- [M,N] = size(I);%获取图像大小
- [y,x] = getpts;%选取种子点
- x1 = round(x);
- y1 = round(y);
- seed = I(x1,y1);
- 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)
- for u = -1:1%判断点周围八点是否符合生长规则
- for v = -1:1
- if J(i+u,j+v) == 0 & abs(I(i+u,j+v)-seed)<=threshold&1/(1+1/15*abs(I(i+u,j+v)-seed))>0.8%潘多符合尚未表姐,且满足条件的点
- (i+u, j+v) = 1;%将满足条件的点其在J中对应位置设置为白
- count = count+1;
- s = s+I(i+u,j+v);%此点的灰度值加入s中
- end
- end
- end
- end
- end
- end
- end
- suit = suit+count;%将count加入符合点数计数器中
- sum = sum+s;%将s加入符合点的灰度值总和中
- seed = sum/suit;%计算新的灰度平均值
- end
- figure,imshow(J);%显示区域生长结果图
- A = I.*J
- imshow(A)
-
