opencv-resize()放缩函数简介

主要介绍函数resize();

图像缩放的效果图如下:

opencv-resize()放缩函数简介

主程序代码及函数解释如下所示:

  1. /************************************************************************/
  2. /*
  3. OpenCV图像缩放使用的函数是:resize
  4. void resize(InputArray src, OutputArray dst, Size dsize, double fx=0, double fy=0, int interpolation=INTER_LINEAR )
  5. 参数含义:
  6. InputArray src     -原图像
  7. OutputArray dst    -输出图像
  8. Size dsize         -目标图像的大小
  9. double fx=0        -在x轴上的缩放比例
  10. double fy=0        -在y轴上的缩放比例
  11. int interpolation  -插值方式,有以下四种方式
  12. INTER_NEAREST      -最近邻插值
  13. INTER_LINEAR  -双线性插值 (缺省使用)
  14. INTER_AREA    -使用象素关系重采样,当图像缩小时候,该方法可以避免波纹出现。当图像放大时,类似于 INTER_NN 方法。
  15. INTER_CUBIC   -立方插值。
  16. 说明:dsize与fx和fy必须不能同时为零
  17. */
  18. /************************************************************************/
  19. #include <opencv2\opencv.hpp>
  20. #include <opencv2\imgproc\imgproc.hpp>
  21. using namespace cv;
  22. int main()
  23. {
  24. //读入图像
  25. Mat srcImage=imread("1.jpg");
  26. Mat temImage,dstImage1,dstImage2;
  27. temImage=srcImage;
  28. //显示原图
  29. imshow("原图",srcImage);
  30. //尺寸调整
  31. resize(temImage,dstImage1,Size(temImage.cols/2,temImage.rows/2),0,0,INTER_LINEAR);
  32. resize(temImage,dstImage2,Size(temImage.cols*2,temImage.rows*2),0,0,INTER_LINEAR);
  33. imshow("缩小",dstImage1);
  34. imshow("放大",dstImage2);
  35. waitKey();
  36. return 0;
  37. }                      

    1、最邻近元法

      这是最简单的一种插值方法,不需要计算,在待求象素的四邻象素中,将距离待求象素最近的邻象素灰度赋给待求象素。设i+u, j+v(i, j为正整数, u, v为大于零小于1的小数,下同)为待求象素坐标,则待求象素灰度的值 f(i+u, j+v) 如下图所示:

    opencv-resize()放缩函数简介

    如果(i+u, j+v)落在A区,即u<0.5, v<0.5,则将左上角象素的灰度值赋给待求象素,同理,落在B区则赋予右上角的象素灰度值,落在C区则赋予左下角象素的灰度值,落在D区则赋予右下角象素的灰度值。

    最邻近元法计算量较小,但可能会造成插值生成的图像灰度上的不连续,在灰度变化的地方可能出现明显的锯齿状。

    2、双线性内插法

    双线性内插法是利用待求象素四个邻象素的灰度在两个方向上作线性内插,如下图所示:

    opencv-resize()放缩函数简介

    对于 (i, j+v),f(i, j) 到 f(i, j+1) 的灰度变化为线性关系,则有:

          f(i, j+v) = [f(i, j+1) - f(i, j)] * v + f(i, j)

    同理对于 (i+1, j+v) 则有:

    f(i+1, j+v) = [f(i+1, j+1) - f(i+1, j)] * v + f(i+1, j)

    从f(i, j+v) 到 f(i+1, j+v) 的灰度变化也为线性关系,由此可推导出待求象素灰度的计算式如下:

    f(i+u, j+v) = (1-u) * (1-v) * f(i, j) + (1-u) * v * f(i, j+1) + u * (1-v) * f(i+1, j) + u * v * f(i+1, j+1)

    双线性内插法的计算比最邻近点法复杂,计算量较大,但没有灰度不连续的缺点,结果基本令人满意。它具有低通滤波性质,使高频分量受损,图像轮廓可能会有一点模糊。

    3、三次内插法

    该方法利用三次多项式S(x)求逼近理论上最佳插值函数sin(x)/x, 其数学表达式为:

    opencv-resize()放缩函数简介

    待求像素(x, y)的灰度值由其周围16个灰度值加权内插得到,如下图:

    opencv-resize()放缩函数简介

    待求像素的灰度计算式如下:

    f(x, y) = f(i+u, j+v) = ABC

    其中:

    opencv-resize()放缩函数简介

    三次曲线插值方法计算量较大,但插值后的图像效果最好。

上一篇:Mysql导入导出工具Mysqldump和Source命令用法详解


下一篇:【REACT NATIVE 系列教程之二】创建自定义组件&&导入与使用示例