關於HSI model的疑問 |
答題得分者是:cmf
|
blueyellow
一般會員 發表:3 回覆:0 積分:0 註冊:2003-12-11 發送簡訊給我 |
大家好!
小弟最近在寫RGB -> HSI 的轉換程式,但是遇到了幾個問題
1.HSI的轉換公式為何有以下2種?
還是這兩個是不同的東西??? 2.我選擇了第一個公式來著手撰寫,可是查到的資料告訴我,H的範圍是0-360度
但是我寫出來的程式 , H 的結果卻不是在這個範圍之內,而是小數點!?
code 如下 :
void __fastcall TForm1::HSI1Click(TObject *Sender) { if(OpenPicFlag==1) { float H,S,I,temp,Fr,Fg,Fb; //temp沒啥意義 , 只是為了縮減公式 float MxH=-1,mnH=300,MxS=-1,mnS=300,MxI=-1,mnI=300; Form4->Image1->Height=Form1->Image1->Height; Form4->Image1->Width=Form1->Image1->Width; for(int x=0;x<=Image1->Height;x++) { for(int y=0;y<=Image1->Width;y++) { RGB=Form4->Image1->Canvas->Pixels[x][y]; Fr = (RGB&0x000000ff); Fg = (RGB&0x0000ff00)/256; Fb = (RGB&0x00ff0000)/65536; if((Fr!=255)&&(Fg!=255)&&(Fb!=255))//過濾白色 { I=(Fr+Fg+Fb)/3; if((Fr+Fg+Fb)==0) //分母是0 { S=1; } else { S=1 - ((3*(min(min(Fr,Fg),Fb)))/(Fr+Fg+Fb)); } if( (((Fr-Fg)*(Fr-Fg))+((Fr-Fb)*(Fg-Fb)))==0 ) //分母是0 { temp=0; } else { temp=((Fr-Fg)+(Fr-Fb)) / (2*sqrt(((Fr-Fg)*(Fr-Fg))+((Fr-Fb)*(Fg-Fb)))); } H=acos(temp); /*if(H>=MaxH) MaxH=H; if(S>=MaxS) MaxS=S; if(I>=MaxI) MaxI=I; if(H<=minH) minH=H; if(S<=minS) minS=S; if(I<=minI) minI=I;*/ MxH=max(H,MxH); MxS=max(S,MxS); MxI=max(I,MxI); mnH=min(H,mnH); mnS=min(S,mnS); mnI=min(I,mnI); } } } Form4->Edit1->Text = " 最大值:"+AnsiString(MxH)+" 最小值:"+AnsiString(mnH); Form4->Edit2->Text = S; Form4->Edit3->Text = I; Form4->Show(); Form4->Caption="轉成HSI"; } else { Application->MessageBox("請先讀一個圖檔",NULL,MB_OK); } }我用一張純綠色(0,255,0)的圖片做實驗,出來結果 temp=-0.5,但是帶入acos函式後,H=2.0943951023932 .....怎麼不是我要的120度阿??? 3.轉換出來之後,要怎麼使用ㄋ? 它可以帶到RGB(H,S,I)嗎?? //我想應該不行吧 XD 還是只能拿來對每個pixel作過濾,或是比對,最後要填入色彩時還是要用RGB (問題粉蠢,不好意思唷 :p) 最後感謝大大耐心讀完我的文章 覺得這個版超棒的~~ 不好意思,我是新手,請大家多多指教~~
------
不好意思,我是新手,請大家多多指教~~ |
cmf
尊榮會員 發表:84 回覆:918 積分:1032 註冊:2002-06-26 發送簡訊給我 |
請參考這篇
HLS To RGB 彩色轉換 及 RGB To HLS 彩色轉換
每天省下一包菸的錢 愛心1000元餵飽一名非洲飢餓兒童 http://www.worldvision.org.tw/edm/30hffan/30hf1000.htm
------
︿︿ |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |