关于RGB和IHS相互转换出现的错误

Liekkas 2012-06-12 05:21:40
代码如下:


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;
}



不知道哪里出现了错误,一张照片经过正逆计算,得到的图片大部分区域是黑色的。大家帮忙看看是哪里出错了。
...全文
162 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
Liekkas 2012-06-13
  • 打赏
  • 举报
回复
解决了
Liekkas 2012-06-13
  • 打赏
  • 举报
回复
  • 打赏
  • 举报
回复
http://download.csdn.net/tag/rgb-hsi/orderbydownloads/1
Liekkas 2012-06-12
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
有IHS吗是HSI吧?
[/Quote]
嗯,是的
fengbingchun 2012-06-12
  • 打赏
  • 举报
回复
有IHS吗是HSI吧?

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧