首页 > 其他分享 >[OpenCV] 图像金字塔和图片缩放

[OpenCV] 图像金字塔和图片缩放

时间:2023-04-17 09:46:56浏览次数:36  
标签:src 缩放 int double OpenCV 参数 图像 类型 金字塔

高斯金字塔 : PyrDown 图像变小,细节减少

拉普拉斯金字塔 : PyrUp 图像变大 , 尽量弥补细节

Resize

CV_EXPORTS_W void resize( InputArray src, OutputArray dst,
                          Size dsize, double fx = 0, double fy = 0,
                          int interpolation = INTER_LINEAR );

第一个参数,InputArray类型的src,输入图像,即源图像,填Mat类的对象即可。

第二个参数,OutputArray类型的dst,输出图像,当其非零时,有着dsize(第三个参数)的尺寸,或者由src.size()计算出来。

第三个参数,Size类型的dsize,输出图像的大小。如果它等于零,由下式进行计算:
dsize=Size(round(fx*src.cols),round(fy*src.rows))
其中,dsize、fx、fy都不能为0。

第四个参数,double类型的fx,沿水平轴的缩放系数,有默认值0,当其等于0时,由下式进行计算:

    (double)dsize.width/src.cols

第五个参数,double类型的y,沿垂直轶的缩放系数,有默认值0,当其等于0时,由下式进行计算:

    (double)dsize.height/src.rows

第六个参数,int类型的interpolation,用于指定插值方式,默认为

INTER_LINEAR(线性插值)。
可选的插值方式如下:
    INTER_NEAREST 最近邻插值
    INTER_LINEAR 线性插值
    INTER_AREA 区域插值
    INTER_CUBIC 三次样条插值
    INTER_LANCZOS4 lanczos插值

若要缩小图像,一般情况下最好用CV_INTER_AREA来插值;而若要放大图像,一般情况下最好用CV_INTER_CUBIC〔(效率不高,慢,不推荐使用)或CV_INTER_LINEAR(效率较高,速度较快,推荐使用)。

 

pyrUp

CV_EXPORTS_W void pyrUp( InputArray src, OutputArray dst,
                         const Size& dstsize = Size(), int borderType = BORDER_DEFAULT );

第一个参数,InputArray类型的src,输入图像,即源图像,填Mat类的对象即可。

第二个参数,OutputArray类型的dst,辈出图像,和源图片有一样的尺寸和类型。

第三个参数,constSize&类型的dstsize,输出图像的大小;有默认值Size(),即默认情况下,由Size〔(src.cols*2,src.rows*2) 来进行计算,且一直需要满足下列条件:

      | dstsize.width - src.cols*2 | <= (dstsize.width mod2)

      | dstsize.height- src.rows*2 | <= (dstsize.height mod2)

第四个参数,int类型的borderType 边界模式,一般不用去管它

 pyrDown

CV_EXPORTS_W void pyrDown( InputArray src, OutputArray dst,
                           const Size& dstsize = Size(), int borderType = BORDER_DEFAULT );

第一个参数,InputArray类型的src,输入图像,即源图像,填Mat类的对象即可。

第二个参数,OutputArray类型的dst,辈出图像,和源图片有一样的尺寸和类型。

第三个参数,constSize&类型的dstsize,输出图像的大小;有默认值Size(),即默认情况下,由Size〔(src.cols/2,src.rows/2) 来进行计算,且一直需要满足下列条件:

      | dstsize.width*2 - src.cols | <= 2

      | dstsize.height*2- src.rows | <= 2

该pyrDown函数执行了高斯金字塔建造的向下采样的步骤。首先,它将源图像与如下内核做卷积运算:

 

 

综合练习: 

    /*
    程序要求: 
    使用resize pyrdown pyrup对图片进行操作
    按 1 或者 w ,进行resize放大
    按 2 或者 s ,进行resize缩小
    按 3 或者 a ,进行pyrup放大
    按 4 或者 d ,进行pydown缩小
    按 5 , 获取原图
    按q退出
    */
    #include "opencv2/imgproc/imgproc.hpp"
    #include "opencv2/highgui/highgui.hpp"
    #include <iostream>
    using namespace cv;
    using namespace std;
    
    void image_control( int e,Mat **);
    
    int main() {
        Mat src = imread("C:/dev/cpp_test/kun.png");
        
        Mat dst ,tmp;
        src.copyTo(tmp);
        src.copyTo(dst);
        imshow("src",src);
        Mat* image_group[3] = {&tmp, &dst,&src};
        int key=0;
        while(true){
            key = waitKey(10);      
            image_control(key,image_group);
            if(key == '5'){cout<<"recovery"<<endl;dst=src;tmp=src;} // if press 5 ,recover to src image
            imshow("dst",dst);
        }
    
    
        return 0;
    } 
    
    void image_control(int e,Mat *image_group[]){
        Mat src = *image_group[0];
        Mat dst = *image_group[1];
        switch (e)
        {
        //exit
        case 'Q':
            cout << "Exit" <<endl;
            exit(0);
            break;
        case 'q':
            cout << "Exit" <<endl;
            exit(0);
            break;
        case 27:
            cout << "Exit" <<endl;
            exit(0);
            break;
            
        //resize expansion
        case 'W':
            cout <<"expansion" << endl;     
            resize(src,dst,Size(src.cols*2,src.rows*2));
            break;
        case 'w':
            cout <<"expansion" << endl;
            resize(src,dst,Size(src.cols*2,src.rows*2));
            break;
        case '1':
            cout <<"expansion" << endl;
            resize(src,dst,Size(src.cols*2,src.rows*2));
            break;
        //resize reduction
        case 'S':
            cout <<"reduction" << endl;
            resize(src,dst,Size(src.cols/2,src.rows/2));
            break;
        case 's':
            cout <<"reduction" << endl;
            resize(src,dst,Size(src.cols/2,src.rows/2));
            break;
        case '2':
            cout <<"reduction" << endl;
            resize(src,dst,Size(src.cols/2,src.rows/2));
            break;
        // pyramid Up
        case 'A':   
            cout <<"pyramid up" << endl;    
            pyrUp(src,dst,Size(src.cols*2,src.rows*2));
            break;
        case 'a':
            cout <<"pyramid up" << endl;
            pyrUp(src,dst,Size(src.cols*2,src.rows*2));
            break;
        case '3':
            cout <<"pyramid up" << endl;
            pyrUp(src,dst,Size(src.cols*2,src.rows*2));
            break;
        
        //pyramid Down
        case 'D':
            cout <<"pyramid down" << endl;      
            pyrDown(src,dst,Size(src.cols/2,src.rows/2));
            break;
        case 'd':
            cout <<"pyramid down" << endl;
            pyrDown(src,dst,Size(src.cols/2,src.rows/2));
            break;
        case '4':
            cout <<"pyramid down" << endl;
            pyrDown(src,dst,Size(src.cols/2,src.rows/2));
            break;
    
        
        }
        *image_group[0] = dst;
        *image_group[1] = dst;
    }

 

 threshold 固定阈值

CV_EXPORTS_W double threshold( InputArray src, OutputArray dst,
                               double thresh, double maxval, int type );

第一个参数,InputArray类型的src,输入数组,填单通道,8或32位浮点类型的Mat即可。

第二个参数,OutputArray类型的dst,函数调用后的运算结果存在这里,即这个参数用于存放输出结果,且和第一个参数中的Mat变量有一样的尺寸和类型。

第三个参数,double类型的thresh,阗值的具体值。

第四个参数,double类型的maxval,当第五个参数阀值类型type取CV_THRESH_BINARY或CV_THRESH_BINARY_INV时阗值类型时的最大值(对应地,OpenCV2中可以为CV_THRESH_BINARY和 CV_THRESH_BINARY_INV)。

第五个参数,int类型的type,阙值类型。threshold()函数支持的对图像取阙值的方法由其确定,具体用法如图6.70。

对应取值 0 ,1 ,2 ,3, 4

 adaptiveThreshold 自适应阈值

CV_EXPORTS_W void adaptiveThreshold( InputArray src, OutputArray dst,
                                     double maxValue, int adaptiveMethod,
                                     int thresholdType, int blockSize, double C );

第-个参数InputArray类型的src,输入图像,即源图像,填Mat类的对象即可,且需为8位单通道浮点型图像。

第二个参数,OutputArray类型的dst,函数调用后的运算结果存在这里,需和源图片有一样的尺寸和类型。

第三个参数,double类型的maxValue,给像素赋的满足条件的非零值。具体看下面的讲解。

第四个参数,int类型的adaptiveMethod,用于指定要使用的自适应阈值算法,可取值为ADAPTIVE_THRESH_MEAN_C或ADAPTIVE_THRESH_GAUSSIAN_C。

第五个参数,int类型的thresholdType阈值类型。取值必须为THRESH_BINARY、THRESH_BINARY_INV其中之一。

第六个参数,int类型的blockSize, 用于计算阈值大小的一个像素的邻域尺寸,取值为3、5、7等。

第七个参数,double类型的C,减去平均或加权平均值后的常数值。通常其为正数,但少数情况下也可以为零或负数。


adaptiveThreshold()函数的类型根据如下公式,将衣服灰度图变换为一副二值图。

当第五个参数,“阈值类型” thresholdType取值为THRESH_BINARY时,公式如下:

 


当第五个参数,“阈值类型” thresholdType取值为THRESH_BINARY_INV时,公式为:

 


而其中的T(x,y)为分别计算每个单独像素的阈值,取值如下。

对于ADAPTIVE_THRESH_MEAN_C 方法,阈值 T(x,y)为blockSize X blockSize邻域内(x,y)减去第七个参数C的平均值

对于ADAPTIVE_THRESH_GUASSIAN_C方法,阈值T(x,y),为blockSize X blockSize邻域内的(x,y)减去第七个参数C 与高斯窗交叉相关(Cross-correlation with a Gaussian window)的加权总和

 

标签:src,缩放,int,double,OpenCV,参数,图像,类型,金字塔
From: https://www.cnblogs.com/lengblog/p/17324776.html

相关文章

  • [OpenCV] 形态学滤波 (补充)
    作用:开运算(先腐蚀后膨胀):用来消除小物体,再纤细点处分离物体,并且再光滑较大的物体的边界的同时不明显改变其面积闭运算(先膨胀后腐蚀):能够排除小型黑洞形态学梯度(膨胀减去腐蚀):对二值图像进行这一操作可以把blob的边缘突出出来,我们可以用形态学梯度来保留物体的边缘轮廓顶帽......
  • [OpenCV] 漫水填充floodFill (类似于photoshop的智能填充)
    两个函数重载:CV_EXPORTSintfloodFill(InputOutputArrayimage,PointseedPoint,ScalarnewVal,CV_OUTRect*rect=0,ScalarloDiff=Scalar(),ScalarupDiff=Scalar(),intflags......
  • OpenCV图像连通区域分析(14)
    图像连通区域图像的连通域是指图像中具有相同像素值并且位置相邻的像素组成的区域,连通域分析是指在图像中寻找出彼此互相独立的连通域并将其标记出来。提取图像中不同的连通域是图像处理中较为常用的方法,例如在车牌识别、文字识别、目标检测等领域对感兴趣区域分割与识别。一般情况......
  • pr图片缩放动画效果
    1.时间轴加高、加长加高:ctrl+'='加长:alt+滚轮2.在fx上右键——运动——缩放3.选中时间轴上的图片:打开效果控件,勾上缩放4.移动到时间轴末尾,插入关键帧5.把缩放改为110搞定......
  • OpenCV计算相机与装甲板之间的距离
    这个距离的计算需要建立在得知平移矩阵的计算上,想要了解平移矩阵获取的可以移步:https://www.cnblogs.com/nobodyx/p/17297244.html先看一下代码#include<iostream>#include<cmath>usingnamespacestd;doubledistance(doublex1,doubley1,doublez1,doublex2,dou......
  • OpenCV图像腐蚀与膨胀(13)
    膨胀与腐蚀是数学形态学在图像处理中最基础的操作。其卷积操作非常简单,对于图像的每个像素,取其一定的邻域,计算最大值/最小值作为新图像对应像素位置的像素值。其中,取最大值就是膨胀,取最小值就是腐蚀。膨胀与腐蚀能实现多种多样的功能,主要如下:消除噪声分割出独立的图像元素,在图像中......
  • OpenCV图像阈值操作(12)
    什么是阈值阈值又叫临界值,是指一个效应能够产生的最低值或最高值。实际上是基于图片亮度的一个黑白分界值,默认值是50%中性灰,即128,亮度高于128(<50%的灰)的会变白,低于128(>50%的灰)的会变黑。从一副图像中利用阈值分割出我们需要的物体部分(当然这里的物体可以是一部分或者整体)。这样......
  • rv1126 获取图像数据,实现图像裁剪、缩放、旋转【RK_MPI API接口】
    前言刚接触RK平台,目前正在学习探索阶段,欢迎朋友们一起讨论,指出文章错误和可以优化的地方;如果想参照文中描述进行编译、执行程序,请先参考阅读rv1126SDK编译和rv1126数据流;版本说明,测试使用SDK版本是2020-0912版本,文中记录的问题,可能在新版本已经解决;文中使用的接口函数,可能老版本......
  • OpenCV图像模糊操作(11)
    模糊原理Smooth/Blur是图像处理中最简单和常用的操作之一使用操作的原因之一就是为了给图像预处理时候减低噪声图像噪声是指存在于图像数据中的不必要的或多余的干扰信息Smooth/Blur操作原理是数学的卷积运算,根据不同卷积运算公式,划分了多种图像滤波方式图像滤波:指的是在尽量保留......
  • OpenCv单模版多目标匹配
    OpenCv单模版多目标匹配单模版匹配出现的问题一、关于单模版匹配,我一开始用的是光线较暗的图,结果根据模版匹配到的位置并不正确。我后来想用阈值把图形的特征提取出来,在把模版的特征和原图的特征进行比较,如下:importcv2img=cv2.imread('/Users/duanhao/Desktop/photo/liuk......