在尝试将 HSI 转换为 RGB 时,我遇到了一些奇怪的问题,我正在尝试将其作为家庭作业的一部分。首先,这是我的原始图像:
原始图片(抱歉链接,我没有代表发布图片)
我正在从具有 H、S、I 值(0-255)的图像转换。这是该图像在 RGB 颜色空间中的显示(Hue=red,sat=green,inten=blue):
在我看来,它看起来很正确......白色的花朵(高强度)是蓝色的,色调(红色)似乎随着不同颜色的花朵而变化。
所以现在我在某些框中对强度通道(显示为蓝色)进行了一些均衡,结果如下:
HSI 均衡图像:
http://i.imgur.com/hgk9K.png
((你必须复制这些,因为我没有超过 2 个超链接的代表))
没什么大不了的。它看起来并不完全正确,但很难说,感兴趣区域框之外的一切都是一样的。
现在问题来了。将其转换回 RGB 后,我得到以下结果:
转换后的图像:
http://i.imgur.com/6wEyw.png
不知道这里有什么问题,绿色看起来不错,但一些红色/蓝色像素似乎已最大化。三个盒子如预期的那样在那里,它们的内容看起来很乱,但这不是这里更大的问题,因为这可能来自我的均衡功能。这些框之外的所有内容现在应该与原始图像几乎相同,但不知何故它已经混乱了。
我已经检查了我的代码很多次,并添加了额外的括号和数据类型转换以确保,但仍然找不到问题。我相信我的公式是正确的,但我必须在计算像素值的方式上遗漏一些问题。
这是我用来从 HSI 转换为 RGB 的代码。错误可能不在此方法范围内,但此处使用的所有功能都已在其他地方进行了测试,并且似乎可以正常工作。
void colorSpace::HSItoRGB(image &src, image &tgt){
cout<<"HSI->RGB\n";
tgt.resize(src.getNumberOfRows(),src.getNumberOfColumns());
float pi = 3.14159265358979f;
for (int i=0; i<src.getNumberOfRows(); i++){ //for each pixel
for (int j=0; j<src.getNumberOfColumns(); j++){
//re-normalize h,s,i
float h = ((float)src.getPixel(i,j,H))*pi*2.0f/255.0f;//255/2 instead of 180
float s = ((float)src.getPixel(i,j,S))/255.0f;//255 instead of 100
float in= ((float)src.getPixel(i,j,I))/255.0f;
//compute x y z
float x = in*(1.0f-s);
float y = in*( 1.0f + (s*cos(h) / cos(pi/3.0f-h)) );
float z = 3.0f*in-(x+y);
float r,g,b; //set rgb
if(h<(2.0f*pi/3.0f)){
b = x;
r = y;
g = z;
}else if(h<(4.0f*pi/3.0f)){//&&2pi/3<=h
r = x;
g = y;
b = z;
}else{ //less than 2pi && 4pi/3<=h
g = x;
b = y;
r = z;
}
//convert normalized rgb to 0-255 range
int rr = (int)round(r*255.0f);
int gg = (int)round(g*255.0f);
int bb = (int)round(b*255.0f);
tgt.setPixel(i,j,RED,rr);
tgt.setPixel(i,j,GREEN,gg);
tgt.setPixel(i,j,BLUE,bb);
}
}
}
是否有人在代码中看到任何问题或通过查看图像有任何见解?