無料ブログはココログ

« VisualStudio2010 と MFC リボン | トップページ | リソース集 »

2009年11月14日 (土)

Lanczos 関数よるイメージの拡縮の最適化

  ってほどではないけど、この手の処理というのは大抵規則正しいループになっているので、計算をテーブル化できる。

  Lanczos 関数の場合は、xy方向の組み合わせを画素に加えるので、xy 方向1列1行分を先に計算しておけば、各ピクセルごとに毎回計算する手間が省ける。同じように計算結果のピクセルが元画像のどのピクセルの影響が受けるかについての範囲もテーブル化できる。

  もう一つ、この処理では実際のイメージに対する処理は、散々計算しておいて最後に掛け算しているだけなので、元画像のサイズとスケールが固定ならば事前計算を先に済ませておくことができる。

  んで最初は 720 ms かかった処理が大体 13 ms くらいになった(OpenMPも使用)。事前計算では 11 ms くらいだった。使用している CPU は Core2 の E6700 2.66GHz。イイネ。目標だった 16 ms を切りましたよ。

  作ってみて思ったこと。これデータフォーマット依存しない使い方ができるよね。テストでは RGB の 24 ビットだったけど、処理としては最後に掛け算してるだけなので 8 ビットだろうが 16 ビットだろうが関係ない。ただ問題になるのは、画像が RGB とある場合は 3 回、グレースケールなら 1 回の処理が入るわけだけど、ここをどう汎用化するかが問題。for ループで回すとパフォーマンスが悪くなってしまうので使いたくない。コールルバック関数にするのが一番無難かもしれない。

« VisualStudio2010 と MFC リボン | トップページ | リソース集 »

プログラミング」カテゴリの記事