zoukankan      html  css  js  c++  java
  • 图像金字塔与图片尺寸缩放

      我们经常会将某种尺寸的图像转换为其他尺寸的图像,如果放大或者缩小图片的尺寸,笼统来说的话,可以使用OpenCV为我们提供的如下两种方式: 

    <1>resize函数。这是最直接的方式,

    <2>pyrUp( )、pyrDown( )函数。即图像金字塔相关的两个函数,对图像进行向上采样,向下采样的操作。 

    pyrUp、pyrDown其实和专门用作放大缩小图像尺寸的resize在功能上差不多,披着图像金字塔的皮,说白了还是在对图像进行放大和缩小操作。另外需要指出的是,pyrUp、pyrDown在OpenCV的imgproc模块中的Image Filtering子模块里。而resize在imgproc 模块的Geometric Image Transformations子模块里。

    综合案例:

     1 #include <opencv2/opencv.hpp>
     2 #include <opencv2/imgproc/imgproc.hpp>
     3 #include <opencv2/highgui/highgui.hpp>
     4 #define WINDOW_NAME "程序窗口"
     5 using namespace cv;
     6 using namespace std;
     7 Mat g_srcImage,g_dstImage,g_tmpImage;
     8 int main()
     9 {
    10     printf("用 1 or w 进行 resize函数的图片放大\n");
    11     printf("用 2 or s 进行 resize函数的图片缩小\n");
    12     printf("用 3 or a 进行 pyrUp 函数的图片放大\n");
    13     printf("用 4 or d 进行pyrDown函数的图片缩小\n");
    14 
    15     g_srcImage=imread("E:\\rice.jpg");//读取原图
    16     if(!g_srcImage.data)
    17     {
    18         printf("error!\n");
    19         return false;
    20     }
    21     namedWindow(WINDOW_NAME,WINDOW_AUTOSIZE);
    22     imshow(WINDOW_NAME,g_srcImage);//显示原图
    23     g_tmpImage=g_srcImage;//初始化赋值
    24     g_dstImage=g_tmpImage;//初始化赋值
    25     int key=0;
    26     while(1)
    27     {
    28     
    29         key=waitKey(9);
    30         switch(key)
    31         {
    32         case 27:
    33             return 0;
    34             break;
    35         case 'q':
    36             return 0;
    37             break;
    38         case 'a':
    39             pyrUp(g_tmpImage,g_dstImage,Size(g_tmpImage.cols*2,g_tmpImage.rows*2));
    40             printf("检测到A按下,开始进行pyrUp函数的图片缩放:原图尺寸*2 \n ");
    41             break;
    42         case 'w':
    43             resize(g_tmpImage,g_dstImage,Size(g_tmpImage.cols*2,g_tmpImage.rows*2));
    44             printf("检测到W按下,开始进行resize函数的图片缩放:原图尺寸*2 \n ");
    45             break;
    46         case '1':
    47             resize(g_tmpImage,g_dstImage,Size(g_tmpImage.cols*2,g_tmpImage.rows*2));
    48             printf("检测到1按下,开始进行resize函数的图片缩放:原图尺寸*2 \n ");
    49             break;
    50         case '3':
    51             pyrUp(g_tmpImage,g_dstImage,Size(g_tmpImage.cols*2,g_tmpImage.rows*2));
    52             printf("检测到3按下,开始进行pyrUp函数的图片缩放:原图尺寸*2 \n ");
    53             break;
    54         case 'd':
    55             pyrDown(g_tmpImage,g_dstImage,Size(g_tmpImage.cols/2,g_tmpImage.rows/2));
    56             printf("检测到D按下,开始进行pyrDown函数的图片缩放:原图尺寸/2 \n ");
    57             break;
    58         case 's':
    59             resize(g_tmpImage,g_dstImage,Size(g_tmpImage.cols/2,g_tmpImage.rows/2));
    60             printf("检测到S按下,开始进行resize函数的图片缩放:原图尺寸/2  \n");
    61             break;
    62         case '2':
    63             resize(g_tmpImage,g_dstImage,Size(g_tmpImage.cols/2,g_tmpImage.rows/2),(0,0),(0,0),2);
    64             printf("检测到2按下,开始进行resize函数的图片缩放:原图尺寸/2 \n ");
    65             break;
    66         case '4':
    67             pyrDown(g_tmpImage,g_dstImage,Size(g_tmpImage.cols/2,g_tmpImage.rows/2));
    68             printf("检测到4按下,开始进行pyrdown函数的图片缩放:原图尺寸/2  \n");
    69             break;
    70         }
    71         imshow(WINDOW_NAME,g_dstImage);
    72         g_tmpImage=g_dstImage;
    73             
    74     }
    75     waitKey(0);
    76     return 0;
    77 
    78 }

    运行结果:

    按下1或者w的效果:

    按下4或者d的效果:

    萍水相逢逢萍水,浮萍之水水浮萍!
  • 相关阅读:
    【转载】uboot的工具mkimage使用方法
    u-boot-2010.3移植到Tiny6410问题总结
    【转载】 GNU GCC 选项说明
    【转载】GCC 预处理器选项
    用kermit通过串口往nandflash任意地址里烧写任何文件!
    自己写Tiny6410的Bootloader总结!
    ARM常用汇编指令介绍
    Ubuntu14.04和Tiny6410挂载NFS服务!
    Tiny 6410的Linux学习总结!
    Tiny6410下的第一个Linux驱动程序
  • 原文地址:https://www.cnblogs.com/AIBigTruth/p/9619610.html
Copyright © 2011-2022 走看看