2012年2月18日土曜日

画像サイズを変更する - OpenCV for Android



画像サイズを変更するには、Imgproc.resize()メソッドを使用します。

Imgproc.resize(Mat src, Mat dst, Size dsize)
Imgproc.resize(Mat src, Mat dst, Size dsize, double fx, double fy, int interpolation)


 Mat src        処理したい元画像のMat
 Mat dst        変換後Mat
 Size dsize       変換後Matのサイズ
 double fx       水平軸の倍率
 double fy       垂直軸の倍率
 int interpolation   補間方法


dsizeがゼロの場合にはfxとfyを元にスケーリングされます。
fxが0.5なら横軸が半分にスケーリングされ、1.5なら1.5倍です。
逆にdsizeがゼロでなければfxとfyは無視されます。


interpolationについてはImgprocに以下定数が用意されています。


 INTER_NEAREST  最近傍補間
 INTER_LINEAR   バイリニア補間(デフォルト)
 INTER_AREA     ピクセル領域の関係を利用したリサンプリング
 INTER_CUBIC    4x4の近傍領域を利用するバイキュービック補間
 INTER_LANCZOS4 8x8の近傍領域を利用するLanczos法の補間


一般的に、画像を大幅に縮小するには、INTER_AREA補間が最良で、画像を拡大する場合は、INTER_CUBICか INTER_LINEARを使うと良いようです。
(INTER_CUBICは低速と但し書き有)


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

高さを0.2倍してみます。
Imgproc.resize(mat, mat,
  new Size(mat.size().width, mat.size().height * 0.2));


幅を3.0倍にしてみます。
Imgproc.resize(mat, mat, new Size(mat.size().width * 3.0 ,
  mat.size().height));


続いてfxとfyを使って、横0.5倍、縦0.1倍にしてみます。
Imgproc.resize(mat, mat, new Size(), 0.5, 0.1);



最後に補間方法をいくつか試してみます。
Imgproc.resize(mat, mat, new Size(),
  0.5, 0.1, Imgproc.INTER_NEAREST);

Imgproc.resize(mat, mat, new Size(),
  0.5, 0.1, Imgproc.INTER_AREA);


Imgproc.resize(mat, mat, new Size(),
  3.0, 0.9, Imgproc.INTER_CUBIC);


縮小に関しては、やはりINTER_AREAがキレイに縮小出来ますね。

0 コメント:

コメントを投稿