Home > vbmeg > functions > common > morphology > vb_flood_fill_2d.m

vb_flood_fill_2d

PURPOSE ^

閾値'level'より小さい値を持つボクセルを'fillval'で塗りつぶす

SYNOPSIS ^

function [V, Vflag] = vb_flood_fill_2d(V,start,fillval,level)

DESCRIPTION ^

 閾値'level'より小さい値を持つボクセルを'fillval'で塗りつぶす
 V      : 2D イメージ
 V(x,y) : 点(x,y)における値 ( x=1:NX, y=1:NY )

 start  : 初期ルートインデックス
 fillval: 塗りつぶす値 > level
 level  : 閾値

 2005-1-18  M. Sato 

 Copyright (C) 2011, ATR All Rights Reserved.
 License : New BSD License(see VBMEG_LICENSE.txt)

CROSS-REFERENCE INFORMATION ^

This function calls: This function is called by:

SOURCE CODE ^

0001 function    [V, Vflag] = vb_flood_fill_2d(V,start,fillval,level)
0002 % 閾値'level'より小さい値を持つボクセルを'fillval'で塗りつぶす
0003 % V      : 2D イメージ
0004 % V(x,y) : 点(x,y)における値 ( x=1:NX, y=1:NY )
0005 %
0006 % start  : 初期ルートインデックス
0007 % fillval: 塗りつぶす値 > level
0008 % level  : 閾値
0009 %
0010 % 2005-1-18  M. Sato
0011 %
0012 % Copyright (C) 2011, ATR All Rights Reserved.
0013 % License : New BSD License(see VBMEG_LICENSE.txt)
0014 
0015 % Vflag  : 塗りつぶされたボクセルのマスクパターン
0016 
0017 % 隣接頂点を順番に辿っていく手順
0018 %   アルゴリズム
0019 %0.周辺頂点リストに関するループ
0020 %1.周辺頂点に関するループ
0021 %2.周辺頂点の未処理隣接頂点に対する処理
0022 %3.新規周辺頂点リストに処理した頂点を追加する
0023 %4.未処理の周辺頂点が残っていれば1へ戻る
0024 %5.新規周辺頂点リストを周辺頂点リストにして0に戻る
0025 
0026 if nargin<3, fillval=1; end;
0027 if nargin<4, level=1; end;
0028 if fillval < level, 
0029     error('level value is larger than fill value\n')
0030 end
0031 
0032 [NX,NY] = size(V);
0033 
0034 NN      = NX*NY;
0035 D      = 2;
0036 
0037 % Vflag(x,y) = 1 : (x,y) は処理済み
0038 Vflag = zeros(NX,NY);    % 頂点処理済みフラグ
0039 Plist = zeros(NN,D);    % 周辺頂点インデックス
0040 Vlist = zeros(NN,D);    % 候補 頂点インデックス
0041 Nroot = size(start,1);    % 周辺頂点数
0042 
0043 Nlist = 0; % 候補 頂点数の初期化
0044 
0045 % 初期ルートインデックスのチェック
0046 for n=1:Nroot,
0047     % root インデックス
0048     root = start(n,:); 
0049     
0050     if root(1)<1 | root(1)>NX | root(2)<1 | root(2)>NY,
0051         continue;
0052     end
0053     
0054     if    V(root(1),root(2)) < level,
0055         V(root(1),root(2))        = fillval;
0056         Vflag(root(1),root(2)) = 1;
0057         Nlist          = Nlist + 1;
0058         Vlist(Nlist,:) = root ;
0059     end;
0060 end
0061 
0062 % ルートインデックスの初期化
0063 Nroot = Nlist;
0064 Plist(1:Nroot,:) = Vlist(1:Nroot,:);
0065 
0066 % 周辺頂点リストに関するループ
0067 while Nroot > 0,
0068 
0069     Nlist = 0; % 候補 頂点数の初期化
0070 
0071     % 周辺頂点に関するループ
0072     for n=1:Nroot,
0073         % root インデックスの更新
0074         root = Plist(n,:); 
0075         
0076         % root の隣接点 (x+1,y)
0077         next = [root(1)+1, root(2)];
0078         
0079         if root(1) < NX ...
0080             & Vflag(next(1),next(2))==0 ...
0081             & V(next(1),next(2)) < level,
0082             
0083             V(next(1),next(2))        = fillval;
0084             Vflag(next(1),next(2)) = 1;
0085             Nlist          = Nlist + 1;
0086             Vlist(Nlist,:) = next ;
0087         end;
0088         
0089         % root の隣接点 (x-1,y)
0090         next = [root(1)-1, root(2)];
0091         
0092         if root(1) > 1 ...
0093             & Vflag(next(1),next(2))==0 ...
0094             & V(next(1),next(2)) < level,
0095 
0096             V(next(1),next(2))        = fillval;
0097             Vflag(next(1),next(2)) = 1;
0098             Nlist          = Nlist + 1;
0099             Vlist(Nlist,:) = next ;
0100         end;
0101         
0102         % root の隣接点 (x,y+1)
0103         next = [root(1), root(2) + 1];
0104         
0105         if root(2) < NY ...
0106             & Vflag(next(1),next(2))==0 ...
0107             & V(next(1),next(2)) < level,
0108 
0109             V(next(1),next(2))        = fillval;
0110             Vflag(next(1),next(2)) = 1;
0111             Nlist          = Nlist + 1;
0112             Vlist(Nlist,:) = next ;
0113         end;
0114         
0115         % root の隣接点 (x,y-1)
0116         next = [root(1), root(2) - 1];
0117         
0118         if root(2) > 1 ...
0119             & Vflag(next(1),next(2))==0 ...
0120             & V(next(1),next(2)) < level,
0121 
0122             V(next(1),next(2))        = fillval;
0123             Vflag(next(1),next(2)) = 1;
0124             Nlist          = Nlist + 1;
0125             Vlist(Nlist,:) = next ;
0126         end;
0127         
0128     end;
0129     % END-周辺頂点に関するループ
0130     
0131     % 候補 周辺頂点リストの更新
0132     Nroot = Nlist;
0133     Plist(1:Nroot,:) = Vlist(1:Nroot,:);
0134     
0135 end
0136

Generated on Mon 22-May-2023 06:53:56 by m2html © 2005