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