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

RGB轉HSI,轉不回RGB?

尚未結案
wei7278
一般會員


發表:16
回覆:19
積分:12
註冊:2004-09-25

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-10-14 11:26:20 IP:61.228.xxx.xxx 未訂閱
小弟我寫的程式如下,轉HSI後轉回RGB已經和原圖不一樣,我已測試過將HSI to RGB的轉換公式copy到RGB to HSI裡,轉出來就是對的,分成兩個就是錯的,我實在找不出哪裡有錯,請各位幫幫忙    
double ptemp[1920][480];    void __fastcall TForm1::RGB2HSIClick(TObject *Sender)
{
    Graphics::TBitmap *Bmp = new Graphics::TBitmap();
    Byte *ptr;
    double r,g,b;
    double hh,ss,ii;
    double temp;
    float pi=3.1416;
    Bmp->Assign(Image1->Picture->Bitmap);
    for(int j=0;jHeight;j  ){
      ptr = (Byte *)Bmp->ScanLine[j];
      for(int i=0;iWidth;i  ){
        b=ptr[i*3];
        g=ptr[i*3 1];
        r=ptr[i*3 2];            ii=(r g b)/3;  //計算Intensity            if((r g b)==0)
          ss=0;
        else
          ss=1-(3*(min(min(r,g),b))/(r g b));  //計算Saturation            if((((r-g)*(r-g)) ((r-b)*(g-b)))==0)
          hh=0;
        else{
          temp=((r-g) (r-b))/(2*sqrt(((r-g)*(r-g)) ((r-b)*(g-b))));
          if(g>=b)
            hh=acos(temp);  //計算Hue,徑度量
            //hh=acos(temp)*180/pi;  //計算Hue,度度量
          else
            hh=2*pi-acos(temp);  //計算Hue,徑度量
            //hh=(2*pi-acos(temp))*180/pi;  //計算Hue,度度量  
        }
        ptemp[i*3][j]=hh;
        ptemp[i*3 1][j]=ss;
        ptemp[i*3 2][j]=ii;
      }
    }
}
//-------------------------------------------------------------------    void __fastcall TForm1::HSI2RGBClick(TObject *Sender)
{
    Graphics::TBitmap *Bmp = new Graphics::TBitmap();
    Byte *ptr;
    double r,g,b;
    double hh,ss,ii;
    float pi=3.1416;
    Bmp->Assign(Image1->Picture->Bitmap);
    for(int j=0;jHeight;j  ){
      ptr = (Byte *)Bmp->ScanLine[j];
      for(int i=0;iWidth;i  ){
        hh=ptemp[i*3][j];
        ss=ptemp[i*3 1][j];
        ii=ptemp[i*3 2][j];            if(hh>0&&hh<=2*pi/3){
          b=(1-ss)*ii;
          r=(1 ss*cos(hh)/cos(pi/3-hh))*ii;
          g=3*ii-(r b);
        }
        if(hh>2*pi/3&&hh<=4*pi/3){
          r=(1-ss)*ii;
          g=(1 ss*cos(hh-2*pi/3)/cos(pi-hh))*ii;
          b=3*ii-(r g);
        }
        if(hh>4*pi/3&&hh<=2*pi){
          g=(1-ss)*ii;
          b=(1 ss*cos(hh-4*pi/3)/cos(5*pi/3-hh))*ii;
          r=3*ii-(g b);
        }
        ptr[i*3]=(Byte)b;
        ptr[i*3 1]=(Byte)g;
        ptr[i*3 2]=(Byte)r;
      }
    }
    Image2->Picture->Assign(Bmp);
}    
dllee
站務副站長


發表:321
回覆:2519
積分:1711
註冊:2002-04-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-10-17 20:32:36 IP:211.76.xxx.xxx 未訂閱
您應該還記得 Color Conversion Algorithms http://www.cs.rit.edu/~ncs/color/t_convert.html    您可以看到其中有部分的轉換是使用程式,在程式中用了 max/min 等函數, 基本上,這樣是無法轉回的。您可以這樣想,如果有某色 (R,G,B) 在轉成 (H,S,I) 時,如果 S 取的是 R,G,B 的 max/min 的組合運算,那表示 S 這個參數變成只有取 R,G,B 的某個元件資料,在轉回時,也許就只有那個 max/min 的顏色會比較對,因為轉之前也只有它有貢獻,其他的已在轉換時就捨掉了,轉回時自然就有誤。 如: 該網頁中的 RGB to HSV & HSV to RGB     可逆轉換的應該要像是 該網頁中的  RGB to YIQ & YIQ to RGB  RGB to XYZ & XYZ to RGB  兩個座標系是使用一個轉換矩陣來作轉換,只要那個轉換矩陣有反矩陣, 就表示這個轉換是可逆的。    吃軟也吃硬 dllee.ktop.com.tw StatPlus 系統資源監測器 @ SoftKing VMASK - ViewMove Automation Software Kernel
------
http://www.ViewMove.com
wei7278
一般會員


發表:16
回覆:19
積分:12
註冊:2004-09-25

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-10-21 11:42:15 IP:61.228.xxx.xxx 未訂閱
感謝大大的指教,問題已解決,不過應該是可逆的 我用的公式是 RGB to HSI HSI to RGB 錯的地方只是我少寫一個"=" 發表人 - wei7278 於 2004/10/21 11:44:01
Teresa_Chang
一般會員


發表:41
回覆:42
積分:16
註冊:2004-05-04

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-10-04 01:10:33 IP:211.76.xxx.xxx 未訂閱
請問這個RGB to HSI的程式,要怎麼把圖片呈現出來?
wei7278
一般會員


發表:16
回覆:19
積分:12
註冊:2004-09-25

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-10-04 12:12:53 IP:59.112.xxx.xxx 未訂閱
引言: 請問這個RGB to HSI的程式,要怎麼把圖片呈現出來?
您好: 通常我們轉HSI只是要他的值,處理完後還是要轉回RGB秀出來 如果真要秀的話 就是把HSI的值直接放回image裡 以我程式為例就是放回ptr陣列裡 不過秀出來應該是沒什麼意義 純粹好看而已
Teresa_Chang
一般會員


發表:41
回覆:42
積分:16
註冊:2004-05-04

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-10-04 23:30:55 IP:211.76.xxx.xxx 未訂閱
那我改用直方圖的方式呈現出來,但是我出來的圖怪怪的… 可以麻煩你幫我看一下嗎? 謝謝 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=79336
raiseofevil
一般會員


發表:13
回覆:1
積分:2
註冊:2006-12-09

發送簡訊給我
#7 引用回覆 回覆 發表時間:2007-01-03 08:23:53 IP:220.135.xxx.xxx 訂閱
       ptr[i*3]=(Byte)b;

ptr[i*3 1]=(Byte)g;

ptr[i*3 2]=(Byte)r;

有人可以幫我解說一下這三行嗎?為什麼可以將b,g,r從double轉byte
為什麼我以delphi語法=>map[i,j].r:=byte(hh); //將算出的H值設定給矩陣的r值,就會出現invaild typecast
akway
一般會員


發表:1
回覆:11
積分:2
註冊:2006-08-17

發送簡訊給我
#8 引用回覆 回覆 發表時間:2008-10-12 12:32:13 IP:140.113.xxx.xxx 訂閱
我也想知道該如何秀出處理後的圖片也
剛接觸bcb,對它的元件使用不是很熟
image->Picture->Bitmap->Assign(bmp); 似乎沒有辦法顯示
我有想過先存到檔案再LoadFromFile一次
可是效能會很差
想跟您請教有什麼方法可以直接秀出處理好的影像bmp
===================引 用 wei7278 文 章===================
引言: 請問這個RGB to HSI的程式,要怎麼把圖片呈現出來?
您好: 通常我們轉HSI只是要他的值,處理完後還是要轉回RGB秀出來 如果真要秀的話 就是把HSI的值直接放回image裡 以我程式為例就是放回ptr陣列裡 不過秀出來應該是沒什麼意義 純粹好看而已
a29375943
一般會員


發表:1
回覆:2
積分:0
註冊:2008-06-04

發送簡訊給我
#9 引用回覆 回覆 發表時間:2008-11-25 18:21:23 IP:140.125.xxx.xxx 訂閱
不要亂貼,什麼b=1-(r+b)?
有這種遞迴轉換式嗎?

===================引 用 wei7278 文 章===================
感謝大大的指教,問題已解決,不過應該是可逆的 我用的公式是 RGB to HSI HSI to RGB 錯的地方只是我少寫一個"=" 發表人 - wei7278 於 2004/10/21 11:44:01
系統時間:2024-04-26 5:56:46
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!