1. 程式人生 > >影象分割:區域生長

影象分割:區域生長

    區域生長的基本思想是將具有相似性質的畫素集合起來構成一個區域,實質是將具有相似特性的畫素元素連線成區域。具體實現時,先在分割的區域找一個種子畫素作為生長的起點,再將種子畫素周圍鄰域中與種子畫素有相同或相似性質的畫素(根據某種事先確定的生長準則確定)合併到種子畫素所在區域中,然後將這些新增的畫素點作為新的生長點重複上面的過程。

三個問題:

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