40_OpenCV均匀调整图像大小,增大或缩小图像

目录

1. 均匀调整大小 cv::resize()

2. 图像金字塔

2.1 cv::pyrDown()

2.2 cv::buildPyramid()

2.3 cv::pyrUp()

2.4 高斯金字塔的逆——拉普拉斯金字塔


1. 均匀调整大小 cv::resize()

使用cv::resize()时,提供输入图像和想要转换的大小,该函数会生成我们想要的大小的图像。

void cv::resize(
	cv::InputArray src,  // input image
	cv::OutputArray dst,  // result image
	cv::Size dsize,  // new size
	double fx = 0,  // x-rescale
	double fy = 0,  // y-rescale
	int interpolation = cv::INTER_LINEAR  // interpolation method
);

dsize指定输出图像的大小有两种方式:

  • 使用绝对尺寸,这种情况下dsize参数直接设置为想要的结果图像dst的大小;
  • 使用相对尺寸,将dsize设置为cv::Size(0,0),分别将fx和fy设置为要应用于x轴和y轴的比例因子。

参数interpolation是插值方法,默认是线性插值,其它可选如下:

插值 含义
cv::INTER_NEAREST 最近邻插值
cv::INTER_LINEAR 双线性插值,默认插值
cv::INTER_AREA 像素区域重采样
cv::INTER_CUBIC 双三次插值
cv::INTER_LANCZOS4 插值(超过8x8个领域)
  • cv::INTER_NEAREAT,从源图像中最接近的像素获取调整大小的像素的值;
  • cv::INTER_LINEAR,根据到目标像素的接近度来线性加权2x2的源像素值;
  • cv::INTER_AREA,将新的调整大小的像素放置在旧像素上,然后平均覆盖像素值;扩展图像时,cv::INTER_AREA与cv::INTER_NEAREST相同。
  • cv::INTER_CUBIC,在源图像中的4x4周围像素之间拟合三次样条,从拟合的样条中读出相应的目标值;
  • cv::INTER_LANCZOS4,使用Lanczos插值,与三次方法类似,使用像素周围的8x8区域的信息。可以增加图像感知清晰度。

cv::Mat类有一个成员函数也是resize(),与cv::resize()是不同的。

        cv::resize()创建一个不同大小的图像,原始像素插值映射到该图像上。
        cv::Mat::resize()调整的是正在调用其成员的图像大小,并将图像裁剪为新的大小,像素不会插值(或外推)。

2. 图像金字塔

图像金字塔是图像的集合,把降采样和平滑滤波结合在一起,由单个原始图像产生,连续降采样,直到达到一些期望的停止点,这个停止点可能是单像素图像。

经常用到的两种图像金字塔:高斯和拉普拉斯金字塔。
高斯金字塔用于降采样图像;
要从金字塔中较低的图像重构上采样图像时,需要拉普拉斯金字塔。

opencv提供两个函数进行降采样图像:cv::pyrDown()和cv::buildPyramid()。提供函数cv::pyrUp()上采样图像。

2.1 cv::pyrDown()

cv::pyrDown()从其前身产生每个金字塔,首先将层G[i]与高斯核卷积,然后去除每个偶数行和列,从而生成高斯金字塔中的层(i+1)。这种情况下,每个图像是其前身的四分之一。cv::pyrDown()函数原型:

void cv::pyrDown(
	cv::InputArray src,  // input image
	cv::OutputArray dst,  // result image
	const cv::Size& dstsize = cv::Size()  // output image size
);

dstsize默认值为cv::Size()时,输出图像的大小为((src.cols+1)/2,(src.rows+1)/2)。
dstsize如果不使用默认值,可以设定dstsize,但需要按照如下限制设置:

| dstsize.width*2 - src.cols | ≤ 2
| dstsize.height*2 - src.rows | ≤ 2

这个限制表示目标图像差不多是源图像大小的一半。

2.2 cv::buildPyramid()

如果希望构建一系列新图像,每个新图像从前一个图像缩减,可以使用函数cv::buildPyramid(),该函数创建一个输出图像堆栈。函数原型:

void cv::buildPyramid(
	cv::InputArray src,  // input image
	cv::OutputArrayOfArrays dst,  // output images from pyramid
	int maxlevel  // number of pyramid levels
);

dst可以认为是类型为cv::Mat的STL向量,maxlevel表示构建多少个金字塔级别,必须大于或等于0,表示要生成的金字塔图像的数量。

当cv::buildPyramid()运行时,将返回dst中的长度为maxlevel+1的向量,dst中的第一个条目与src相同,第二个图像是源图像大小的一半,第三个图像是第二个图像大小的一半,以此类推。

2.3 cv::pyrUp()

cv::pyrUp()将现有图像转换为每个方向两倍大的图像。首先将图像大小增加到每个维度的原始值的两倍,新的偶数行填充0,然后使用高斯滤波器执行卷积以近似丢失像素的值。

cv::pyrDown()先高斯平滑,然后缩减图像尺寸;
cv::pyrUp()先增大图像,然后高斯平滑填充;

函数原型:

void cv::pyrUp(
	cv::InputArray src,  // input image
	cv::OutputArray dst,  // result image
	const cv::Size& dstsize = cv::Size()  // output image size
);

类似cv::pyrDown(),如果dstsize设置为默认值,结果图像与源图像的大小的两倍相同。也可以设置dstsize,将输出我们希望的图像的大小,但是也遵循一些限制:

| dstsize.width - src.cols*2 | ≤ (dstsize.width % 2)
| dstsize.height - src.rows*2 | ≤ (dstsize.height %2)

这个限制表示目标图像非常接近源图像大小的两倍。

2.4 高斯金字塔的逆——拉普拉斯金字塔

为了恢复原始的图像,需要访问下采样过程丢弃的信息,这个数据形成了拉普拉斯金字塔。拉普拉斯金字塔的第i层由以下定义:

L[i] = G[i] - UP(G[i+1])⊗g[5x5]

UP()将原始图像中的位置(x,y)中的每个像素映射到目标图像中的像素(2x+1,2y+1)进行大小化,符号⊗表示卷积;g[5x5]是高斯核。UP(G[i+1])⊗g[5x5]是opencv提供的cv::pyrUp()运算符的定义,所以可以直接用如下换算:
L[i] = G[i] - pyrUp(G[i+1])

40_OpenCV均匀调整图像大小,增大或缩小图像_第1张图片

 

你可能感兴趣的:(openCv,opencv,计算机视觉,深度学习)