【OpenCV基础】第十二课:图像的缩放

几何变换,图像金字塔,高斯不同

Posted by x-jeff on July 15, 2020

本文为原创文章,未经本人允许,禁止转载。转载请注明出处。

1.前言

实现图像的放大(zoom in)和缩小(zoom out)主要通过两种途径:

  1. 几何变换。
  2. 图像金字塔。

2.几何变换

通过几何变换实现图像放大和缩小功能主要是通过OpenCV的resize函数:

1
2
3
4
5
6
7
8
void resize(
	InputArray src, 
	OutputArray dst,
	Size dsize, 
	double fx = 0, 
	double fy = 0,
	int interpolation = INTER_LINEAR 
);

参数解释:

  1. InputArray src:输入图像。
  2. OutputArray dst:输出图像。
  3. Size dsize:输出图像的尺寸,即Size(width,height)。如果Size为Size(0,0),则通过第4,5个参数确定输出图像的尺寸。
  4. double fxwidth=fx*src.cols
  5. double fyheight=fy*src.rows
  6. int interpolation:图像插值的方法。默认为INTER_LINEAR,即线性插值。

例如,

1
resize(src,resize_src,Size(0,0),0.3,0.1);

下图左为原图,右为resize之后的图像:

3.图像金字塔

一个图像金字塔由一幅图像所衍生出的一系列不同分辨率的图像组成,最底下一张图像尺寸最大,最上方的图像尺寸最小,在空间中,形似金字塔。

‼️自上而下为上采样,自下而上为降采样(或下采样)。

图像金字塔分为两种:

  1. 高斯金字塔。
  2. 拉普拉斯金字塔。

3.1.高斯金字塔

高斯金字塔是从底向上,逐层降采样得到。

高斯金字塔的生成过程分为两步:

  1. 对当前层进行高斯模糊。所用的高斯内核为:
  2. 删除当前层的偶数行和列。

得到的上一层图像只有当前层的$\frac{1}{4}$大小。高斯金字塔必须逐层生成,不能跳层。

3.1.1.高斯不同

高斯不同(Difference of Gaussian-DOG)就是把同一张图像在不同的参数下做高斯模糊之后的结果相减,得到的输出图像。称为高斯不同(DOG)。

高斯不同是图像的内在特征,在灰度图像增强、角点检测中经常用到。

例如第2部分中的原图,其中一个高斯不同见下:

3.1.2.API

1
2
3
4
5
6
void pyrDown( 
	InputArray src, 
	OutputArray dst,
	const Size& dstsize = Size(), 
	int borderType = BORDER_DEFAULT 
);

⚠️使用时需要注意生成的图像是原图在宽与高各缩小$\frac{1}{2}$:

1
pyrDown(Mat src,Mat dst,Size(src.cols/2,src.rows/2));

3.2.拉普拉斯金字塔

拉普拉斯金字塔是一个上采样的过程,是高斯金字塔的逆过程。主要分为两步:

  1. 将原来的维数扩大一倍,对于增加的部分用0填充。
  2. 进行高斯模糊。所用的高斯内核和高斯金字塔一样。

3.2.1.API

1
2
3
4
5
6
void pyrUp( 
	InputArray src, 
	OutputArray dst,
	const Size& dstsize = Size(), 
	int borderType = BORDER_DEFAULT 
);

⚠️使用时需要注意生成的图像是原图在宽与高各放大两倍:

1
pyrUp(Mat src,Mat dst,Size(src.cols*2,src.rows*2));

4.代码地址

  1. 图像的缩放