OPENCV 从RGB空间转换到HSI空间

 

//运行环境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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值