resize函数

  • Post author:
  • Post category:其他


resize函数:

主要用于调整图像的大小

函数调用格式:


void resize(InputArray src, OutputArray dst, Size dsize, double fx=0, double fy=0, int interpolation=INTER_LINEAR )




参数详解:



InputArray src, OutputArray dst:分别表示输入和输出图像





Size dsize:表示输出图像的大小







double fx=0, double fy=0:表示x和y方向上变换大小的因素,当都是0的时候:








\texttt{(double)dsize.width/src.cols}
\texttt{(double)dsize.height/src.rows}

















int interpolation=INTER_LINEAR :表示插值方法












• INTER_NN – 最近邻差值,





• INTER_LINEAR –



双线性差值 (缺省使用)





• INTER_AREA –



使用象素关系重采样。当图像缩小时候,该方法




可以避免波纹出现。当图像放大时,类似于


INTER_NN



方法..





• INTER_CUBIC –



立方差值.



























1、最近邻:公式,



  1. for


    (


    int


    i = 0; i < matDst1.cols; ++i)


  2. {


  3. int


    sx = cvFloor(i * scale_x);


  4. sx = std::min(sx, matSrc.cols – 1);


  5. for


    (


    int


    j = 0; j < matDst1.rows; ++j)


  6. {


  7. int


    sy = cvFloor(j * scale_y);


  8. sy = std::min(sy, matSrc.rows – 1);

  9. matDst1.at<cv::Vec3b>(j, i) = matSrc.at<cv::Vec3b>(sy, sx);

  10. }

  11. }

  12. cv::imwrite(

    “nearest_1.jpg”


    , matDst1);



  13. cv::resize(matSrc, matDst2, matDst1.size(), 0, 0, 0);

  14. cv::imwrite(

    “nearest_2.jpg”


    , matDst2);




2、双线性:由相邻的四像素(2*2)计算得出,公式,




  1. uchar* dataDst = matDst1.data;



  2. int


    stepDst = matDst1.step;


  3. uchar* dataSrc = matSrc.data;


  4. int


    stepSrc = matSrc.step;



  5. int


    iWidthSrc = matSrc.cols;



  6. int


    iHiehgtSrc = matSrc.rows;




  7. for


    (


    int


    j = 0; j < matDst1.rows; ++j)


  8. {


  9. float


    fy = (


    float


    )((j + 0.5) * scale_y – 0.5);



  10. int


    sy = cvFloor(fy);


  11. fy -= sy;

  12. sy = std::min(sy, iHiehgtSrc – 2);

  13. sy = std::max(0, sy);



  14. short


    cbufy[2];


  15. cbufy[0] = cv::saturate_cast<

    short


    >((1.f – fy) * 2048);


  16. cbufy[1] = 2048 – cbufy[0];



  17. for


    (


    int


    i = 0; i < matDst1.cols; ++i)


  18. {


  19. float


    fx = (


    float


    )((i + 0.5) * scale_x – 0.5);



  20. int


    sx = cvFloor(fx);


  21. fx -= sx;



  22. if


    (sx < 0) {


  23. fx = 0, sx = 0;

  24. }


  25. if


    (sx >= iWidthSrc – 1) {


  26. fx = 0, sx = iWidthSrc – 2;

  27. }



  28. short


    cbufx[2];


  29. cbufx[0] = cv::saturate_cast<

    short


    >((1.f – fx) * 2048);


  30. cbufx[1] = 2048 – cbufx[0];



  31. for


    (


    int


    k = 0; k < matSrc.channels(); ++k)


  32. {

  33. *(dataDst+ j*stepDst + 3*i + k) = (*(dataSrc + sy*stepSrc + 3*sx + k) * cbufx[0] * cbufy[0] +

  34. *(dataSrc + (sy+1)*stepSrc + 3*sx + k) * cbufx[0] * cbufy[1] +

  35. *(dataSrc + sy*stepSrc + 3*(sx+1) + k) * cbufx[1] * cbufy[0] +

  36. *(dataSrc + (sy+1)*stepSrc + 3*(sx+1) + k) * cbufx[1] * cbufy[1]) >> 22;

  37. }

  38. }

  39. }

  40. cv::imwrite(

    “linear_1.jpg”


    , matDst1);



  41. cv::resize(matSrc, matDst2, matDst1.size(), 0, 0, 1);



版权声明:本文为qq_18343569原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。