OpenCV中 RGB 转换到 HSI空间


本文实现了RGB空间转换到HSI空间,并分别求出S分量(饱和度)、I分量(亮度、光强)

  1. #include "stdafx.h"   
  2. #include "highgui.h"   
  3. #include"cv.h"   
  4.   
  5. int main(int argc, char *argv[])  
  6. {   
  7.  IplImage *img = cvLoadImage("G:\\huo.jpg");  
  8.   
  9.  IplImage *r  = cvCreateImage( cvGetSize(img), img->depth, 1);  
  10.  IplImage *g  = cvCreateImage( cvGetSize(img), img->depth, 1);  
  11.  IplImage *b  = cvCreateImage( cvGetSize(img), img->depth, 1);  
  12.   
  13.   
  14.  CvMat *rmat = cvCreateMat( img->height, img->width, CV_32FC1);  
  15.  CvMat *gmat = cvCreateMat( img->height, img->width, CV_32FC1);  
  16.  CvMat *bmat = cvCreateMat( img->height, img->width, CV_32FC1);  
  17.  CvMat *temp1 = cvCreateMat( img->height, img->width, CV_32FC1);  
  18.  CvMat *temp2 = cvCreateMat( img->height, img->width, CV_32FC1);  
  19.  CvMat *temp3 = cvCreateMat( img->height, img->width, CV_32FC1);  
  20.   
  21.  cvNamedWindow("saturation", 1);  
  22.  cvNamedWindow("intensity", 1);  
  23.  cvSplit( img, b, g, r, NULL);  
  24.  cvConvert(b, bmat);  
  25.  cvConvert(g, gmat);  
  26.  cvConvert(r, rmat);  
  27.   
  28.  //计算饱和度S   
  29.   
  30.  cvMin( bmat, gmat, temp1);  
  31.  cvMin( rmat, temp1, temp1);  
  32.  cvAdd( bmat, gmat, temp2 );  
  33.  cvAdd( temp2, rmat, temp2);  
  34.   
  35.  cvDiv( temp1, temp2, temp3, 765.0);  
  36.  cvAbsDiffS( temp3, temp3, cvScalarAll( 255.0 ));  
  37.  cvConvert( temp3, r );  
  38.   
  39.   
  40.  //计算亮度I   
  41.   
  42.   
  43.  cvAddWeighted( bmat, 1.0/3.0, rmat, 1.0/3.0, 0.0, bmat );  
  44.  cvAddWeighted( bmat, 1.0, gmat, 1.0/3.0, 0.0, bmat);  
  45.  cvConvert( bmat, g );  
  46.   
  47.    
  48.   
  49.  cvShowImage("saturation", r);  
  50.  cvShowImage( "intensity", g);  
  51.  cvWaitKey(0);  
  52.  cvReleaseImage(&img);  
  53.  cvDestroyWindow("saturation");  
  54.  cvDestroyWindow("intensity");  
  55.    
  56.    
  57.  return 0;  
  58. }  

相关内容