2012年3月4日日曜日

画像ピラミッドを作成する - OpenCV for Android


画像ピラミッドって何?というところから入りますが、「解像度の異なる同一画像の集合」だそうです。
画像の拡大縮小表示や、処理の高速化のためにまず低解像度画像に対してざっくり処理し、徐々に精度を上げていく手法(coarse-to-fine)などに利用されます。

画像ピラミッドを作成するには、pyrDown()、pyrUp()メソッドを利用します。
C++ではbuildPyramid()という縮小のみ行うメソッドがありますが、JAVAでは見当たりませんでした。
裏ではpyrDown()を再帰で呼んでListに格納しているだけのようなので、必要であれば自分で実装すれば良いと思います。


Imgproc.pyrDown(Mat src, Mat dst, Size dstsize)

Mat src    処理したい元画像のMat
Mat dst    変換後Mat
Size dstsize 変換後サイズ

dstsizeに関しては制限が厳しいようで、何パターンか試しましたがsrcの1/2以外通りませんでした。
dstsizeを省略しても同じく1/2になるようなので、省略してしまえば良いようです。
さらに縮小する場合は、縮小後のMatに再度pyrDownを実行すれば縮小されます。


Imgproc.pyrUp(Mat src, Mat dst, Size dstsize)

Mat src    処理したい元画像のMat
Mat dst    変換後Mat
Size dstsize 変換後サイズ


ちなみに、どちらもmatは使いまわしがききます。


それでは実際にやってみましょう。

ダウンサンプリング1回。
Imgproc.pyrDown(mat, dstMat);


ダウンサンプリング2回。
Imgproc.pyrDown(mat, dstMat);
Imgproc.pyrDown(dstMat, dstMat);


アップサンプリング1回。
Imgproc.pyrUp(mat, dstMat);


アップサンプリング2回。
Imgproc.pyrUp(mat, dstMat);
Imgproc.pyrUp(dstMat, dstMat);


拡大縮小と何が違うのか良く分かりませんが、coarse-to-fineのために前処理として使うことになるのだと思われます。

0 コメント:

コメントを投稿