图像处理(5):图像金字塔与图片尺寸缩放
五,尺寸调整:resize()函数
resize()为 OpenCV中专门用来调整图像大小的函数。
此函数将源图像精确地转换为指定尺寸的目标图像。如果源图像中设置了ROI (Region Of Interest ,感兴趣区域),那么resize()函数会对源图像的ROI区域进行调整图像尺寸的操作,来输出到目标图像中。若目标图像中已经设置了ROI区域,不难理解resize()将会对源图像进行尺寸调整并填充到目标图像的ROI中。
很多时候,我们并不用考虑第二个参数 dst 的初始图像尺寸和类型(即直接定义一个Mat类型,不用对其初始化),因为其尺寸和类型可以由 src、dsize、fx和fy这几个参数来确定。
看一下它的函数原型:
(1)第一个参数,InputArray类型的src,输入图像,即源图像,填Mat类的对象即可。
(2)第二个参数,OutputArray类型的dst,输出图像,当其非零时,有着dsize(第三个参数)的尺寸,或者由src.size()计算出来。
(3)第三个参数,Size类型的dsize,输出图像的大小。如果它等于零,由下式进行计算:
dsize=Size(round(fx*src.cols),round(fy*src.rows))
其中,dsize、fx、fy都不能为0。
(4)第四个参数,double类型的 fx,沿水平轴的缩放系数,有默认值0,且当其等于0时,由下式进行计算:
(double)dsize.width/src.cols
(5)第五个参数,double类型的fy,沿垂直轴的缩放系数,有默认值0,且当其等于0时,由下式进行计算:
(double)dsize.height/src.rows
(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_CUBIC(效率不高,慢,不推荐使用)或cV_INTER_LINEAR(效率较高,速度较快,推荐使用)。
当进行6次图像缩小接着6次图像放大操作后,两种不同的插值方式得到的效果图如图6.60、图6.61所示。
效果很明显,第一张全是一个个的像素,非常影响美观。另外一张却有雾化的朦胧美感,所以插值方式的选择,对经过多次放大缩小的图片最终得到的效果是有很大影响的。
接着我们来看两种resize的调用范例。
接着我们看看完整的示例程序。
原代码:
#include <opencv2/opencv.hpp>
#include<opencv2/core/core.hpp>
#include"opencv2/highgui/highgui.hpp"
#include<opencv2/imgproc/imgproc.hpp>
#include<iostream>
#include<time.h>
using namespace std;
using namespace cv;
int main(int argc, char** argv)
{
Mat srcImage = imread("E:/pictures/2.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;
}
运行截图: