画像ピラミッドって何?というところから入りますが、「解像度の異なる同一画像の集合」だそうです。
画像の拡大縮小表示や、処理の高速化のためにまず低解像度画像に対してざっくり処理し、徐々に精度を上げていく手法(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 コメント:
コメントを投稿