我们在图像处理中常常会调整图像大小,最常见的就是放大(zoom in)和缩小(zoom out),尽管几何变换也可以实现图像放大和缩小,但是这里我们介绍图像金字塔 。 一个图像金字塔是由一系列的图像组成,最底下一张是图像尺寸最大,最上方的图像尺寸最小,从空间上从上向下看就想一个古代的金字塔。
金字塔的底部是待处理图像的高分辨率表示,而顶部是低分辨率的近似。我们将一层一层的图像比喻成金字塔,层级越高,则图像越小,分辨率越低。
高斯金字塔 – 用来对图像进行降采样
拉普拉斯金字塔 – 用来重建一张图片根据它的上层降采样图片
-------------------------------------------------------------------------------------------------------------------------------
高斯金字塔
高斯金子塔是从底向上,逐层降采样得到。 降采样之后图像大小是原图像MxN的M/2 x N/2 ,就是对原图像删除偶数行与列,即得到降采样之后上一层的图片。
高斯金子塔的生成过程分为两步: 1.对当前层进行高斯模糊 2.删除当前层的偶数行与列 即可得到上一层的图像,这样上一层跟下一层相比,都只有它的1/4大小。
---------------------------------------------------------------------------------------------------------------------------------
DOG定义:
就是把同一张图像在不同的参数下做高斯模糊之后的结果相减,得到的输出图像,称为高斯不同(DOG) ,高斯不同是图像的内在特征,在灰度图像增强、角点检测和特征提取中经常用到。
上采样(cv::pyrUp) – zoom in 放大
#上采样API
void pyrUp(InputArray src, OutputArraydst, const Size& dstsize=Size(), int borderType=BORDER_DEFAULT )
参数说明:
第一个参数,InputArray类型的src,输入图像,Mat类的对象即可。
第二个参数,OutputArray类型的dst,输出图像,必须和源图片有一样的尺寸和类型。
第三个参数,const Size&类型的dstsize,输出图像的大小;有默认值Size(),即默认情况下,由Size(src.cols*2,src.rows*2)来进行计算。
第四个参数,int类型的borderType,即边界模式。
--------------------------------------------------------------------------------------------------------------------------------
降采样 (cv::pyrDown) – zoom out 缩小
#降采样API
void pyrDown(InputArray src,OutputArray dst, const Size& dstsize=Size(), int borderType=BORDER_DEFAULT)
参数说明:
第一个参数,InputArray类型的src,输入图像,Mat类的对象即可。
第二个参数,OutputArray类型的dst,输出图像,必须和源图片有一样的尺寸和类型。
第三个参数,const Size&类型的dstsize,输出图像的大小;有默认值Size(),即默认情况下,由Size Size((src.cols+1)/2, (src.rows+1)/2)来进行计算。
第四个参数,int类型的borderType,即边界模式。
归一化函数API
归一化就是要把需要处理的数据经过处理后(通过某种算法)限制在你需要的一定范围内。
#归一化函数API接口
cv::normalize(InputArry src,InputOutputArray dst,double alpha=1,double beta=0,int norm_type=NORM_L2,int dtype=-1,InputArray mark=noArry())
参数说明:
src 输入图像;
dst 输出图像,图像的大小和原图像一致;
alpha 可以用来规范值,也可以用来规范范围,并且是范围的下限;
beta 只用来规范范围并且是范围的上限;
norm_type 归一化选择的数学公式类型;有NORM_INF(无穷范数),NORM_L1(1范数), NORM_INFL2(2范数),NORM_MINMAX(范围归一化)
dtype 当为负,输出在大小深度通道数都等于输入,当为正,输出只在深度与输出不同,不同的地方由dtype决定;否则 和src通道一致,depth =CV_MAT_DEPTH(dtype).
mark 掩码。选择感兴趣区域,选定后只能对该区域进行操作。
=========================================================================
代码实现:
#include"stdafx.h"
#include
#include
#include
using namespace std;
using namespace cv;
int main(int agrc, char** argv) {
Mat src, dst;
src = imread("F:/photo/qx.jpg");
if (!src.data) {
printf("could not load image...");
return -1;
}
//char INPUT_WIN[] = "input image";
//char OUTPUT_WIN[] = "sample up";
namedWindow("input image", 0);
resizeWindow( "input image", 300, 300);
imshow("input image", src);
namedWindow("sample up", WINDOW_AUTOSIZE);
// 上采样
pyrUp(src, dst, Size(src.cols *2, src.rows * 2));
imshow("sample up", dst);
// 降采样
Mat s_down;
pyrDown(src, s_down, Size(src.cols / 2, src.rows / 2));
imshow("s_down", s_down);
// DOG
Mat gray_src, g1, g2, dogImg;
cvtColor(src, gray_src, CV_BGR2GRAY);
GaussianBlur(gray_src, g1, Size(5, 5), 0, 0);
GaussianBlur(g1, g2, Size(5, 5), 0, 0);
subtract(g1, g2, dogImg, Mat());
// 归一化显示
normalize(dogImg, dogImg, 255, 0, NORM_MINMAX);
imshow("DOG Image", dogImg);
waitKey(0);
return 0;
}
--------------------------------------------------------------------------------------------------------------------------------
图像处理效果:
图像降采样
图像原图
图像上采样
高斯不同(DOG)图像