ドキュメンテーション センター

  • 評価版
  • 製品アップデート

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

bwlookup

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

構文

  • A = bwlookup(BW,lut)
  • gpuarrayA = bwlookup(gpuarrayBW,lut)

説明

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

  • ABW と同じサイズ

  • Alut と同じデータ型

    メモ:   bwlookup は、MATLAB からのコード生成をサポートします。効率のよい、製品レベルの品質をもつ C/C++ コードを生成できます。最適な結果を得るには、logical クラスの入力イメージを指定します。コード生成をサポートするツールボックス関数の詳細な一覧を確認するには、「サポートされる関数」を参照してください。

gpuarrayA = bwlookup(gpuarrayBW,lut) は、GPU でフィルター処理を実行します。入力イメージと出力イメージは gpuArray です。lut には数値または gpuArray ベクトルを使用できます。この構文では Parallel Computing Toolbox™ が必要です。

すべて展開する

バイナリ イメージの 2 行 2 列の近傍収縮

2 行 2 列の近傍を使用して、境界イメージのエッジに沿って収縮を実行します。ベクトル lut は、BW の 2 行 2 列の近傍で 4 つのピクセルすべてが 1 に設定されているときにのみ、フィルター処理によってイメージ A 内のターゲットとなるピクセル位置に 1 を配置するよう作成されます。BW における他のあらゆる 2 行 2 列の近傍の組み合わせに対しては、イメージ A 内のターゲットとなるピクセル位置は 0 に設定されます。

2 行 2 列の 4 つの位置すべてが 1 と等しい場合にのみ true となるように lut を作成します。

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

     0
     0
     0
     0
     0
     0
     0
     0
     0
     0
     0
     0
     0
     0
     0
     1

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

BW1 = imread('text.png');

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

BW2 = bwlookup(BW1,lut);

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

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

GPU を使用したバイナリ イメージの 2 行 2 列の近傍収縮

グラフィックス処理装置 (GPU) でコードを実行し、2 行 2 列近傍を使用して境界イメージのエッジに沿って収縮を実行します。

2 行 2 列の 4 つの位置すべてが 1 と等しい場合にのみ true となるように lut を作成します。

lut = makelut('sum(x(:))==4',2);

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

BW1 = imread('text.png');

16 要素のベクトル LUT を使用して 2 行 2 列の近傍処理を実行します。GPU でコードを実行するためには、イメージを含むように gpuArray を作成します。

BW2 = bwlookup(gpuArray(BW1),lut);

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

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

入力引数

すべて展開する

BW - 入力イメージバイナリ イメージ | グレースケール イメージ

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

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

gpuarrayBW - GPU での処理に用いる入力イメージバイナリ イメージを含む gpuArray

GPU での処理に用いる入力イメージであり、バイナリ イメージを含む gpuArray として指定されます。

lut - 出力ピクセル値のルックアップ テーブル 16 要素または 256 要素のベクトル

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

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

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

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

出力引数

すべて展開する

A - 出力イメージバイナリ イメージ | グレースケール イメージ

サイズが BW と一致するグレースケール イメージまたはバイナリ イメージとして返される出力イメージです。ピクセル値の分布は、lut の内容によって決まります。

  • ABW と同じサイズ

  • Alut と同じデータ型

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

gpuarrayA - 出力イメージグレースケール イメージまたはバイナリ イメージを含む gpuArray

出力イメージであり、グレースケール イメージまたはバイナリ イメージを含む gpuArray として返されます。

詳細

すべて展開する

アルゴリズム

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

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

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

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 列のイメージを作成し、この例ではターゲットとなるピクセル位置が BW(1,1) であると仮定します。

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

    % BW(1,1): blue square; sets bit position 0 on right 
    % BW(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(BW,lut)   % perform filtering
    A =
    
      246   32
      161  231

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

    メモ:   イメージ収縮をより確実に実行する方法は、関数 imerode を参照してください。

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

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

参考

この情報は役に立ちましたか?