ドキュメンテーション

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

個別ブロック処理

個別ブロック処理では、行列を mn 列のセクションに分割します。これらのセクション、つまり個別ブロックは、重ね合わせがなく左上隅から始まるイメージ行列です。ブロックがイメージにぴったりと合わない場合は、イメージをパディングしたり、イメージの右辺または底辺の部分ブロックを操作したりできます。次の図は、15 行 30 列の行列を 4 行 8 列のブロックに分割したものです。右辺と底辺に部分ブロックができます。部分ブロックをそのままにすることも、最終的なサイズが 16 行 32 列になるようにイメージをパディングすることもできます。詳細は、パディングの適用を参照してください。(一度に 1 ブロックではなく一度に 1 ピクセルのイメージに対して演算を行うには、スライディング近傍処理関数を使用します。詳細は、スライディング近傍演算を参照してください)。

個別ブロックに分割されたイメージ

関数 blockproc を使用したブロック処理の実装

個別ブロック演算を実行するには、関数 blockproc を使用します。関数 blockproc はイメージから個別ブロックを抽出し、処理を指定した関数に渡します。関数 blockproc は返されたブロックを組み合わせ、出力イメージを作成します。

たとえば、次のコマンドは 25 行 25 列のブロック内のイメージ I を関数 myfun を使用して処理します。この場合、関数 myfun はブロックのサイズを変更してサムネイルを作成します 関数ハンドルの詳細については、関数ハンドルの作成 (MATLAB)を参照してください。無名関数の詳細については、無名関数 (MATLAB)を参照してください。

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);
figure;
imshow('moon.tif');
figure;
imshow(I2,[]);

メモ

blockproc で実装できる多くの演算では、四角形ブロックでなく列行列になっていると、計算が非常に速く実行されます。この方法の詳細は、列方向の処理を使用して、スライディング近傍または個別ブロック演算を高速化するを参照してください。

パディングの適用

ブロック内のイメージを処理するときに、次の 2 つの理由でパディングを行う場合があります。

  • 部分ブロックの問題に対処するため

  • 境界周辺の重なりを作成するため

個別ブロック処理で説明したように、ブロックがイメージにぴったりと合わない場合は、イメージの右辺と底辺に部分ブロックができます。既定の設定では、パディングなしで、これらの部分ブロックはそのまま処理されます。イメージの右辺および底辺をパディングして、ブロックをフルサイズにするには、'PadPartialBlocks' パラメーターを true に設定します。

また、各ブロックに境界を付加することもできます。'BorderSize' パラメーターを使用して、ブロック処理でその値が対象となるブロックの外側にピクセルの行および列を追加します。境界があるとき、関数 blockproc は拡張したブロック (境界を含む) を設定した関数に渡します。

指定した境界をもつ個別ブロックに分割されたイメージ

上の図の中のブロックを関数ハンドル myfun を使用して処理するために、次のようにします。

B = blockproc(A,[4 8],myfun,'BorderSize',[1 2], ...
   'PadPartialBlocks',true)

この図でわかるように、部分ブロックおよびブロックの境界の両方のパディングをイメージのサイズ全体で行います。部分ブロックのパディングにより、元の 15 行 30 列の行列が 16 行 32 列の行列になります。また、イメージ内の各ブロックは 1 x 2 のピクセル境界で処理されます。つまり、上辺および底辺に1 ピクセル、左辺および右辺に 2 ピクセルが追加されます。境界を含むように拡張されたイメージの辺に沿ったブロックは、元のイメージの境界を超えて拡張します。イメージの辺に沿った境界ピクセルは 18 行 36 列の入力行列の最終的なサイズまで広がります。図の外側の四角形は、パディングされた後のイメージの新しい境界を示します。

既定の設定では、blockproc はイメージを 0 でパディングします。別のタイプのパディングが必要な場合は、関数 blockproc'PadMethod' パラメーターを使用します。