十二、图像上的采样和降采样
1、图像金字塔
概念:
- 我们在图像处理中常常会调整图像大小,最常见的就是放大(zoom in)和缩小(zoom out),尽管几何变换也可以实现图像放大和缩小,但图像金字塔可以保证每一层图像的特征不变。
- 一个图像金字塔是一系列的图像组成,最底下一张是图像尺寸最大,最上方的图像尺寸最小,从空间上从上向下看就像一个古代的金字塔。
- 高斯金字塔是从底向上,逐层降采样得到。
- 降采样之后图像大小是原图像M*N的M/2 * N/2,就是对原图像删除偶数行与列,即得到降采样之后上一层的图片。
步骤:
- 对当前层进行高斯模糊
- 删除当前层的偶数行与列,即可得到上一层的图像,这样上一层跟下一层比,都只有它的1/4大小。
分类:
- 高斯金字塔:用来对图像进行降采样
- 拉普拉斯金字塔:用来重建一张图片根据它的上层降采样图片
2、高斯不同(DOG)
- 定义
就是把同一张图像在不同的参数下做高斯模糊之后的结果相减,得到的输出图像。称为高斯不同。 - 高斯不同是图像的内在特征,在灰度图像增强、角点检测中经常用到。
3、采样相关API
- 上采样()— zoom in 放大
pyrUP(Mat src, Mat dst, Size(src.cols*2, src.rows*2));
生成的图像是原图在宽与高各放大2倍 - 降采样()— zoom out 缩小
pyrUP(Mat src, Mat dst, Size(src.cols/2, src.rows/2));
生成的图像是原图在宽与高各缩小1/2 - 高斯不同
GaussianBlur(gray_src, g1, Size(3,3), 0, 0);
GaussianBlur(g1, g2, Size(3, 3), 0, 0);
subtract(g1, g2, dog, Mat());//将两个图象g1、g2的像素值相减赋给图像dog
- 归一化操作
可将图像像素值控制在某个范围之内。(用于扩大或缩小像素范围)
normalize(dog, dog, 255, 0, NORM_MINMAX);//将图片像素值放大到0到255之间,dog为输入输出图像;255为最大值;0为最小值;类型为NORM_MINMAX。计算公式:最大值255 *(用图像中的每个像素值-最小像素值)/(图像中最大像素值-最小像素值)+ 最小值
示例代码:(上采样、降采样及高斯不同)
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main(int argc, char** argv) {
Mat src, dst;
src = imread("添加图片路径");
if (src.empty()) {
cout << "could not load image..." << endl;
return -1;
}
char INPUT_WIN[] = "input image";
char OUTPUT_WIN[] = "Up";
namedWindow(INPUT_WIN, WINDOW_AUTOSIZE);
namedWindow(OUTPUT_WIN, WINDOW_AUTOSIZE);
imshow(INPUT_WIN, src);
//上采样
pyrUP(src, dst, Size(src.cols*2, src.rows*2));
imshow(INPUT_WIN, dst);
//降采样
Mat s_down;
pyrDOWN(src, s_down, Size(src.cols / 2, src.rows / 2));
imshow("Down", s_down);
//高斯不同
Mat gray_src, g1, g2, dog;
cvtCOLOR(src, gray_src, COLOR_BGR2GRAY);//转灰度
GaussianBlur(gray_src, g1, Size(3,3), 0, 0);//将灰度图进行高斯模糊
GaussianBlur(g1, g2, Size(3, 3), 0, 0);//将模糊后的图像在进行模糊
subtract(g1, g2, dog, Mat());//将两个图象g1、g2的像素值相减赋给图像dog
normalize(dog, dog, 255, 0, NORM_MINMAX);//将图片像素值放大到0到255之间
imshow("dog image", dog);
waitKey(0);
return 0;
}
输出结果:(input image:原图像;UP:上采样 ;DOWN:降采样;dog image:高斯不同)