線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1265
推到 Plurk!
推到 Facebook!

關於HSI model的疑問

答題得分者是:cmf
blueyellow
一般會員


發表:3
回覆:0
積分:0
註冊:2003-12-11

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-12-11 11:44:36 IP:61.56.xxx.xxx 未訂閱
大家好! 小弟最近在寫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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-12-11 11:54:22 IP:61.218.xxx.xxx 未訂閱
請參考這篇 HLS To RGB 彩色轉換 及 RGB To HLS 彩色轉換
每天省下一包菸的錢 愛心1000元餵飽一名非洲飢餓兒童 http://www.worldvision.org.tw/edm/30hffan/30hf1000.htm
------
︿︿
系統時間:2024-05-14 1:27:11
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!