一、实验内容与原理
图像金字塔常用作多分辨率模型。视频图像的多分辨率模型是视频图像处理的重要方法。图像金字塔包括高斯金字塔和拉普拉斯金字塔两种实现形式。
1、高斯金字塔:(向下取样,缩小图像)
高斯金字塔的实现包括两步:高斯低通滤波和下采样。首先利用高斯核对图像进行卷积;然后进行下采样,得到不同尺度下的目标图像。
高斯金字塔工作原理,为了获取层级为i+1层的高斯金字塔图像:
(1)对图像i进行高斯内核卷积
(2)将所有偶数行和列去除
得到的图像即为 i+1层的图像,显而易见,结果图像只有原图的四分之一。通过对输入图像i层(原始图像)不停迭代以上步骤就会得到整个金字塔。同时我们也可以看到,向下取样会逐渐丢失图像的信息。
以上就是对图像的向下取样操作,即缩小图像。
2、拉普拉斯金字塔:(向上取样,放大图像)
拉普拉斯金字塔是建立在高斯金字塔的基础上的,就是高斯金字塔在不同层之间的差分。
拉普拉斯金字塔工作原理:
如果想放大图像,则需要通过向上取样操作得到,具体做法如下:
(1)将图像在每个方向扩大为原来的两倍,新增的行和列以0填充
(2)使用先前同样的内核(乘以4)与放大后的图像卷积,获得 “新增像素”的近似值
得到的图像即为放大后的图像,但是与原来的图像相比会发觉比较模糊,因为在缩放的过程中已经丢失了一些信息,如果想在缩小和放大整个过程中减少信息的丢失,这些数据形成了拉普拉斯金字塔。
也就是说,拉普拉斯金字塔是通过源图像减去先缩小后再放大的图像的一系列图像构成的。
二、实验代码
实验环境:
(1)OpenCV3.4.3
(2)Ubuntu16.04
(3)VS Code
(4)C++
#include <iostream>
#include <opencv2/opencv.hpp>
#include <string>
#include <vector>
#include <math.h>
#include <cmath>
#include <algorithm>
class Exp8{
public:
Exp8(std::vector<std::string> path){
for(int i = 0; i < path.size(); i++){
original_color_image.push_back(cv::imread(path[i]));
original_gray_image.push_back(color2Gray(original_color_image[i]));
}
std::cout<< "初始化结束" << "\n";
for(int i = 5; i < 10; i = i + 2){
makeGaussTemplate(i);
filter_size.push_back(i);
}
computerGaussTemplateSum();
zerosPadding(0);
}
// 0 彩色图像转灰度图像
cv::Mat color2Gray(cv::Mat& src){
//创建与原图同类型和同大小的矩阵
cv::Mat gray_image = cv::Mat::zeros(src.rows, s