//运行环境OPENCV2.0+VC2008
#include "stdafx.h"
#include "cv.h"
#include "highgui.h"
#include "cxcore.h"
int main( int argc, char *argv[])
{
int step,step_hsi,channels, cd, cdhsi, b, g, r;
uchar *data, *data_i, *data_s, *data_h;
int i,j;
double min_rgb, add_rgb, theta, den, num;
IplImage* frame = cvLoadImage("G:\\huo.jpg",1);
IplImage* hsi_i = cvCreateImage( cvGetSize(frame), frame->depth, 1 ); //创建亮度图象
IplImage* hsi_s = cvCreateImage( cvGetSize(frame), frame->depth, 1 ); //创建饱和度图象
IplImage* hsi_h = cvCreateImage( cvGetSize(frame), frame->depth, 1 ); //创建色彩图象
step = frame -> widthStep; //存储同列相邻行之间的比特数
channels = frame -> nChannels;
data = (uchar *)frame -> imageData; //存储指向图象数据的指针
step_hsi = hsi_i -> widthStep; //亮度图象的相邻行之间的比特
data_i = (uchar *)hsi_i -> imageData; //存储指向子图象的数据指针
data_s = (uchar *)hsi_s->imageData;
data_h = (uchar *)hsi_h ->imageData;
cvNamedWindow("My Window", 1 );
cvNamedWindow("My Window1", 1 );
cvNamedWindow("My Window2", 1 );
for(i=0;i < frame->height;i++)
for(j=0;j < frame->width ;j++){
cd = i*step + j*channels; //计算取元图象数据的位置
cdhsi = i*step_hsi + j; //计算子图象数据存储的位置
b = data[cd], g = data[cd + 1], r = data[cd + 2 ];
data_i[cdhsi] = (int)((r + g + b)/ 3 ); //计算亮度子图象
min_rgb = __min(__min(r,g),b); //取最小值运算
add_rgb = r + g + b ;
data_s[cdhsi] = (int) (255 - 765*min_rgb/add_rgb); //饱和度S的范围显示为0~255,便于显示
num = 0.5*((r - g) + (r - b)); //下面的式子计算图象的色彩H
den = sqrt ((double)((r - g)*(r - g) + (r - b)*(g - b)));
if ( 0 == den )
den = 0.01;
theta = acos( num /den );
if (b <= g)
data_h[cdhsi] = (int)(theta*255/(2 * 3.14));
else
data_h[cdhsi] = (int)(255 - theta*255/(2 * 3.14) );
if (data_s[cdhsi] == 0 )
data_h[cdhsi] = 0;
}
cvShowImage("My Window",hsi_h);
cvShowImage("My Window1",hsi_s);
cvShowImage("My Window2",hsi_i);
cvSaveImage("hsi_h.jpg",hsi_h);
cvSaveImage("hsi_s.jpg",hsi_s);
cvSaveImage("hsi_i.jpg",hsi_i);
cvWaitKey();
cvDestroyWindow( "My Window" );
cvDestroyWindow( "My Window1" );
cvDestroyWindow( "My Window2" );
return 0;
}