宿題の一部としてHSIからRGBに変換しようとすると、奇妙な問題が発生します。まず、私の元の画像は次のとおりです。
元の画像(リンクについては申し訳ありませんが、画像を投稿する担当者がいません)
H、S、I値(0〜255)の画像から変換しています。これは、RGB色空間(色相=赤、sat =緑、inten =青)でのその画像の表示です。
私にはそれはほぼ正しいように見えます...白い花(高輝度)は青で、色相(赤)は異なる色の花で変化しているように見えます。
だから今、私はいくつかのボックスで強度チャンネル(ディスプレイの青)でいくつかの等化を行い、これをもたらします:
HSIイコライズされた画像:
http://i.imgur.com/hgk9K.png
((2つ以上のハイパーリンクの担当者がいないため、これらをコピーパスタする必要があります))
大したことはありません。正確には見えませんが、言うのは難しく、関心領域ボックス以外はすべて同じです。
ここに問題があります。これをRGBに変換し直した後、次の結果が得られます。
変換された画像:
http://i.imgur.com/6wEyw.png
ここで何が問題なのかわかりません。緑は問題ないように見えますが、一部の赤/青のピクセルは最大になっているようです。3つのボックスは期待どおりにあり、内容はかなり混乱しているように見えますが、それは私の等化関数からのものである可能性があるため、ここでは大きな問題ではありません。これらのボックスの外側はすべて元の画像とほぼ同じになっているはずですが、どういうわけかごちゃ混ぜになっています。
念のため、コードを何度も調べて、括弧とデータ型のキャストを追加しましたが、それでも問題を見つけることができません。数式は正しいと確信していますが、ピクセル値の計算方法に問題がないはずです。
これが私が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);
}
}
}
誰かがコードに問題を見つけたり、画像を見て何か洞察を持っていますか?