图像金字塔与图片尺寸缩放

  我们经常会将某种尺寸的图像转换为其他尺寸的图像,如果放大或者缩小图片的尺寸,笼统来说的话,可以使用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的效果:

 

posted on 2018-09-10 14:49  AI大道理  阅读(674)  评论(0编辑  收藏  举报

导航