目录
1. 均匀调整大小 cv::resize()
2. 图像金字塔
2.1 cv::pyrDown()
2.2 cv::buildPyramid()
2.3 cv::pyrUp()
2.4 高斯金字塔的逆——拉普拉斯金字塔
使用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指定输出图像的大小有两种方式:
参数interpolation是插值方法,默认是线性插值,其它可选如下:
插值 | 含义 |
cv::INTER_NEAREST | 最近邻插值 |
cv::INTER_LINEAR | 双线性插值,默认插值 |
cv::INTER_AREA | 像素区域重采样 |
cv::INTER_CUBIC | 双三次插值 |
cv::INTER_LANCZOS4 | 插值(超过8x8个领域) |
cv::Mat类有一个成员函数也是resize(),与cv::resize()是不同的。
cv::resize()创建一个不同大小的图像,原始像素插值映射到该图像上。
cv::Mat::resize()调整的是正在调用其成员的图像大小,并将图像裁剪为新的大小,像素不会插值(或外推)。
图像金字塔是图像的集合,把降采样和平滑滤波结合在一起,由单个原始图像产生,连续降采样,直到达到一些期望的停止点,这个停止点可能是单像素图像。
经常用到的两种图像金字塔:高斯和拉普拉斯金字塔。
高斯金字塔用于降采样图像;
要从金字塔中较低的图像重构上采样图像时,需要拉普拉斯金字塔。
opencv提供两个函数进行降采样图像:cv::pyrDown()和cv::buildPyramid()。提供函数cv::pyrUp()上采样图像。
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
这个限制表示目标图像差不多是源图像大小的一半。
如果希望构建一系列新图像,每个新图像从前一个图像缩减,可以使用函数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相同,第二个图像是源图像大小的一半,第三个图像是第二个图像大小的一半,以此类推。
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)
这个限制表示目标图像非常接近源图像大小的两倍。
为了恢复原始的图像,需要访问下采样过程丢弃的信息,这个数据形成了拉普拉斯金字塔。拉普拉斯金字塔的第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])