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

請問HSV的轉換

尚未結案
visuala
一般會員


發表:33
回覆:39
積分:14
註冊:2003-04-01

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-11-13 13:54:02 IP:218.170.xxx.xxx 未訂閱
各位大大 請問一下 關於RGB到HSV的轉換我查了一些資料 可是不太會用  請問該怎麼作出HSV轉換呢 以下是我的code  還有最後的值要怎麼assign給原先的RGB值  麻煩教我一下~謝謝 
 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 float min,max,delta,r,g,b;
 float *h;
 float *v;
 float *s;
  Graphics::TBitmap* BMP = new Graphics::TBitmap();
 BMP->LoadFromFile("C:/test/1.bmp");
 Image2->Picture->Assign(BMP);
 Byte* ptr =NULL;     for (int y=0;yHeight ;y  )
  for (int x=(x%2?0:1);xWidth ;x  )
  {           float r=GetRValue(Image2->Canvas->Pixels[x][y]);
       float g=GetGValue(Image2->Canvas->Pixels[x][y]);
       float b=GetBValue(Image2->Canvas->Pixels[x][y]);
        
     if(g>=r&&r>=b)
        {
         max=g;
         min=b;
        }
        else if(g>=b&&b>=r)
        {
        max=g;
        min=r;
        }
         else if(r>=g&&g>=b)
         {
        max=r;
        min=b;
        }
         else if(r>=b&&b>=g)
        {
         max=r;
         min=g;
         }
        else if(b>=r&&b>=g)
        {
         max=b;
         min=g;
        }
        else if(b>=g&&b>=r)
        {
         max=b;
         min=r;
        }             *v=max;
         delta=max-min;
         if(max!=0)
          *s=delta/max;
         else
         *s=0 ;
         *h=-1;
         return;
        if(r==max)
         *h=(g-b)/delta;
        else if(g==max)
          *h=2 (b-r)/delta;
        else
          *h=4 (r-g)/delta;
          *h*=60;
        if(*h<0)
         *h =360;
     }
  Image2->Picture->Assign(Bmp);
 delete Bmp;
}
對不起 新手多多包含~ <> 發表人 -
JerryKuo
版主


發表:42
回覆:571
積分:322
註冊:2003-03-10

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-11-13 15:10:56 IP:61.230.xxx.xxx 未訂閱
visuala你好:    關於RGB轉HSV,你可參考下面的文章,附程式碼    1.)本站文章,axsoft版主分享的文章 http://delphi.ktop.com.tw/topic.php?topic_id=20214 2.)及不錯的網站 http://bbs.ee.ntu.edu.tw/boards/Programming/14/2.html RGB轉HSV,HSV轉RGB都有 ※請善用本站搜尋功能 發表人 -
dean
一般會員


發表:24
回覆:60
積分:21
註冊:2003-08-23

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-11-13 16:00:16 IP:61.222.xxx.xxx 未訂閱
visuala您好:     之前我也是跟你一樣的問題,不過我已經解決了!     hsv的轉換我也是看axsoft版主分享的文章裡頭的function做出的,你只要將rgb值分別帶入即可,那個函是已經是轉換的程式了。     你的值要assign回給bmp的rgb值,就要在用"HSV轉RGB"的函式(axsoft版主分享的文章裡也有其函式),這樣才可以把hsv的值轉回給rgb並且display在螢幕上。下面是我寫的,您參考看看:      
for (i=0;iHeight;i  )
   {
      ptr = (Byte *)Bmp->ScanLine[i];
      for (j=0;jWidth;j  )
      {
         B = ptr[j*3];
         G = ptr[j*3 1];
         R = ptr[j*3 2];
         
         RGBtoHSV( R, G, B, &H, &S, &V);
         HSVtoRGB(&R, &G, &B, H, S, V);
          
         ptr[j*3] = B;
         ptr[j*3 1] = G;
         ptr[j*3 2] = R;
      }
   }
Image2->Picture->Assign(Bmp);
Image2->AutoSize = true; 
**我很想學,但又很不懂,所以一直問蠢問題,希望不要不屑我的問題,嘻嘻嘻**
visuala
一般會員


發表:33
回覆:39
積分:14
註冊:2003-04-01

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-11-15 20:02:28 IP:218.174.xxx.xxx 未訂閱
大大您好:    請問一下...我照那個演算法寫了用Button來觸發    Compiler可以過 可是開完圖片進來按下Button之後會有Error 如下圖:    不知道哪裡出錯了 謝謝~      <<以下是我的Sourcecode>>
 
int i2;
float f, p, q, t;
float  MIN,MAX,delta;
float B,G,R,H,S,V;    void __fastcall TForm1::Button6Click(TObject *Sender)
{
    int i,j;
   Graphics::TBitmap *Bmp = new Graphics::TBitmap();
   Bmp->Assign(Image1->Picture->Bitmap );
   Byte *ptr;
   for (i=0;iHeight;i++)
   {
      ptr = (Byte *)Bmp->ScanLine[i];
      for (j=0;jWidth;j++)
      {
         B = ptr[j*3];
         G = ptr[j*3+1];
         R = ptr[j*3+2];             RGBtoHSV( R, G, B, &H, &S, &V);
         HSVtoRGB(&R, &G, &B, H, S, V);            ptr[j*3] = B;
        ptr[j*3+1] = G;
        ptr[j*3+2] = R;
      }
   }
Image2->Picture->Assign(Bmp);
delete Bmp;
}
//------------------------------------------------------------
void __fastcall TForm1::RGBtoHSV( float r, float g, float b, float *h, float *s, float *v )
{    MIN = min( r, g );
MIN = min( b, MIN );
MAX = max( r, g );
MAX = max( b, MAX );
//Image2->Canvas->TextOut(10,10,MAX);
//Image2->Canvas->TextOut(20,20,MIN);    *v = MAX; // v    delta = MAX - MIN;     if( MAX != 0 )
  {
   *s = delta / MAX; // s
  }
  else
        {
        // r = g = b = 0 // s = 0, v is undefined
        *s = 0;
        *h = -1;
        return;
        }    if( r == MAX )
        *h=( g - b ) / delta; // between yellow & magenta    else if( g == MAX )
        {
        *h = 2 + ( b - r ) / delta; // between cyan & yellow
        }
else
*h = 4 + ( r - g ) / delta; // between magenta & cyan    *h *= 60; // degrees
if(*h < 0 )
*h += 360;    }
//-------------------------------------------------------
void __fastcall TForm1::HSVtoRGB( float *r, float *g, float *b, float h, float s, float v )
{    if( s == 0 ) {
// achromatic (grey)
*r = *g = *b = v;
return;
}    h /= 60; // sector 0 to 5
i2 = floor( h );
f = h - i2; // factorial part of h
p = v * ( 1 - s );
q = v * ( 1 - s * f );
t = v * ( 1 - s * ( 1 - f ) );      switch( i2 ) {
                case 0:
                        *r = v;
                        *g = t;
                        *b = p;
                         break;                    case 1:
                        *r = q;
                        *g = v;
                        *b = p;
                        break;
                case 2:
                        *r = p;
                        *g = v;
                        *b = t;
                        break;
                case 3:
                        *r = p;
                        *g = q;
                        *b = v;
                        break;
                case 4:
                        *r = t;
                        *g = p;
                        *b = v;
                break;                    default: // case 5:
                        *r = v;
                        *g = p;
                        *b = q;
                        break;
                }//SWITCH    }    
新手多多包含~ 發表人 -
dean
一般會員


發表:24
回覆:60
積分:21
註冊:2003-08-23

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-11-15 23:16:44 IP:211.76.xxx.xxx 未訂閱
visuala您好: 程式給了您錯誤提示,浮點數問題! 您要不要檢查看看DELTA是否為0!? 分母不得為0喔! **我很想學,但又很不懂,所以一直問蠢問題,希望不要不屑我的問題,嘻嘻嘻**
visuala
一般會員


發表:33
回覆:39
積分:14
註冊:2003-04-01

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-11-15 23:55:20 IP:218.170.xxx.xxx 未訂閱
引言: visuala您好: 程式給了您錯誤提示,浮點數問題! 您要不要檢查看看DELTA是否為0!? 分母不得為0喔! **我很想學,但又很不懂,所以一直問蠢問題,希望不要不屑我的問題,嘻嘻嘻**
請問一下...我這邊寫錯哪裡 為什麼找r,g,b的MAX和MIN怪怪的 謝謝
     MIN = min( r, g );
MIN = min( b, MIN );
MAX = max( r, g );
MAX = max( b, MAX );    
dean
一般會員


發表:24
回覆:60
積分:21
註冊:2003-08-23

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-11-16 08:29:32 IP:211.76.xxx.xxx 未訂閱
引言: 請問一下...當用HSV轉換時 如果抓到R=G=B時該怎麼處理呢 我後來測試發現一定會抓到RGB值都相等的點 所以就會有錯誤 請問要怎麼處理呢 麻煩各位大大教我一下 多謝多謝~ B=ptr[j*3]; G=ptr[j*3 1]; R=ptr[j*3 2]; 以下是原本的程式碼..
      for (i=0;iHeight;i  )
   {
      ptr = (Byte *)Bmp->ScanLine[i];
      for (j=0;jWidth;j  )
      {
           B=ptr[j*3];
          G=ptr[j*3 1];
          R=ptr[j*3 2]; 
           
         RGBtoHSV( R, G, B, &H, &S, &V);
         HSVtoRGB(&R, &G, &B, H, S, V);            ptr[j*3]=B;
        ptr[j*3 1]=G;
        ptr[j*3 2]=R;
      }
   }    
發表人 - visuala 於 2003/11/16 04:46:58
visuala您好: 在我之前發問的文章裡,高手們都有解釋喔! http://delphi.ktop.com.tw/topic.php?TOPIC_ID=37831 你可以參考裡頭的ZEN解說,而我是將DELTA設為1,兩種測試結果我認為是差不多!
JerryKuo
版主


發表:42
回覆:571
積分:322
註冊:2003-03-10

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-11-17 09:30:59 IP:61.230.xxx.xxx 未訂閱
引言: 請問一下...當用HSV轉換時 如果抓到R=G=B時該怎麼處理呢 我後來測試發現一定會抓到RGB值都相等的點 所以就會有錯誤 請問要怎麼處理呢
在axsoft版主分享的文章中有提到
   ...
   *v = max; 
   ...
   if( max != 0 )
   {
       *s = delta / max; // s
   }
   else 
   {
       // r = g = b = 0 // s = 0, v is undefined
       *s = 0;
       *h = -1;
       return;
   }
基本上R=G=B,就沒有H,S值可言, 參考看看 發表人 - jerrykuo 於 2003/11/17 10:35:23
JerryKuo
版主


發表:42
回覆:571
積分:322
註冊:2003-03-10

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-11-17 10:33:24 IP:61.230.xxx.xxx 未訂閱
小弟推薦一個不錯的網站,參考看看 http://www.efg2.com/Lab/Graphics/Colors/HSV.htm 有程式可參考,程式界面如下
visuala
一般會員


發表:33
回覆:39
積分:14
註冊:2003-04-01

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-11-19 13:35:59 IP:218.170.xxx.xxx 未訂閱
引言: 小弟推薦一個不錯的網站,參考看看 http://www.efg2.com/Lab/Graphics/Colors/HSV.htm 有程式可參考,程式界面如下
多謝JerryKuo 版大... 小弟繼續研究一下~~
系統時間:2024-05-06 7:52:20
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!