個別ブロック処理
"個別ブロック" 処理では、イメージ行列を四角形ブロックに分割し、それらのブロックに対してイメージ処理演算を個別に実行します。ブロックは左上隅を起点とし、オーバーラップすることなくイメージを完全に覆います。ブロックがイメージにぴったりと合わない場合、不完全なブロックは部分ブロックとみなされます。次の図は、15 x 30 ピクセルのイメージが 4 x 8 ピクセルのブロックに分割された様子を示します。右辺と底辺に部分ブロックができます。
個別ブロックに分割されたイメージ
部分ブロックをそのままにすることも、イメージ サイズがブロック サイズの倍数になるようにイメージをパディングすることもできます。詳細については、パディングの適用を参照してください。
関数 blockproc
を使用したブロック処理の実装
個別ブロック演算を実行するには、関数 blockproc
を使用します。関数 blockproc
は、イメージから個別ブロックを抽出し、処理を指定した関数にそのブロックを渡します。関数 blockproc
は、返されたブロックを組み合わせて出力イメージを作成します。
たとえば、次のコマンドは 25 行 25 列のブロック内のイメージ I
を関数 myfun
を使用して処理します。この場合、関数 myfun
はブロックのサイズを変更してサムネイルを作成します 関数ハンドルの詳細については、関数ハンドルの作成を参照してください。無名関数の詳細については、無名関数を参照してください。
myfun = @(block_struct) imresize(block_struct.data,0.15);
I = imread("tire.tif");
I2 = blockproc(I,[25 25],myfun);
メモ
ブロックのエッジ効果のため、blockproc
を使用したイメージのサイズ変更では、イメージ全体を一度にサイズ変更したときの結果とは異なる結果が生成されます。
次の例は、イメージの 32 行 32 列のブロックの各ピクセルをそのブロックの要素の平均値に設定するために、関数 blockproc
を使います。無名関数はブロックの平均を計算し、出力ブロックが入力ブロックと同じサイズになるように、その結果にすべての要素が 1 からなる行列を乗算します。その結果、出力イメージは、入力イメージと同じサイズになります。関数 blockproc
では、イメージが同じサイズである必要はありません。必要に応じて、指定した関数が適切なサイズのブロックを返すことを確認します。
myfun = @(block_struct) ... uint8(mean2(block_struct.data)* ... ones(size(block_struct.data))); I2 = blockproc("moon.tif",[32 32],myfun);
メモ
blockproc
で実装できる多くの演算では、四角形ブロックでなく列行列になっていると、計算が非常に速く実行されます。この方法の詳細については、列方向の処理を使用して、スライディング近傍または個別ブロック演算を高速化するを参照してください。
パディングの適用
ブロック内のイメージを処理するときに、次の 2 つの理由でパディングを行う場合があります。
イメージ サイズがブロック サイズの倍数でない場合の部分ブロックに対処するため。
各ブロックに境界周辺の重なりを作成するため。
既定の設定では、部分ブロックはパディングされることなく、そのまま処理されます。イメージの右辺または底辺をパディングして、ブロックをフルサイズにするには、引数 PadPartialBlocks
を true
に設定します。
引数 BorderSize
を使用し、ブロックの外側に追加する行と列のピクセル数を指定します。この値はブロック処理時に適用されます。境界がある場合、blockproc
は、指定した関数に対し、拡張後のブロック (境界を含む) を渡します。
たとえば、以下のコマンドは、イメージ A
を 4 x 8 ピクセルのブロックで処理し、各ブロックの周囲に 1 x 2 ピクセルの境界を追加し、部分ブロックを 0 でパディングしてフルサイズのブロックにします。このピクセルの境界によって、処理時に各ブロックが上辺および底辺で 1 ピクセル、左辺および右辺で 2 ピクセル拡張されます。次の図に示すサンプル イメージ A
では、3 つのサンプル ブロックに追加された境界ピクセルがグレーで示されています。
B = blockproc(A,[4 8],myfun,BorderSize=[1 2], ...
PadPartialBlocks=true)
指定した境界をもつ個別ブロックに分割されたイメージ A
この図でわかるように、部分ブロックのパディングとブロックの境界のパディングのいずれによっても、イメージ A
全体のサイズが大きくなります。部分ブロックがパディングされているため、15 x 30 ピクセルであった元のイメージのサイズが、ブロック サイズの次の倍数 (この例では 16 x 32 ピクセル) まで大きくなります。各ブロックに 1 x 2 ピクセルの境界が追加されているため、イメージの辺に沿ったブロックには、元のイメージの境界を超えた場所にあるピクセルが含まれています。イメージの辺に沿った境界ピクセルによって、入力行列の有効サイズが 18 行 36 列に増加します。図に示されている外側の四角形は、すべてのパディングが追加されたイメージの新しい境界を示しています。
既定の設定では、blockproc
はイメージを 0 でパディングします。別のタイプのパディングが必要な場合は、関数 blockproc
の名前と値の引数 PadMethod
を使用します。