1. 程式人生 > >OpenCV:resize()重新調整影象大小

OpenCV:resize()重新調整影象大小

OpenCV中,resize函式用的比較多。

C++: 
void resize(InputArray src, //輸入
            OutputArray dst,//輸出
            Size dsize, //輸出影象的大小
            double fx=0, double fy=0, //fx、fy是沿x軸和y軸的縮放係數                               
            int interpolation=INTER_LINEAR //插值
            )
Python: cv2.resize(src,
                  dsize[, dst[, fx[, fy[, 
                  interpolation ]]]]
                  ) ->dst
C: void
cvResize(const CvArr* src, CvArr* dst, int interpolation=CV_INTER_LINEAR ) Python: cv.Resize(src, dst, interpolation=CV_INTER_LINEAR )-> None
  • dsize表示輸出影象的大小,如果為0,則
dsize=Size(round(fx∗src.cols),round
(fy∗src.rows))
  • dsize和fx、fy不能同時為0。
  • fx、fy是沿x軸和y軸的縮放係數;預設取0時,計算如下:
fx=(double)dsize.width/src.cols
fy=(double)dsize.height/src.rows
  • 最後一個引數interpolation表示插值方式,有以下幾種:
    INTER_NEAREST - 最近鄰插值
    INTER_LINEAR - 線性插值(預設)
    INTER_AREA - 區域插值
    INTER_CUBIC - 三次樣條插值
    INTER_LANCZOS4 - Lanczos插值

  • INTER_NEAREST最近鄰插值:
    目標如下的畫素點為對應的最近的原影象的畫素點。
    假設原影象大小為(s_height, s_width),目標影象大小為(d_height, d_width),那麼高度和寬度的縮放比例為h_ratio = s_height/d_height,w_ratio=s_width/d_width。
    目標影象畫素: (x, y)其值等於原影象(x * w_ration, y * h_ration)處的值。

  • INTER_LINEAR 線性插值(預設):
    在使用最近鄰插值時,得到的座標未必是一個整數,
    例如(xw_ration, yh_ration)=(10.5, 20.5),那麼可能取得座標點就有四種(10, 20)、(11, 20)、(10, 21)、(11, 21)。
    雙線性插值,會把這四個座標的畫素值加權求和。
    D(x, y) =
    S(j, k) * w1 + S(j+1, k) w2 + S(j+1,k+1) w3 + S(j, K+1) * w4,
    其中w為權值。
    權值大小和計算位置的小數部分有關。

  • CV_INTER_AREA:區域插值:
    區域插值分為3種情況:影象放大時類似於線性插值,影象縮小時可以避免波紋出現。

  • INTER_CUBIC 三次樣條插值:
    使用4x4鄰域內的畫素雙3次插值。

  • INTER_LANCZOS4 Lanczos插值
    使用8×8畫素鄰域的Lanczos插值
  • 示例程式碼:
#include <string>
#include <opencv2/opencv.hpp>
#include <opencv2/imgproc/imgproc.hpp>

using namespace cv;
using namespace stdint main(int argc, char* argv[])
{
    string path = "";
    int resize_height = 256;
    int resize_width = 256;
    Mat src = imread(path); //從路徑名中讀取圖片
    Mat dst;
    imshow("src", src);//顯示圖片
    resize(src, dst, Size(resize_width, resize_height), (0, 0), (0, 0), INTER_LINEAR);//重新調整影象大小
    imshow("dst", dst);
    waitKey(0);
    return 0;
}