OpenCV中的缩放:
如果要放大或缩小图片的尺寸,可以使用OpenCV提供的两种方法:
- resize函数,是最直接的方式;
- pyrUp,pyrDown函数,即图像金字塔相关的两个函数,对图像进行上采样和下采样的操作。关于上采样和下采样可以参考我的另一篇文章:https://blog.csdn.net/weixin_45525272/article/details/121446923
resize函数
函数原型:
void cv::resize( InputArray _src, OutputArray _dst, Size dsize, double inv_scale_x = 0, double inv_scale_y = 0, int interpolation = INTER_LINEAR )
参数说明:
- src,输入图像,Mat类型即可;
- dst,输出图像,当其非零时,有着dsize(第三个参数)的尺寸或者有src.size()计算出来;
- dsize,输出图像的大小。如果它等于0,由下式计算:
dsize = Size( round(fx*src.cols, round(fy*src.rows))); 其中fx,fy,dsize都能不为0
- fx,沿水平轴的缩放系数,默认值为0,且等于0时,由下式计算:
inv_scale_x = (double)dsize.width/ssize.width;
- fy,沿垂直轴的缩放系数,默认值为0,且等于0时,由下式计算:
inv_scale_y = (double)dsize.height/ssize.height;
- interpolation,用于指定插值方式,默认值为INTER_LINEAR(线性插值),可选插值方式如下:
注意:要缩小图像,一般情况下用INTER_AREA来插值;而若要放大图像,一般情况下用INTER_CUBIC(效率不高,不推荐)或INTER_LINEAR(效率高,推荐)
代码案例
#include <iostream> #include <math.h> #include <opencv2/opencv.hpp> #include<opencv2/highgui.hpp> #include <opencv2/highgui/highgui_c.h> using namespace cv; using namespace std; int main() { // 载入原图 Mat srcImage = imread("./test2.jpg"); Mat temImage, dstImage1, dstImage2, dstImage3, dstImage4; // 临时变量和目标图的定义 temImage = srcImage; // 显示原图 imshow("【原始图】", srcImage); //进行尺寸调整操作 resize(temImage, dstImage1, Size(temImage.cols / 2, temImage.rows / 2), (0, 0), (0, 0), 3); resize(dstImage1, dstImage2, Size(dstImage1.cols / 2, dstImage1.rows / 2), (0, 0)(0, 0), 3); resize(srcImage, dstImage3, Size(srcImage.cols * 2, srcImage.rows * 2), (0, 0)(0, 0), 1); resize(dstImage3, dstImage4, Size(dstImage3.cols * 2, dstImage3.rows * 2), (0, 0)(0, 0), 1); // 显示效果图 imshow("【效果图一:原图缩小两倍】", dstImage1); imshow("【效果图二:效果一缩小两倍】", dstImage2); imshow("【效果图三:原图放大两倍】", dstImage3); imshow("【效果图四:效果三放大两倍】", dstImage4); waitKey(0); return 0; }