OpenCV学习之路(十二) 图像金字塔与图像尺寸缩放

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/dashujua/article/details/82343497

官方文档

OpenCV 中对图片的尺寸进行放大和缩小操作一般通过下面两种方式:

resize() 函数。

pyrUp()、pyrDown() 函数。通过图像金字塔进行向上采样和向下采样对图片尺寸进行改变。

图像金字塔是图像中多尺度表达的一种,主要用于图像的分割,是一种以多分辨率来解释图像的有效但概念简单的结构。一幅图像的金字塔式一系列以金字塔形状来排列的,多分辨率逐步降低且来源于同一张原始图的图像集合。其通过依次向下采样获得,直到达到某个终止条件才停止采样。金字塔的底部是待处理图像的高分辨率表示,顶部是低分辨率的近似。金字塔形状和高斯内核如下图所示:

常用的有两种金字塔:

高斯金字塔(Gaussian pyramid)

拉普拉斯金字塔(Laplacian pyramid)

 

向下采样:

从金字塔第 i 层生成第 i+1 层,先用高斯核对 G_i{} 进行卷积;

然后删除所有的偶数行和偶数列。

新得到的图像面积会变为源图像的四分之一。迭代这个过程就可以得到整个图像金字塔。

 

向上采样:

将图像在每个方向上扩大两倍,新增的行和列用 0 填充;

使用先前的搞死内核 (乘以 4 )与放大后的图像进行卷积,获得新增图像的近似值

新得到的图像面积会变为源图像的四倍。迭代这个过程就可以得到整个图像金字塔。

向上采样和向下采样都会丢失一些源图像的信息。

 

1. resize() 函数。此函数精确地将源图像转换为指定尺寸的目标图像。函数原型如下:

void resize(InputArray src, OutputArray dst, Size dsize, double fx = 0, double fy = 0, int interpolation = INTER_LINEAR);

(1)第一个参数,InputArray 类型的 src,源图像。

(2)第二个参数,OutputArray 类型的 dst,目标图像。当其非 0 时,有着 dsize 的尺寸,或者由 src.size() 计算出来。

(3)第三个参数,Size 类型的 dsize,目标图像的尺寸。若其等于 0,由下式进行计算

                         dsize = Size(round(fx * src.cols,fy * src.rows))。其中,fx,fy,dsize 都不能为0。

(4)第四个参数,double 类型的 fx,沿水平轴的缩放系数,默认值为 0,且其为 0 时,由下式计算:

                         fx = (double) (dsize.width / src.cols)。

(5)第五个参数,double 类型的 fy,沿垂直轴的缩放系数,默认值为 0,且其为0 时,又下式计算:

                         fy = (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(效率较高)。

 

2. pyrUp() 函数。向上采样并模糊图像。函数原型如下:

void pyrUp(InputArray src, OutputArray dst, const Size& dstsize = Size(), int borderType = BORDER_DEFAULT);

(1)第一个参数,InputArray 类型的 src,源图像。

(2)第二个参数,OutputArray 类型的 dst,目标图像。

(3)第三个参数,const  Size& 类型的 dstsize。输出图像的大小,默认值为Size(),由(Size.cols * 2,Size.rows * 2)来进行计算。

(4)第四个参数,int 类型的 borderType。边界模式。

 

3. pyrDown() 函数。向下采样模糊图像。函数原型如下:

void pyrDown(InputArray src, OutputArray dst, const Size& dstsize = Size(), int borderType = BORDER_DEFAULT);

(1)第一个参数,InputArray 类型的 src,源图像。

(2)第二个参数,OutputArray 类型的 dst,目标图像。

(3)第三个参数,const  Size& 类型的 dstsize。输出图像的大小,默认值为Size(),由(Size.cols / 2,Size.rows / 2)来进行计算。

(4)第四个参数,int 类型的 borderType。边界模式。

简单示例代码如下:

#include<opencv2/opencv.hpp>
#include<iostream>

using namespace cv;
using namespace std;

int main()
{
	Mat srcImage;
	srcImage = imread("cat.jpg");
	imshow("原图", srcImage);

	pyrUp(srcImage, srcImage);
	imshow("向上采样效果图", srcImage);

	pyrDown(srcImage, srcImage);
	imshow("向下采样效果图", srcImage);

	waitKey(0);
	return 0;
}

代码运行结果如下:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

猜你喜欢

转载自blog.csdn.net/dashujua/article/details/82343497
今日推荐