OpenCV实现RGB颜色空间和HSI颜色空间的相互转换

关于HSI颜色空间参照维基百科:%E8%89%B2%E5%BD%A9%E5%B1%AC%E6%80%A7%E6%A8%A1%E5%BC%8F

核心的转换公式:

RGB–>HSI

截图来自中科院刘定生老师的《数字图像处理与分析》课件。

HSI–>RGB

具体的数学公式参照冈萨雷斯版《数字图像处理(第三版)》432-434页,美国服务器,香港虚拟主机,虚拟主机,中译版的260-261页。

下面贴代码:

#include <highgui.h> 3 #include <cv.h> 4 #include <math.h> * 描述:实现RGB颜色模型到HSI颜色模型之间的相互转换 8 * 作者:qdsclove(qdsclove@gmail.com) 9 * 时间:16:01 4/17 星期三 2013IplImage* catHSImage(CvMat* HSI_H, CvMat* HSI_S, CvMat* HSI_I) 14 { 15IplImage* HSI_Image = cvCreateImage( cvGetSize( HSI_H ), IPL_DEPTH_8U, 3 );(int i = 0; i < HSI_Image->height; i++) 18 { 19for(int j = 0; j < HSI_Image->width; j++) 20 { 21double d = cvmGet( HSI_H, i, j ); 22int b = (int)(d * 255/360); 23d = cvmGet( HSI_S, i, j ); 24int g = (int)( d * 255 ); 25d = cvmGet( HSI_I, i, j ); 26int r = (int)( d * 255 ); 27 28 cvSet2D( HSI_Image, i, j, cvScalar( b, g, r ) ); 29 } 30 } HSI_Image; 33 }IplImage* HSI2RGBImage(CvMat* HSI_H, CvMat* HSI_S, CvMat* HSI_I) 37 { 38IplImage * RGB_Image = cvCreateImage(cvGetSize(HSI_H), IPL_DEPTH_8U, 3 ); iB, iG, iR; 41for(int i = 0; i < RGB_Image->height; i++) 42 { 43for(int j = 0; j < RGB_Image->width; j++) 44 {dH = cvmGet( HSI_H, i, j );dS = cvmGet( HSI_S, i, j );dI = cvmGet( HSI_I, i, j ); dTempB, dTempG, dTempR;(dH < 120 && dH >= 0) 55 {dH = dH * 3.1415926 / 180; 58dTempB = dI * (1 – dS); 59dTempR = dI * ( 1 + (dS * cos(dH))/cos(3.1415926/3 – dH) ); 60dTempG = (3 * dI – (dTempR + dTempB)); 61 }(dH < 240 && dH >= 120) 64 { 65dH -= 120;dH = dH * 3.1415926 / 180; 69 70dTempR = dI * (1 – dS); 71dTempG = dI * (1 + dS * cos(dH)/cos(3.1415926/3 – dH)); 72dTempB = (3 * dI – (dTempR + dTempG)); 73 }{ 77dH -= 240;dH = dH * 3.1415926 / 180; 81 82dTempG = dI * (1 – dS); 83dTempB = dI * (1 + (dS * cos(dH))/cos(3.1415926/3 – dH)); 84dTempR = (3* dI – (dTempG + dTempB)); 85 } 86 87iB = dTempB * 255; 88iG = dTempG * 255; 89iR = dTempR * 255; 90 91 cvSet2D( RGB_Image, i, j, cvScalar( iB, iG, iR ) ); 92 } 93 } RGB_Image; 96 } main()100 {);CvMat* HSI_H = cvCreateMat( img->height, img->width, CV_32FC1 );105CvMat* HSI_S = cvCreateMat( img->height, img->width, CV_32FC1 );106CvMat* HSI_I = cvCreateMat( img->height, img->width, CV_32FC1 );uchar* data; img_r, img_g, img_b;113byte min_rgb; // rgb分量中的最小值 fHue, fSaturation, fIntensity; (int i = 0; i < img->height; i++)118 {119for(int j = 0; j < img->width; j++)120 {121data = cvPtr2D(img, i, j, 0); 122img_b = *data;123data++;124img_g = *data;125data++;126img_r = *data;fIntensity = (float)((img_b + img_g + img_r)/3)/255;fTemp = img_r < img_g ? img_r : img_g;133min_rgb = fTemp < img_b ? fTemp : img_b;fSaturation = 1 – (float)(3 * min_rgb)/(img_r + img_g + img_b);numerator = (img_r – img_g + img_r – img_b ) / 2;139float denominator = sqrt( 140pow( (img_r – img_g), 2 ) + (img_r – img_b)*(img_g – img_b) );(denominator != 0)144 {145float theta = acos( numerator/denominator) * 180/3.14;(img_b <= img_g)148 {149fHue = theta ;150 }{153fHue = 360 – theta;154 }155 }{158fHue = 0;159 }cvmSet( HSI_H, i, j, fHue );163 cvmSet( HSI_S, i, j, fSaturation);164 cvmSet( HSI_I, i, j, fIntensity );165 }166 }167 168IplImage* HSI_Image = catHSImage( HSI_H, HSI_S, HSI_I );169IplImage* RGB_Image = HSI2RGBImage( HSI_H, HSI_S, HSI_I );, img);, HSI_Image);, RGB_Image);174 175cvWaitKey(0);176 177cvReleaseImage( &img );178cvReleaseImage( &HSI_Image );179cvReleaseImage( &RGB_Image );180cvReleaseMat( &HSI_H);181cvReleaseMat( &HSI_S);182cvReleaseMat( &HSI_I);183 184 cvDestroyAllWindows();;187 }我希望你能知道,我的心永远只为你跳动。

OpenCV实现RGB颜色空间和HSI颜色空间的相互转换

相关文章:

你感兴趣的文章:

标签云: