ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

bwlookup

ルックアップ テーブルを使用した非線形フィルター処理

説明

J = bwlookup(BW,lut) は、バイナリ イメージまたはグレースケール イメージ I に対し 2 行 2 列 または 3 行 3 列の非線形近傍フィルター処理を実行し、その結果を出力イメージ J で返します。近傍処理は、ルックアップ テーブル lut 内の値にアクセスするために使用する整数インデックス値を決定します。取得された lut 値は、出力イメージ J 内のターゲット位置にあるピクセルの値となります。

オプションで、フィルター処理を GPU を使用して実行できます (Parallel Computing Toolbox™ が必要)。詳細は、GPU での画像処理を参照

すべて折りたたむ

BW の 2 行 2 列の近傍で 4 つのピクセルすべてが 1 に設定されているときにのみ、入力イメージ内のターゲットとなるピクセル位置に 1 が配置されるようなフィルター処理により、ベクトル lut を作成します。

lutfun = @(x)(sum(x(:))==4);
lut = makelut(lutfun,2)
lut = 16×1

     0
     0
     0
     0
     0
     0
     0
     0
     0
     0
      ⋮

バイナリ イメージを読み込みます。

BW1 = imread('text.png');

16 要素のベクトル lut を使用して 2 行 2 列の近傍処理を実行します。

BW2 = bwlookup(BW1,lut);

処理前と処理後のイメージを拡大表示します。

figure; 
h1 = subplot(1,2,1); imshow(BW1), axis off; title('Original Image')
h2 = subplot(1,2,2); imshow(BW2); axis off; title('Eroded Image')
% 16X zoom to see effects of erosion on text
set(h1,'Ylim',[1 64],'Xlim',[1 64]);
set(h2,'Ylim',[1 64],'Xlim',[1 64]);

入力引数

すべて折りたたむ

非線形近傍フィルター処理で変換された入力イメージ。バイナリ イメージとして指定します。数値入力の場合、非ゼロのピクセルは 1 (true) であると見なされます。

データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | 論理値

出力ピクセル値のルックアップ テーブル。16 要素または 512 要素のベクトルとして指定します。lut のサイズにより、2 つの近傍処理のうちのどちらを実行するかが決まります。

  • lut に 16 個のデータ要素が含まれていれば、近傍行列は 2 行 2 列です。

  • lut に 512 個のデータ要素が含まれていれば、近傍行列は 3 行 3 列です。

データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | logical

出力引数

すべて折りたたむ

出力イメージ。ピクセル値の分布がルックアップ テーブル lut の内容によって決まるグレースケール イメージまたはバイナリ イメージとして返されます。出力イメージ J は入力イメージ I と同じサイズで、lut と同じデータ型です。

アルゴリズム

すべて折りたたむ

bwlookup によるフィルター処理を反復するたびに、最初のステップで、イメージ I の近傍行列のバイナリ ピクセル パターンに基づいて index が計算され、ベクトル lut に格納されます。index でアクセスできる lut 内の値 lut(index) は、出力イメージ J のターゲットとなるピクセル位置に挿入されます。その結果、イメージ J はベクトル lut と同じデータ型になります。

ターゲットとなるピクセル位置が 1 対 1 で対応しているため、イメージ J のサイズはイメージ I と同じです。ターゲットとなるピクセル位置がイメージ I のエッジ上にあり、2 行 2 列または 3 行 3 列の近傍行列の一部がイメージのエッジを越える場合、これらのイメージではない位置はフィルター処理を行うために 0 でパディングされます。

以下の図は、近傍行列内のバイナリ値 0 と 1 のパターンからバイナリ表現へのマッピングを示しています。バイナリ表現に 1 を加えると、lut へのアクセスに使用される index が生成されます。

2 行 2 列近傍のルックアップ

2 行 2 列近傍の場合、length(lut) は 16 となります。各近傍には 4 つのピクセルがあり、また、各ピクセルには 2 つの取りうる状態があります。よって、順列の合計は 24 = 16 となります。

この例では、2 行 2 列の行列内のピクセル パターンが、ターゲットとなるピクセル位置に配置する lut 内のエントリを決定する方法を示します。

  1. uint8 データを含む乱数の 16 要素の lut ベクトルを作成します。

    scurr = rng;	   % save current random number generator seed state
    rng('default')	% always generate same set of random numbers
    lut = uint8( round( 255*rand(16,1) ) ) % generate lut
    rng(scurr);		% restore
    lut =
    
      208
      231
       32
      233
      161
       25
       71
      139
      244
      246
       40
      248
      244
      124
      204
       36
  2. 2 行 2 列のイメージを作成し、この例ではターゲットとなるピクセル位置が I(1,1) であると仮定します。

    I = [1 0; 0 1]
    I =
    
         1     0
         0     1
  3. 上記のカラー コード化されたマッピング図から、この 2 行 2 列近傍のバイナリ表現は、下記のコード スニペットに示されるように計算できます。I(1,1) にある logical 1 は、4 ビット バイナリ表現 (,20= 1) での位置 0 にある最下位ビット (LSB) にマッピングされる、図中の青に対応します。I(2,2) にある logical 1 は、4 ビット バイナリ表現 (23= 8) での位置 3 にある最上位ビット (MSB) にマッピングされる赤に対応します。

    % I(1,1): blue square; sets bit position 0 on right 
    % I(2,2): red  square; sets bit position 3 on left
    binNot = '1 0 0 1';			% binary representation of 2x2 neighborhood matrix
    
    X = bin2dec( binNot );	% convert from binary to decimal
    index = X + 1					% add 1 to compute index value for uint8 vector lut
    A11 = lut(index)				% value at A(1,1)
    index =
    
        10
    
    A11 =
    
      246
  4. 上記の計算では、出力イメージ A のターゲット位置 A(1,1) に値 246 があることが予測されています。

    A = bwlookup(I,lut)   % perform filtering
    A =
    
      246   32
      161  231

    A(1,1) は、実際に 246 になっています。

3 行 3 列近傍のルックアップ

3 行 3 列近傍の場合、length(lut) は 512 となります。各近傍には 9 つのピクセルがあり、また、各ピクセルには 2 つの取りうる状態があります。よって、順列の合計は 29 = 512 となります。

3 行 3 列の近傍処理のバイナリ表現を計算するプロセスは、2 行 2 列近傍のプロセスと同じです。

拡張機能

参考

R2012b で導入