Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

bwlookup

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

説明

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

すべて折りたたむ

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

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

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

BW1 = imread("text.png");

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

BW2 = bwlookup(BW1,lut);

元のイメージと収縮後のイメージを表示します。

h1 = subplot(1,2,1); imshow(BW1); title("Original Image")
h2 = subplot(1,2,2); imshow(BW2); title("Eroded Image")

Figure contains 2 axes objects. Axes object 1 with title Original Image contains an object of type image. Axes object 2 with title Eroded Image contains an object of type image.

ズームインしてテキストの収縮効果を確認します。

set(h1,Ylim=[1 64],Xlim=[1 64]);
set(h2,Ylim=[1 64],Xlim=[1 64]);

Figure contains 2 axes objects. Axes object 1 with title Original Image contains an object of type image. Axes object 2 with title Eroded Image contains an object of type image.

入力引数

すべて折りたたむ

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

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

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

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

出力引数

すべて折りたたむ

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

アルゴリズム

すべて折りたたむ

関数 bwlookup は、以下のステップを実行し、処理されたイメージ A に含まれる各ピクセルの値を判定します。

  • A 内のターゲット ピクセルの座標に基づいて、入力イメージ BW 内のピクセル近傍の位置を特定します。近傍が BW のエッジを超えて広がっている場合、この関数は、イメージ BW の境界ピクセルをゼロ パディングします。

  • 近傍のバイナリ ピクセル パターンに基づいて、インデックス idx を計算します。

  • A 内のターゲット ピクセルを、ルックアップ テーブルのインデックス idx の位置にある値 (つまり、lut(idx) の値) として設定します。

このアルゴリズムの各ステップを示す例については、サンプル ピクセルのルックアップ値を参照してください。

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

2 行 2 列近傍の場合、各近傍には 4 つのピクセルがあります。各バイナリ ピクセルには 2 つの取りうる状態があります。よって、順列の総数は 24 となり、ルックアップ テーブル lut の長さは 16 となります。

bwlookup は、(行, 列) 座標 (r,c) の位置にあるターゲット出力ピクセルの値を求めるため、左上のピクセルの座標が (r,c) である入力バイナリ イメージ BW に含まれる 2 行 2 列ピクセル近傍を使用します。ルックアップ テーブル内のインデックス idx は、近傍にある 4 つのピクセルの和を重み付けしたものに 1 を加算したものになります。

Pixel weights start with a weight of 1 for the top left pixel in the neighborhood, and increase as powers of two along rows then along columns, with a final weight of 8 for the bottom right pixel.

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

3 行 3 列近傍の場合、各近傍には 9 つのピクセルがあります。各バイナリ ピクセルには 2 つの取りうる状態があります。よって、順列の総数は 29 となり、ルックアップ テーブル lut の長さは 256 となります。

bwlookup は、(行, 列) 座標 (r,c) の位置にあるターゲット出力ピクセルの値を求めるため、座標 (r,c) を中心とする入力バイナリ イメージ BW に含まれる 3 行 3 列ピクセル近傍を使用します。ルックアップ テーブル内のインデックス idx は、近傍にある 9 つのピクセルの和を重み付けしたものに 1 を加算したものになります。

Pixel weights start with a weight of 1 for the top left pixel in the neighborhood, and increase as powers of two along rows then along columns, with a final weight of 256 for the bottom right pixel.

サンプル ピクセルのルックアップ値

この例では、ピクセルの 2 行 2 列近傍に基づいて、ルックアップ テーブル内でターゲット ピクセルに対応するインデックスを求める方法を示します。

ランダムな 16 要素ルックアップ テーブルを作成します。結果を再現できるように、乱数シードを設定します。

rng("default")
lut = randperm(16)
lut = 1×16

     6     3    16    11     7    14     8     5    15     1     2     4    13     9    10    12

小さいサンプル バイナリ イメージを作成します。

BW = checkerboard(2,1,1)>0.5
BW = 4x4 logical array

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

この例では、ターゲットとなるピクセル位置が BW(2,1) であると仮定します。ターゲット ピクセルの 2 行 2 列近傍を求めます。

targetRow = 2;
targetColumn = 1;
neighborhood = BW(targetRow:targetRow+1,targetColumn:targetColumn+1)
neighborhood = 2x2 logical array

   0   0
   1   1

ルックアップ テーブル内のインデックスを計算します。

idx = 1 + 1*neighborhood(1,1) + 2*neighborhood(2,1) ...
        + 4*neighborhood(1,2) + 8*neighborhood(2,2)
idx = 11

または、近傍をバイナリ string として表し、関数 bin2dec を使用してその string をインデックスに変換することもできます。(2,2)、(2,1)、(1,2)、(1,1) の順に近傍の値をリストして string を作成します。言い換えると、string で最初に現れる値 neighborhood(2,2) が最上位ビットに寄与します。string で最後に現れる値 neighborhood(1,1) が最下位ビットに寄与します。

binStr = "1 0 1 0";
idx = 1 + bin2dec(binStr)
idx = 11

ルックアップ テーブル内でインデックス idx の位置にある値を求め、ターゲット ピクセルの値を計算します。

targetPixelValue = lut(idx) 
targetPixelValue = 2

上記の計算では、出力イメージ A のターゲット位置 A(2,1) に値 2 があることが予測されています。元のバイナリ イメージ BW に対して 2 行 2 列の非線形近傍フィルター処理を実行し、この予測を確認します。

A = bwlookup(BW,lut)
A = 4×4

     6    13    12    11
     2     8    14     3
    12    11     6     6
    14     3     6     6

拡張機能

バージョン履歴

R2012b で導入

すべて展開する

参考