ブロックマッチングのプログラム本体 (Matlab)

先週の金曜日に MacBook Pro Retina ディスプレイが届きました。そのせいで、この記事を投稿する時間が取れませんでした。Mac の設定ネタもたまりましたが、ブロックマッチングの本体の説明が残っていたので紹介しておきます。

% mobile1 と mobile2 という同サイズの画像が用意されているものとします。
% mobile1 から mobile2 の予測画像(整数精度)を作ります。
BS = 16; % ブロックサイズ
SWS = BS*5; % サーチウインドウサイズ
AS = (SWS-BS)/2; % サーチウインドウの片側の出っ張りサイズ

predict = mobile2.zeros; % 予測画像格納オブジェクト
ext = mobile1.extRing(AS); % サーチウインドウがはみ出る分の周期拡張オブジェクト
ext.setBlockSize_(SWS, SWS, 0, BS, BS);
% ブロックサイズはSWS、移動は BS、スモールブロック禁止
mobile2.setBlockSize_(BS, BS); % 予測したい画像は BS 単位で移動

predict.setBlockSize_(BS, BS); % 予測画像も BS 単位で移動
cond = true;
while (cond)
    ob = mobile2.getBlock_; % 検索するブロックを取得
    sw = ext.getBlock_; % サーチウインドウを取得
    [out, vy, vx] = sw.blockMatching(ob); % sw 内で OB をブロックマッチング
    disp([num2str(mobile2.nowy), ',', num2str(mobile2.nowx), ':', num2str(vy), ',', num2str(vx)]);
    predict.setBlock_(out); % out を予測画像の該当ブロックにセット
    cond = (mobile2.next_ * ext.next_ * predict.next_ == 1);
end

mobile2.printPSNR(mobile1, 'mobile1');
mobile2.printPSNR(predict, 'predict');

複雑なループ処理を書かずに予測画像が作れていることがわかると思います。処理時間は長く実用的ではありませんが、コーディング時間やデバッグにかかる時間が低減できるので、すぐにアイデアをコーディングして結果を出さなくてはならないシミュレータ屋さんにはいいのではないでしょうか。