読者です 読者をやめる 読者になる 読者になる

OpenCvSharpをつかう その11(画像のサイズ変更)

OpenCvSharp

cvResizeを用いた拡大処理のサンプルです。詳しい解説はありません。

補間の手法

画像を拡大・縮小する際には、元の画像には無かったピクセルが必ず生まれるので、その値をうまく決定する必要があります。OpenCVのcvResizeでは以下の補間手法が利用できます。大ざっぱにいえば下のものほどきれいな結果になります。(CV_INTER_AREA は拡大では CV_INTER_NN と同じようなので割愛しています。)

  1. CV_INTER_NN (最近隣接補間)
  2. CV_INTER_LINEAR (バイリニア補間)
  3. CV_INTER_CUBIC (バイキュービック補間)
cvResize(src, dst, CV_INTER_NN);

さらにOpenCV 2.0 のcv::resizeでは、INTER_LANCZOS4 という列挙体の値が利用できて、これによりLanczos法による拡大縮小が行えます。Lanczos法はさらに良い結果になる、らしいです。

cv::resize(src, dst, cv::Size(), 0, 0, cv::INTER_LANCZOS4);

cvResizeの方でも、cv::INTER_LANCZOS4を使ってしまえばLanczos法が利用できるようです。

cvResize(src, dst, cv::INTER_LANCZOS4);

コード

上記4つの手法の結果を比べてみます。

using (IplImage src = new IplImage(Const.ImageMaltese, LoadMode.AnyColor | LoadMode.AnyDepth))
{
    CvSize size = new CvSize(src.Width * 2, src.Height * 2);
    using (IplImage dstNN = new IplImage(size, src.Depth, src.NChannels))
    using (IplImage dstCubic = new IplImage(size, src.Depth, src.NChannels))
    using (IplImage dstLinear = new IplImage(size, src.Depth, src.NChannels))
    using (IplImage dstLanczos = new IplImage(size, src.Depth, src.NChannels))                
    {
        Cv.Resize(src, dstNN, Interpolation.NearestNeighbor);
        Cv.Resize(src, dstCubic, Interpolation.Cubic);        
        Cv.Resize(src, dstLinear, Interpolation.Linear);
        Cv.Resize(src, dstLanczos, Interpolation.Lanczos4);

        using (new CvWindow("src", src))
        using (new CvWindow("dst NearestNeighbor", dstNN))
        using (new CvWindow("dst Cubic", dstCubic))
        using (new CvWindow("dst Linear", dstLinear))
        using (new CvWindow("dst Lanczos4", dstLanczos))                    
        {
            Cv.WaitKey();
        }
    }
}

左から順に、NearestNeighbor, Linear, Cubic, Lanczos4です。クリックすると大きい画像が出てきますので確認してみてください。


OpenCV 2 Computer Vision Application Programming Cookbook

OpenCV 2 Computer Vision Application Programming Cookbook