代码如下:
void RGB_HIS(IplImage *img,CvMat *H,CvMat *I,CvMat *S)//RGB转换到IHS中,得到的结果保存到H、I、S中
{
if(img->nChannels!=3)
return ;

int i,j; for(j=0;j<img->height;j++)
for(i=0;i<img->width;i++)
{
double b=CV_IMAGE_ELEM(img,uchar,j,i*3)/255.0;
double g=CV_IMAGE_ELEM(img,uchar,j,i*3+1)/255.0;
double r=CV_IMAGE_ELEM(img,uchar,j,i*3+2)/255.0;
double rgb=min(min(r,g),b);
cvmSet(I,j,i,(r+b+g)/3.0);//将I分量存储
cvmSet(S,j,i,(1.0-3*rgb/(r+g+b+0.0000001)));//防止分母为0
double m=(2*r-b-g)/(2*sqrt((r-g)*(r-g)+(r-b)*(g-b))+0.0000001);
double thi=acos(m); if(g>=b)
cvmSet(H,j,i,thi);
else
cvmSet(H,j,i,(2*PI-thi));

}
}IplImage *HIS_RGB(int width,int height,CvMat *H,CvMat *I,CvMat *S)//IHS转换到RGB中,返回一张图片
{
IplImage *img=cvCreateImage(cvSize(width,height),IPL_DEPTH_8U,3); int k,j; for(j=0;j<img->height;j++)
for(k=0;k<img->width;k++)
{
double r,g,b;
double i=cvmGet(I,j,k);
double h=cvmGet(H,j,k);
double s=cvmGet(S,j,k);
if( h>=0 && h<(2.0/3.0*PI))
{
b=i*(1-s);
r=i*(1+s*cos(h)/cos(PI/3.0-h));
g=3*i-b-r;
}
else if (h>=(2.0/3.0*PI) && h<(4.0/3.0*PI))
{
r=i*(1-s);
g=i*(1+s*cos(h-2*PI/3.0)/cos(PI-h));
b=3*i-g-r;
}
else if (h>=(4.0/3.0*PI) && h<=2*PI)
{
g=i*(1-s);
b=i*(1+s*cos(h-4.0*PI/3.0)/cos(5.0*PI/3.0-h));
r=3*i-b-g;
}
else
{
b=g=r=1.0;
} CV_IMAGE_ELEM(img,uchar,j,k*3)=(b>=0 && b<=1 ? (int)b*255:255);
CV_IMAGE_ELEM(img,uchar,j,k*3+1)=(g>=0 && g<=1 ? (int)g*255:255);
CV_IMAGE_ELEM(img,uchar,j,k*3+2)=(r>=0 && r<=1 ? (int)r*255:255);
} return img;
}不知道哪里出现了错误,一张照片经过正逆计算,得到的图片大部分区域是黑色的。大家帮忙看看是哪里出错了。