open cv图像上采样与下采样
什么是上采样和下采样
从上向下 上采样 分辨率越高 2倍
从下向上 降采样 分辨率越低 2/1
图片采样越高 分辨率更密集清晰
图像金字塔概念
1.我们在图像处理中常常会调整图像大小,最常见的就是放
大(zoom in)和缩小( zoom out) , 尽管几何变换也可以实
现图像放大和缩小,但图像金字塔可以保证每一层图像的特征不变
2. 一个图像金字塔式一系列的图像组成, 最底下一张是图像
尺寸最大,最上方的图像尺寸最小,从空间上从上向下看
就想一个古代的金字塔。
3.不同尺度空间寻找图片特征
图像金字塔的方法
●高斯金字塔- 用来对图像进行降采样
●拉普拉斯金字塔-用来重建一张图片根据它的上层降
采样图片
图像金字塔概念-高斯金字塔
●高斯金子塔是从底向上, 逐层降采样得到
降采祥之后图像大小是原图像M(宽)xN(高)的 M/2 x N/2
,就是对原图像删除偶数行与列(缩减),即得到降采样
之后上一层的图片
●高斯金字塔的生成过程分为两步:
1.对当前层进行高斯模糊
2.删除当前层的偶数行与列即可得到
上一层的图像,这样上一层跟下一层
相比,都只有它的1/4大小
高斯不同(Difference of Gaussian-DOG)
●定义: 就是把同一张图像在不同的参数下做高斯模糊
之后的结果相减,得到的输出图像。称为高斯不同
(DOG)
●高斯不同是图像的内在特征 ,在灰度图像增强、角点
检测中经常用到
采样相关API
●上采样(x:pyrUp) - zoom in放大
pyrUp(Mat src, dest, Size(src.cols2, src.rows2))
生成的每一层图像是上一层图的宽与高各放大两倍
●降采样 (x:pyrDown)- zoom out缩小
pyrDown( src,dest, Size(src.cols/2, src.rows/2))
生成的每一层图像是上一层图的宽与高各缩小2/1
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui_c.h>
#include <iostream>
#include <math.h>
using namespace cv;
using namespace std;
Mat src, dst,dst1,dst2,dst3,dst4;
void pyrUPandDOWN(int, void*);
int main()
{
src = imread("D:/实验台/机器视觉/测试图片/盖茨.jpg");
if (src.empty())
{
cout << "无法打开" << endl;
return -1;
}
imshow("原图",src);
pyrUPandDOWN(0,0);
waitKey(0);
return 0;
}
void pyrUPandDOWN(int, void*)
{
//上采样与下采样
pyrUp(src, dst, Size(src.cols * 2, src.rows * 2));
//imshow("上采样",dst);//图片变大4倍,分辨率不变
pyrDown(src, dst1, Size(src.cols/2, src.rows/2));
//imshow("降采样", dst1);//图片缩小为4/1,分辨率不变
//上采样和下采样只能放大和缩小4倍 只能*2或/2
//图像放大与缩小
resize(src,dst2, Size(src.cols/2, src.rows/2));
//imshow("放大",dst2);
//可以放大和缩小任意的倍数
printf("原图%d %d\n",src.cols,src.rows);
printf("上采样%d %d\n", dst.cols, dst.rows);
printf("下采样%d %d\n", dst1.cols, dst1.rows);
printf("放大缩小%d %d\n", dst2.cols, dst2.rows);
基于图像金字塔的高斯不同(DOG)
Mat gary,g1, g2,dogimg;
cvtColor(src, gary, CV_BGR2GRAY);//先转换为灰度图
GaussianBlur(gary,g1,Size(5,5),1,1);//高斯模糊层次分明
imshow("高斯模糊一", g1);
GaussianBlur(g1, g2, Size(5,5),1,1);//卷积核越大越模糊 获得的层次线条越粗
imshow("高斯模糊二",g2);
//对每一层图像进行高斯模糊提取特征
//与原图像图像特征相匹配 识别
subtract(g1,g2,dogimg, Mat());//Mat可以不要 关于像素操作的加减乘除运算 不论单通道灰度还是三通道彩图都是可以使用的
imshow("减运算",dogimg);
//减运算(,);
//将两个图像g1、g2的像素值相减赋给图像dog
//得到黑漆漆的图片
//因为灰度值差值低 所以黑 轮廓不明显 差异不大
//归一化操作
//可将图像像素值控制在某个范围之内。(用于扩大或缩小像素范围)
normalize(dogimg,dogimg,255,0,NORM_MINMAX);//255-0时与0-255差异不大
//将图片数组归一化 到0到255之间,dogimg为输入输出图像数组;
//255为最大值;0为最小值;类型为NORM_MINMAX
// NORM_MINMAX:数组的数值被平移或缩放到一个指定的范围,线性归一化
//计算公式:最大值255 *(用图像中的每个像素值-最小像素值)/(图像中最大像素值-最小像素值)+ 最小值
//图片变亮 轮廓明显 差异明显
imshow("高斯不同",dogimg);
}
高斯金字塔的作用(为什么需要上采样,下采样,高斯模糊,减运算,高斯不同)
用于图像的重组重建 和 特征提取
整个高斯金字塔,或者说是差分高斯金字塔是我们确定SIFT特征的基础,
让我们首先想想高斯金字塔到底干了一件什么事情,他到底模仿的是什么?
答案很容易确定,高斯金字塔模仿的是图像的不同的尺度,尺度应该怎样理解?
对于一副图像,你近距离观察图像,与你在一米之外观察,看到的图像效果是不同的,
前者比较清晰,后者比较模糊,前者比较大,后者比较小,通过前者能看到图像的一些细节信息,
通过后者能看到图像的一些轮廓的信息,这就是图像的尺度,图像的尺度是自然存在的,
并不是人为创造的。好了,到这里我们明白了,其实以前对一幅图像的处理还是比较单调的,
因为我们的关注点只落在二维空间,并没有考虑到“图像的纵深”这样一个概念,
如果将这些内容考虑进去我们是不是会得到更多以前在二维空间中没有得到的信息呢?于是高斯金字塔横空出世了,它就是为了在二维图像的基础之上榨取出图像中自然存在的另一个维度:尺度。因为高斯核是唯一的线性核也就是说使用 高斯核对图像模糊不会引入其他噪声因此就选用了高斯核来构建图像的尺度