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);
とすれば前項と同様の結果が得られる。
注意点
- ファイル名を直接指定できるのはTIFかJPG2000のみ(他の場合は個別ブロックの演算 - MATLAB & Simulink - MathWorks 日本) 参照
- いきなりblockprocで作らず、個別の領域の処理が行なえ望んだ返り値が得られるかを確認してから利用すること