图像上采样和降采样

1 、概念

image.png

高斯金子塔 – 用来对图像进行降采样
拉普拉斯金字塔 – 用来重建一张图片根据它的上层降采样图片

2 、高斯金字塔

高斯金子塔是从底向上,逐层降采样得到。
降采样之后图像大小是原图像MxN的M/2 x N/2 ,就是对原图像删除偶数行与列,即得到降采样之后上一层的图片。
高斯金子塔的生成过程分为两步:
- 对当前层进行高斯模糊
- 删除当前层的偶数行与列
即可得到上一层的图像,这样上一层跟下一层相比,都只有它的1/4大小

3 、高斯不同

定义:就是把同一张图像在不同的参数下做高斯模糊之后的结果相减,得到的输出图像。称为高斯不同(DOG)
高斯不同是图像的内在特征,在灰度图像增强、角点检测中经常用到。

4 、整体代码测试

CV_EXPORTS_W void pyrUp( InputArray src, OutputArray dst,
                         const Size& dstsize = Size(), int borderType = BORDER_DEFAULT );
CV_EXPORTS_W void pyrDown( InputArray src, OutputArray dst,
                           const Size& dstsize = Size(), int borderType = BORDER_DEFAULT );
这个参数指的是降采样之后的目标图像的大小,我们可以看出它是有默认值的,如果我们调用函数的时候不指定第三个参数,那么这个值是按照 Size((src.cols+1)/2, (src.rows+1)/2) 计算的。而且不管你自己如何指定这个参数,一定必须保证满足以下关系式:

|dstsize.width * 2 - src.cols| ≤ 2;

|dstsize.height * 2 - src.rows| ≤ 2;

也就是说降采样的意思其实是把图像的尺寸缩减一半,行和列同时缩减一半。所以你指定的大小,无非就是多一行少一列的区别而已。在大多数情况下使用默认值就可了,因为这个函数不是缩减图像至任意尺寸,就只是缩减一半,所以没必要搞得那么复杂。
#include 
#include 
#include 

using namespace cv;
#include  
#include  
#include 
#include 

using namespace cv;
using namespace std;


int main(int argc, char** argv) {

    Mat src, dst,dst1,dst3, dst4;

    src = imread("D:\\f.jpg");

    if (!src.data) {
        printf("could not load image...\n");
        return -1;
    }

    namedWindow("could", CV_WINDOW_AUTOSIZE);
    imshow("could", src);


    // 上采样
    pyrUp(src, dst, Size(src.cols * 2, src.rows * 2));
    imshow("11", dst);

    // 降采样
    Mat s_down;
    pyrDown(src, s_down, Size(src.cols / 2, src.rows / 2));
    imshow("sample down", s_down);


    
    waitKey();
    return 0;
}
降采样

上采样

你可能感兴趣的:(图像上采样和降采样)