opencv-pyrDown降采样和pyrUp升采样

 

#include<opencv2/opencv.hpp>
#include<iostream>


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

    cv::Mat A = cv::imread("D:/bb/tu/ma1.png"); //载入图像
    cv::imshow("原图像", A);

    cv::Mat B;
    pyrDown(A, B);//降采样
    /*
    先对图像进行高斯平滑,然后再进行降采样(将图像尺寸行和列方向缩减一半)
    参数3:这个参数指的是降采样之后的目标图像的大小,我们可以看出它是有默认值的,如果我们调用函数的时
    候不指定第三个参数,那么这个值是按照 Size((src.cols+1)/2, (src.rows+1)/2) 计算的。而且不管你自己
    如何指定这个参数,一定必须保证满足以下关系式:
    |dstsize.width * 2 - src.cols| ≤ 2;
    |dstsize.height * 2 - src.rows| ≤ 2;
    也就是说降采样的意思其实是把图像的尺寸缩减一半,行和列同时缩减一半。所以你指定的大小,无非就是多
    一行少一列的区别而已。在大多数情况下使用默认值就可了,因为这个函数不是缩减图像至任意尺寸,就只是
    缩减一半,所以没必要搞得那么复杂。
    这个缩减的过程是这样的,隔行隔列删去图像中的对应行和列!由此我们也可以看出,这样缩减会带来的影响
    就是:原图中那些精细的细节边缘等地方,会因此变得锯齿状,产生失真,因此为了缩小之后图像看起来自然,
    必须进行平滑,这也就是这个算法为什么在降采样之前先对图像进行了高斯模糊的原因
    */
    cv::imshow("pyrDown修改后图像", B);
    

    cv::Mat C;
    pyrUp(A, C);
    cv::imshow("pyrUp修改后图像", C);//升采样
    /*
    先对图像进行升采样(将图像尺寸行和列方向增大一倍),然后再进行高斯平滑
    参数3:在默认的情况下,这个尺寸大小是按照 Size(src.cols*2, (src.rows*2) 来计算的
    如果你自己要指定大小,那么一定要满足下面的条件:
    |dstsize.width - src.cols * 2| ≤ (dstsize.width mod 2); 如果width是偶数,那么必须dstsize.width是src.cols的2倍;
    |dstsize.height - src.rows * 2| ≤ (dstsize.height mod 2);


    */

    cv::waitKey(0);
    return 0;
}

 

 

 

 

 

 

 

 

 

posted @ 2021-12-06 09:36  天子骄龙  阅读(196)  评论(0编辑  收藏  举报