OpenCV.Resize详解

来源:互联网 发布:js 时间格式转换 编辑:程序博客网 时间:2024/05/22 17:05

OpenCV.Resize 详解

resize函数在各个图像处理项目里都应用十分广泛。最近一个小作业,整理图片大小不一样的数据集,就把它详细学习了一下。

函数调用:

c++:

void resize(InputArray src, OutputArray dst, Size dsize, double fx=0, double fy=0, 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)  

参数说明:

src - 原图
dst - 目标图像。当参数dsize不为0时,dst的大小为size;否则,它的大小需要根据src的大小,参数fx和fy决定。dst的类型(type)和src图像相同
dsize - 目标图像大小。当dsize为0时,它可以通过以下公式计算得出:


这里写图片描述

所以,参数dsize和参数(fx, fy)不能够同时为0。
fx - 水平轴上的比例因子。当它为0时,计算公式如下:


这里写图片描述

fy - 垂直轴上的比例因子。当它为0时,计算公式如下:


这里写图片描述

interpolation - 插值方法。共有5种:
1)INTER_NEAREST - 最近邻插值法
2)INTER_LINEAR - 双线性插值法(默认)
3)INTER_AREA - 基于局部像素的重采样(resampling using pixel area relation)。对于图像抽取(image decimation)来说,这可能是一个更好的方法。但如果是放大图像时,它和最近邻法的效果类似。
4)INTER_CUBIC - 基于4x4像素邻域的3次插值法
5)INTER_LANCZOS4 - 基于8x8像素邻域的Lanczos插值

以上五种插值算法的具体过程可以参考:opencv.resize函数五种插值算法实现过程

使用注意事项:

  1. dsize和fx/fy不能同时为0,要么你就指定好dsize的值,让fx和fy空置直接使用默认值,就像
    resize(img, imgDst, Size(30,30));
    要么你就让dsize为0,指定好fx和fy的值,比如fx=fy=0.5,那么就相当于把原图两个方向缩小一倍!

  2. 至于最后的插值方法,正常情况下使用默认的双线性插值就够用了。
    几种常用方法的效率是:最邻近插值>双线性插值>双立方插值>Lanczos插值;
    但是效率和效果成反比,所以根据自己的情况酌情使用。

  3. 正常情况下,在使用之前dst图像的大小和类型都是不知道的,类型从src图像继承而来,大小也是从原图像根据参数计算出来。但是如果你事先已经指定好dst图像的大小,那么你可以通过下面这种方式来调用函数:

resize(src, dst, dst.size(), 0, 0, interpolation);  
原创粉丝点击