仅自学做笔记用,后续有错误会更改
理论
参考文章链接:https://blog.csdn.net/qq_54185421/article/details/124350723
- 图像金字塔的概念:
从上往下(采样点越来越多):上采样
从下往上(采样点越来越少):降采样
- 我们在图像处理中常常会调整图像的大小, 最常见的就是放大(zoom in)和缩小(zoom out), 尽管几何变换也可以实现图像放大和缩小, 但是这里我们介绍图像金字塔
- 一个图像金字塔是一系列图像的集合, 最底下的一张图像尺寸最大, 最上方的图像尺寸最小, 从空间结构来看, 就是一个古代的金字塔形状
- 高斯金字塔
- 用来对图像进行降采样, 也就是缩小图像 (降采样的过程中会有信息丢失,再上采样回去不会得到原图像)
- 高斯金字塔 是从底向上, 逐层降采样得到
- 降采样之后图像大小:原图像M * N , 降采样之后为M/2 * N/2, 面积变为原图的1/4, 它其实就是对图像删除偶数的行与列
- 高斯金字塔的生成过程分为两步:①对当前层进行高斯模糊②删除当前层的偶数行与列
- 拉普拉斯金字塔(这里只介绍一下概念,不做代码演示)
- 高斯金字塔 在降采样的过程中丢失的信息, 形成了 拉普拉斯金字塔
- 拉普拉斯金字塔 中的第 i 层,等于“ 高斯金字塔 中的第 i 层”与“ 高斯金字塔 中的第 i+1 层的向上采样结果”之差。
- 通过 拉普拉斯金字塔 , 我们可以将降采样之后的图像尽可能的去恢复原图
- 高斯金字塔 与 拉普拉斯金字塔 的关系
- 如下图所示:
相关API
- 上采样(cv::pyrUp) - zoom in 放大
- 降采样(cv::pyrDown) - zoom out 缩小
pyrUp(Mat src, Mat dst, Size(src.cols2, src.rows2)):生成的图像是原图的宽与高各放大2倍
pyrDown(Mat src, Mat dst, Size(src.cols/2, src.rows/2)):生成的图像是原图的宽与高各缩小为1/2
代码示例
Mat src, dst;
src = imread(...);
//显示原图
char INPUT_WIN[] = "input image";
namedWindow(INPUT_WIN, CV_WINDOW_AUTOSIZE);
imshow(INPUT_WIN,src);
// 显示上采样之后的图
char OUTPUT_UP_WIN[] = "sample up";
pyrUp(src, dst, Size(src.cols*2, src.rows*2));
namedWindow(OUTPUT_UP_WIN, CV_WINDOW_AUTOSIZE);
/imshow(OUTPUT_UP_WIN, dst);
// 显示降采样之后的图
Mat temp_down;
char OUTPUT_DOWN_WIN[] = "sample down";
pyrDown(src, temp_down, Size(src.cols/2, src.rows/2));
namedWindow(OUTPUT_DOWN_WIN, CV_WINDOW_AUTOSIZE);
imshow(OUTPUT_DOWN_WIN, temp_down);
效果截图:
上采样:
加上降采样,三个一起显示: