openCV实现图像归一化

   今天下午师弟问了一个关于图像归一化的问题,因此小编写了关于图像归一化的代码,比如一个文件夹下有多幅图像,每幅图像的大小不一致,如果想把这些图像归一化为相同大小的图像,就涉及到归一化的问题,现分享代码如下:

[cpp] view plain copy
  1. #include <opencv2/opencv.hpp>  
  2. #include "highgui.h"  
  3. #include <iostream>  
  4. using namespace std;  
  5. using namespace cv;  
  6. int main()  
  7. {  
  8.     IplImage *src;  
  9.     src = cvLoadImage("100000.jpg");  
  10.     cvShowImage("100000",src);  
  11.     //cvReleaseImage(&src);  
  12.     IplImage* gray_image;    
  13.     gray_image = cvCreateImage(cvGetSize(src),8,1);      
  14.     cvCvtColor(src,gray_image,CV_BGR2GRAY);   
  15.     //cvShowImage("GrayImage",gray_image);  
  16.     IplImage* norm_image;    
  17.     CvSize norm_cvsize;    
  18.     norm_cvsize.width = 480;  //目标图像的宽      
  19.     norm_cvsize.height = 640; //目标图像的高    
  20.     cout<<"开始归一化"<<endl;  
  21.     norm_image = cvCreateImage(norm_cvsize, gray_image->depth,gray_image->nChannels);//构造目标图象    
  22.     cvResize(gray_image, norm_image, CV_INTER_LINEAR); //缩放源图像到目标图像   
  23.     cout<<"归一化完成"<<endl;  
  24.     cvShowImage("归一化图像",norm_image);  
  25.     cvWaitKey(0);  
  26.     cvSaveImage("norm.jpg", norm_image); //保存归一化图像到本地文件夹下  
  27.     cvReleaseImage(&norm_image);  
  28. }  

上面的代码实现了将一幅768*1024的图像转化为480*640的图像,并将处理后的图像保存在文件夹下,如果想将多幅图像大小不一致的图像归一化为相同大小的图像,只需要加一个for循环,在此小编只实现了一幅图像的处理。下面给出原图像和和代码运行后得到的处理后的图像:

openCV实现图像归一化

至此,实现了一幅图像大小的更改。如果将一个文件夹下的多幅图像进行归一化为相同大小的图像,只需要在上面的代码中加上一个for循环即可,代码如下:

[cpp] view plain copy
  1. #include <opencv2/opencv.hpp>  
  2. #include "highgui.h"  
  3. #include <iostream>  
  4. #include<fstream>  
  5. using namespace std;  
  6. using namespace cv;  
  7. int nImages=1491;  
  8. void main()  
  9. {  
  10.     //加载图像名到数组中  
  11.     char **img_name_index = new char *[nImages]; // load image names of Ukbench  
  12.     ifstream inf_img ("..\\data\\img_name.txt", ios_base::in);  
  13.     if(!inf_img) return;  
  14.     for (int n = 0; n < nImages; n++)  
  15.     {  
  16.         img_name_index[n] = new char[100];  
  17.         if (!img_name_index[n]) break;  
  18.         inf_img.getline(img_name_index[n], 32);  
  19.     }  
  20.     inf_img.close();  
  21.     for(int i=0;i<nImages;i++)  
  22.     {  
  23.         cout<<i+1<<endl;  
  24.         char temp[100]="\0";  
  25.         char result_img[100]="\0";  
  26.         sprintf(temp,"..\\images\\%s",img_name_index[i]);  
  27.         IplImage *src;  
  28.             src = cvLoadImage(temp);  
  29.       
  30.         IplImage* gray_image;    
  31.             gray_image = cvCreateImage(cvGetSize(src),8,1);      
  32.             cvCvtColor(src,gray_image,CV_BGR2GRAY);   
  33.         
  34.         IplImage* norm_image;    
  35.             CvSize norm_cvsize;    
  36.             norm_cvsize.width = 480;  //目标图像的宽      
  37.             norm_cvsize.height = 640; //目标图像的高    
  38.   
  39.             norm_image = cvCreateImage(norm_cvsize, gray_image->depth,gray_image->nChannels); //构造目标图象    
  40.             cvResize(gray_image, norm_image, CV_INTER_LINEAR); //缩放源图像到目标图像   
  41.         sprintf(result_img,"..\\new_image\\%d.jpg",i+1);  
  42.         cvSaveImage(result_img, norm_image);//cvSaveImage("norm.jpg", norm_image); //保存归一化图像到本地文件夹下  
  43.             cvReleaseImage(&norm_image);  
  44.         cvReleaseImage(&src);  
  45.         cvReleaseImage(&gray_image);  
  46.     }  
  47. }