目标
- 使用OpenCV函数cv :: pyrUp和cv :: pyrDown对给定图像进行下采样或上采样。
理论
注意
下面的解释属于Bradski和Kaehler 的“ 学习OpenCV ”一书。
- 通常我们需要将图像转换成与原始图像不同的大小。为此,有两个可能的选择:升高图像(放大)或缩小(缩小)。
- 虽然有一个几何变换中的OpenCV函数-literally-调整图像大小(CV ::调整大小,我们将在以后的教程显示),在该部分中,我们分析第一使用图像金字塔,这是在广泛应用的视觉范围广泛的应用。
图像金字塔
- 图像金字塔是由单个原始图像产生的图像的集合,它们被连续下采样,直到达到一些所需的停止点。
- 有两种常见的图像金字塔:高斯金字塔:用于缩减图像拉普拉斯金字塔:用于从金字塔中较低的图像重建上采样图像(分辨率较低)
- 在本教程中,我们将使用高斯金字塔。
高斯金字塔
- 想象一下金字塔是一组层,层数越高,尺寸越小。
- 每个层从底部到顶部编号,因此层(i+1)(表示为Gi+1)小于层i(Gi)。
- 为了在高斯金字塔中产生层(i+1),我们做如下:
将Gi与高斯内核进行卷积:
删除每个偶数行和列。
- 您可以轻松注意到,所得到的图像将是其前身的四分之一。在输入图像(原始图像)上迭代该过程产生整个金字塔。G0
- 上面的过程对于缩小图像是有用的。如果我们想使它更大,怎么办?:填充零的列()0
- 首先,将图像大小增加到每个维度的两倍,即新的偶数行和
- 用与上述相同的内核(乘以4)执行卷积近似“丢失像素”的值
- 这两个过程(如上所述的下采样和上采样)由OpenCV函数cv :: pyrUp和cv :: pyrDown实现,我们将在下面的代码示例中看到:
注意
当我们减小图像的大小时,我们实际上丢失了图像的信息。
代码实现:
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
int main(int argc, char** argv) {
Mat src,dst1,dst2;
src = imread("C:/usr/opencv-test/Testpictures/sight.jpg");
if (!src.data)
{
printf("load image failed!\n");
return -1;
}
namedWindow("src image", CV_WINDOW_AUTOSIZE);
imshow("src image", src);
//上采样
pyrUp(src, dst1, Size(src.cols * 2, src.rows * 2));
imshow("dst1 image", dst1);
//降采样
pyrDown(src, dst2, Size(src.cols / 2, src.rows / 2));
imshow("dst2 image", dst2);
//DOG(高斯不同)
Mat gray_src, g1, g2, dogImg;
cvtColor(src, gray_src, CV_BGR2GRAY);
GaussianBlur(gray_src, g1, Size(3, 3), 0, 0); //高斯模糊
GaussianBlur(g1, g2, Size(3, 3), 0, 0);
subtract(g1, g2, dogImg, Mat());
//归一化显示
normalize(dogImg, dogImg, 255, 0, NORM_MINMAX);
imshow("DOG Image", dogImg);
waitKey(0);
return 0;
}
效果图: