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

图像分割:区域生长

程序员文章站 2022-03-27 10:26:45
...

    区域生长的基本思想是将具有相似性质的像素集合起来构成一个区域,实质是将具有相似特性的像素元素连接成区域。具体实现时,先在分割的区域找一个种子像素作为生长的起点,再将种子像素周围邻域中与种子像素有相同或相似性质的像素(根据某种事先确定的生长准则确定)合并到种子像素所在区域中,然后将这些新增的像素点作为新的生长点重复上面的过程。

三个问题:

1. 选择或确定一组正确代表所需区域的种子像素;

2. 确定生长过程中能将相邻像素包括进来的准则;

3. 生长过程停止的条件或准则。

  • 测试图片

 图像分割:区域生长

  •  源码
function J = My_RegionGrowing(I, init_pos, reg_maxdist)
% 区域生长法提取目标区域:比较新像素所在区域平均灰度值与各领域像素的灰度值
% 输入:
%    I : 二维数组,数值表示灰度值,0~255
%    init_pos: 指定的种子点坐标
%    reg_maxdist : 阈值,默认值为20
% 输出:
%   J : 感兴趣区域
% 示例:
%{
img = imread('1.bmp');
I = rgb2gray(img); 
I = double(I);
x = 271;
y = 259;
J = My_RegionGrowing(I, [x, y], 20);
imshow(img)
hold on 
plot(y, x, 'p')
hold off
figure
imagesc(J)
%}
[row, col] = size(I);               % 输入图像的维数 
J = zeros(row, col);               % 输出
x0 = init_pos(1);                   % 初始点
y0 = init_pos(2);
reg_mean = I(x0, y0);       % 生长起始点灰度值
J(x0, y0) = 1;                    % 生长起始点设置为白色
reg_sum = reg_mean;                     % 符合生长条件的灰度值总和
reg_num = 1;                                  % 符合生长条件的点的个数
count = 1;                                       % 每次判断周围八个点中符合条件的数目
reg_choose = zeros(row*col, 2);      % 记录已选择点的坐标
reg_choose(reg_num, :) = init_pos;
num = 1;               % 第一个点   
while count > 0
    s_temp = 0;                  % 周围八个点中符合条件的点的灰度值总和
    count = 0;
    for k = 1 : num      % 对新增的每个点遍历,避免重复
        i = reg_choose(reg_num - num + k, 1);
        j = reg_choose(reg_num - num +k, 2);
        if J(i, j) == 1 && i > 1 && i < row && j > 1 && j < col   % 已确定且不是边界上的点
            % 八邻域
            for u =  -1 : 1      
                for v = -1 : 1
                    % 未处理且满足生长条件的点
                    if J(i + u, j + v) == 0 && abs(I(i + u, j + v) - reg_mean) <= reg_maxdist
                        J(i + u, j + v) = 1;           % 对应点设置为白色
                        count = count + 1;
                        reg_choose(reg_num + count, :) = [i + u, j + v];
                        s_temp = s_temp + I(i + u, j + v);   % 灰度值存入s_temp中
                    end
                end
            end
        end
    end
    num = count;                                      % 新增的点
    reg_num = reg_num + count;              % 区域内总点数
    reg_sum = reg_sum + s_temp;            % 区域内总灰度值
    reg_mean = reg_sum / reg_num;         % 区域灰度平均值
end