将源图像精确地转换为指定尺寸的目标图像。如果源图像中设置了ROI(Region Of Interest ,感兴趣区域),那么resize( )函数会对源图像的ROI区域进行调整图像尺寸的操作,来输出到目标图像中。
缩小图像:1、对图像G_i进行高斯内核卷积 2、将所有偶数行和列去除
放大图像:1、将图像在每个方向扩大为原来的两倍,新增的行和列以0填充
2、使用先前同样的内核(乘以4)与放大后的图像卷积,获得 “新增像素”的近似值
【原型】
C++: void resize(InputArray src,OutputArray dst, Size dsize, double fx=0, double fy=0, int interpolation=INTER_LINEAR )
参数1:InputArray类型的src,输入图像,填Mat类的对象即可。
参数2:OutputArray类型的dst,输出图像,当其非零时,有着dsize的尺寸,或者由src.size()计算出来。
参数3:Size类型的dsize,输出图像的大小;如果它等于零,由下式进行计算: 其中,dsize,fx,fy都不能为0。
参数4:double类型的fx,沿水平轴的缩放系数,有默认值0,且当其等于0时,由下式进行计算:
参数5:double类型的fy,沿垂直轴的缩放系数,有默认值0,且当其等于0时,由下式进行计算:
参数6:int类型的interpolation,用于指定插值方式,默认为INTER_LINEAR(线性插值)。
可选的插值方式如下:
- INTER_NEAREST - 最近邻插值
- INTER_LINEAR - 线性插值(默认值)
- INTER_AREA - 区域插值(利用像素区域关系的重采样插值)
- INTER_CUBIC –三次样条插值(超过4×4像素邻域内的双三次插值)
- INTER_LANCZOS4 -Lanczos插值(超过8×8像素邻域的Lanczos插值)
若要缩小图像,一般情况下用CV_INTER_AREA来插值
而若要放大图像,一般情况下CV_INTER_LINEAR
【实例】
#include <opencv2/opencv.hpp>
#include <opencv2/imgproc/imgproc.hpp>
using namespace cv;
int main()
{
//载入原始图
Mat srcImage = imread("D:\\study\\picture\\a.jpg");
Mat tmpImage, dstImage1, dstImage2;//临时变量和目标图的定义
tmpImage = srcImage;//将原始图赋给临时变量
//显示原始图
imshow("【原始图】", srcImage);
//进行尺寸调整操作
resize(tmpImage, dstImage1, Size(tmpImage.cols / 2, tmpImage.rows / 2), (0, 0), (0, 0), 3);
resize(tmpImage, dstImage2, Size(tmpImage.cols * 2, tmpImage.rows * 2), (0, 0), (0, 0), 3);
//显示效果图
imshow("【效果图】之一", dstImage1);
imshow("【效果图】之二", dstImage2);
waitKey(0);
return 0;
}