MATLAB blockproc - eiichiromomma/CVMLAB GitHub Wiki

(MATLAB) blockproc

ブロック状に画像を区切って各々に同一の処理・解析を行ないたい場合に便利な関数

画像の全領域を均等なサイズに分割して処理することは多々あり、多くの場合forループで移動させるか、個別のROIを設定する等が必要となる。blockprocを使うと領域内の処理と返り値(スカラー、ベクトル、行列)を記述した関数へのハンドルを引数に渡せば、各々返り値の行列を受け取れる。

スカラーを受け取る例

1チャネルの場合

358x537x1の画像moon.tifに対し32x32の各領域について平均値を求める

fun = @(block_struct) mean2(block_struct.data);
meanarray = blockproc('moon.tif',[32 32],fun);

出力meanarrayは12x17(double)

多チャネルの場合

732x486x3の画像pears.png)への処理

fun = @(block_struct) mean2(block_struct.data);
I = imread('pears.png)');
meanarray = blockproc(I,[32 32],fun);

出力は23x16(double)で、mean2の処理は全チャネルの平均を求める点に注意。各チャネルで求めたい場合は渡す段階でI(:,:,1)とかやる。

また、

fun = @(block_struct) imcomplement(imresize(block_struct.data,0.15));
I = imread('pears.png)');
I2 = blockproc(I,[32 32],fun);

のようにしているとI2は多チャネルのまま処理される。

関数を別に用意する場合

返り値を明示すれば.m関数でもハンドルを渡せばブロックごとの処理ができる。

function [ Iout ] = testfun( block_struct )
  Iout = imresize(block_struct.data,0.15);
  Iout = imcomplement(Iout);
end

のようなtestfun.mに対し

I = imread('pears.png)');
I2 = blockproc(I,[32 32],@testfun);

とすれば前項と同様の結果が得られる。

注意点