Main Content

列方向の処理を使用して、スライディング近傍または個別ブロック演算を高速化する

可能な場合には、スライディング近傍および個別ブロック演算を列方向に行うと、イメージ処理に必要な実行時間を短縮できます。

たとえば、各ブロックの平均を算出するとします。最初にブロックを列に再配列しておくと、各ブロックに対して関数 mean を個別に呼び出すのではなく、関数 mean を 1 回呼び出して各列の平均を計算できるため、計算時間は大幅に短縮されます。

列方向の処理を使用するには、関数 colfilt を使用します。この関数は次の操作を行います。

  1. イメージ行列の各スライディング ブロックまたは個別ブロックを、列を単位とした一時行列に変形します。

  2. 一時行列を指定する関数に渡します。

  3. 結果出力される行列を、元の型に戻します。

列方向の処理を使用したスライディング近傍演算

スライディング近傍演算では、colfilt は、元のイメージの各ピクセルに対して個々の列をもつ一時行列を作成します。与えられたピクセルに対応する列は、元のイメージのそのピクセルの近傍の値を含んでいます。

次の図は、このプロセスを示しています。この図の中で 6 行 5 列のイメージ行列は 2 行 3 列の近傍内で処理されます。colfilt はイメージの中で各ピクセルに対して1つの列を作成するため、一時行列は合計で 30 列になります。各ピクセルの列はその近傍のピクセル値を含んでおり、6 行になります。colfilt は、必要な場合、入力イメージを 0 でパディングします。たとえば、図の中の左上のピクセルの近傍は、ゼロ パディングによって、2つの 0 をもつ近傍になっています。

関数 colfilt は、スライディング近傍用の一時行列を作成

一時行列は関数に渡されます。関数は各列で単一の値を返さなければなりません(たとえば、meanmedianstdsum など、多数の MATLAB® 関数がこのように機能します)。次に、結果の値は出力イメージの適切なピクセルに割り当てられます。

colfilt は、nlfilter と同じ結果を出力しますが、実行時間は短くなります。ただし、多くのメモリが必要です。次の例では、入力ピクセルの近傍の最大値を個々の出力ピクセルとして設定しています。結果は、スライディング近傍演算としての線形および非線形フィルター処理の実装nlfilter の例と同じになります。

I2 = colfilt(I,[3 3],"sliding",@max);

列方向の処理を使用した個別ブロック演算

個別ブロック演算では、colfilt はイメージ内の各ブロックを列に再配列して一時的な行列を作成します。必要に応じて、colfilt は元のイメージを 0 でパディングしてから、一時行列を作成します。

次の図は、このプロセスを示しています。この図の中で 6 行 16 列のイメージ行列は 4 行 6 列のブロックで処理されます。colfilt はまずイメージをゼロ パディングし、8 行 18 列の大きさの行列 (4 行 6 列の 6 つのブロック) を作成してから、24 要素からなる 6 列の行列に変換します。

colfilt は、個別ブロック演算用に一時行列を作成

イメージを一時行列に並べ替えた後、colfilt はこの行列を関数に渡します。関数は、一時行列と同じサイズの行列を返さなければなりません。ブロックのサイズが mn 列でイメージが mmnn 列の場合、一時行列のサイズは (m*n)(ceil(mm/m)*ceil(nn/n)) 列です。関数が一時行列を処理した後、出力は元のイメージの行列の形状に再配列されます。

この例では、イメージの 8 行 8 列の各ブロック内のすべてのピクセルを、ブロックの平均ピクセル値に設定します。

I = im2double(imread("tire.tif"));
f = @(x) ones(64,1)*mean(x);
I2 = colfilt(I,[8 8],"distinct",f);

この例の無名関数はブロックの平均を計算し、出力ブロックが入力ブロックと同じサイズになるように、その結果に 1 のベクトルを乗算します。その結果、出力イメージは、入力イメージと同じサイズになります。

制限

colfilt を使用して、blockproc が実行する同じ個別ブロック演算の多くを実装できます。ただし、colfilt には blockproc にはないいくつかの制限があります。

  • 出力イメージは、入力イメージと同じサイズでなければなりません。

  • ブロックが重なってはいけません。

このような制約を満たさないときは、blockproc を使用してください。