RGB-Farben zu HSV-Farben umrechnen



  • sollte eigentlich Consolen basiert sein!!! 😞



  • Hallo

    geh ins Menü Datei/Neu, dort im Dialog wählst du den Konsolenexperten aus.
    Im nächsten Dialog deaktivierst du noch "VCL verwenden" und "Multi-Threads", danach nochmal OK.

    Dann kannst du dein Konsolenprogramm schreiben.
    Dazu lies dir am besten Tutorials durch, siehe der Link Tutorials auf dieser Seite im Menü oben rechts.

    bis bald
    akari



  • Hallo,

    Dann solltest du dein Projekt mit Hilfe des Konsolenesperten mal neu erstellen. Also Projekt/Neu
    dann den Konsolenexperten wählen. Das Häkchen bei "VCL verwenden" wegmachen. Dann hast du deine int main
    So eine Frage gehört aber eher in das BCB-Forum.

    [edit]zu spät 🙂 [edit]

    Ciao





  • bitte

    zuerst googlen
    wenn nicht fundig dann WIKI_rulez aufrufen

    und da finden wir was bei wikipedia?

    Transformation von RGB in HSV

    Hat man die (R, G, B)-Werte einer Farbe, wobei R, G, and B Werte zwischen 0,0 und 1,0 annehmen können, können die (H, S, V) Werte errechnet werden:

    MAX = max(R,G,B)

    MIN = min(R,G,B)

    H = \left\{ \begin{matrix} \left( 0 + \frac {G - B} {MAX - MIN} \right) \times 60, & \mbox{if } R = MAX \\ \left( 2 + \frac {B - R} {MAX - MIN} \right) \times 60, & \mbox{if } G = MAX \\ \left( 4 + \frac {R - G} {MAX - MIN} \right) \times 60, & \mbox{if } B = MAX \end{matrix}\right.

    if(H < 0)

    H = H + 360

    S = \frac {MAX - MIN} {MAX}

    V = MAX

    Der resultierende Wert von H variiert zwischen 0,0 und 360,0, S und V zwischen 0,0 und 1,0.

    Beachte, dass diese Formeln einige Eigenheiten der HSV-Werte widerspiegeln:

    Wenn MAX = MIN (S = 0), dann ist H undefiniert.

    Das ist offensichtlich, wenn man die Diagramme oben betrachtet, denn wenn S = 0 ist, dann liegt die Farbe auf der zentrale Grau-Linie, sodass der Farbton selbstverständlich ohne Bedeutung ist.



  • Hab bei wikipedia das gleiche gefunden gehabt allerdings hat es mir nur soweit geholfen wie in meinen ersten Bsp.!!!
    Hab aber mitlerweile noch was neues schauts euch mal an vieleicht bekommt ihr das zu m laufen!!!;)

    #include <math.h>
    
    void HSVtoRGB()
    {
        int i;
        float f, p, q, t,hTemp, s, h, r, g, b, v;
    
        if( s == 0.0 || h == -1.0) // s==0? Totally unsaturated = grey so R,G and B all equal value
        {
          r = g = b = v;
          return;
        }
        hTemp = h/60.0f;
        i = (int)floor( hTemp );                 // which sector
        f = hTemp - i;                      // how far through sector
        p = v * ( 1 - s );
        q = v * ( 1 - s * f );
        t = v * ( 1 - s * ( 1 - f ) );
    
        switch( i )
        {
        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;}
        case 5:{r = v;g = p;b = q;break;}
        }
    }
    
            return 0;
    }
    


  • Dein zuerst genannter Fehler hat aber eigentlich nichts mit der Umrechnung zu tun. Hast du akaris und mein Post gelesen?
    Woher nimmt deine Funktion denn die HSV-Werte und wo kommen die RGB-Werte hin?
    Man könnte doch hier schön zwei Strukturen verwenden (zum Übergeben und Rückgeben).

    struct RGB
    {
       int R, G, B;
    };
    

    Die HSV-Struktur dann äquivalent.



  • Hört sich ja ganz gut an was du sagst allerdings hab ich kein plan die Werte müssten von einem Bild eingelesen werden und dann an den Umrechner übergeben werden!!!

    #include <vcl.h>
    #include<iostream.h>
    #include<fstream.h>
    
    using namespace std;
    
    int main(int argc, char* argv[])
    {
        ifstream *file = new ifstream("BMW.bmp", ios::binary);
    
        file->seekg(54, ios::beg);    // jump to bmp data, starts at byte 54
    
        char *buffer = new char[48];
        file->read(buffer, 48);
        for(int i=0; i<48; i++)
            printf("data byte %d = %d\n", i, (unsigned char)buffer[i]);
    
        file->close();
    }
    

    Vieleicht so irgendwie und dann halt deine Idee mit meinem vorrigen post vereinen???

    #include <math.h>
    void HSVtoRGB()
    {
        int i;
        float f, p, q, t,hTemp, s, h, r, g, b, v;
    
        if( s == 0.0 || h == -1.0) // s==0? Totally unsaturated = grey so R,G and B all equal value
        {
          r = g = b = v;
          return;
        }
        hTemp = h/60.0f;
        i = (int)floor( hTemp );                 // which sector
        f = hTemp - i;                      // how far through sector
        p = v * ( 1 - s );
        q = v * ( 1 - s * f );
        t = v * ( 1 - s * ( 1 - f ) );
    
        switch( i )
        {
        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;}
        case 5:{r = v;g = p;b = q;break;}
        }
    }
    

    Allerdings weiß ich jetzt net mehr weiter!!! Kann mal einer schaun ob er es hinbekommt!!!



  • Ab nach Projekte würde ich sagen.



  • Kann mir jetzt keiner Helfen?



  • vielleicht solltest du dich erst einmal etwas intensiver mit bitmaps und der farbkonvertierung vertraut machen. du liest hier lediglich ein bild mit 16 farben ein. alles andere funktioniert dann schon mal nicht. da du mit dem bcb arbeitest, könntest du auf TImage bzw. TBitmap zurueckgreifen und dort dein bild laden. Mittels ScanLine-Eigenschaft kannst du dann zeilenweise auf die eigentlichen Bilddaten zugreifen und diese manipulieren. Beispiele findest du in der Hilfe und durch das Suchen im Forum.

    folgendes Beispiel zeigt wie ich die werte berechne. rechnet einen RGB-Wert in einen HSV-Wert um. du uebergibst jeweils die einzelnen Farbwerte und jeweils einen zeiger auf die resultierenden hsv-Werte. die funktion bindest du dann zum beispiel in die schleife ein mit der du ueber alle farbwerte des bildes iterierst.

    Achtung: HSV ist ein zylindrisches Farbmodell, d.h. du kannst die Werte nicht einfach so wieder ausgeben, sondern musst die werte fuer anzeige-zwecke erst wieder nach RGB transformieren. wenn du damit nur berechnungen anstellen willst, dann natuerlich nicht.

    typedef unsigned char u_char;
    
    //---------------------------------------------------------------------------
    // Funktion konvertiert RGB nach HSV
    // (H = Hue, S = Saturation, V = Value)
    //
    // RGB = [0 .. 255, 0 .. 255, 0 .. 255]
    // HSV = [0 .. 360, 0 ..   1, 0 ..   1]
    //---------------------------------------------------------------------------
    void RGB_to_HSV(u_char R, u_char G, u_char B, double *H, double *S, double *V)
    {
      double dR    = (double) R;
      double dG    = (double) G;
      double dB    = (double) B;
      double _H    = 0.0;
      double _S    = 0.0;
      double _V    = Maximum(dR, dG, dB);  // Maximum von 3 Werten
      double Min   = Minimum(dR, dG, dB);  // Minimum von 3 Werten
      double Delta = _V - Min;
    
      // saturation berechnen
      if (_V != 0.0)
        _S = Delta / _V;
    
      // hue berechnen
      if (_S != 0.0)
      {
        if      (dR == _V) _H =         ((dG - dB) * 60.0 / Delta);
        else if (dG == _V) _H = 120.0 + ((dB - dR) * 60.0 / Delta);
        else               _H = 240.0 + ((dR - dG) * 60.0 / Delta);
    
        if (_H < 0.0)
          _H += 360.0;
      }
    
      *H = _H;
      *S = _S;
      *V = _V / 256.0;
    }
    

    Aufruf:

    u_char r = 200;
    u_char g = 100;
    u_char b = 250;
    double h, s, v;
    
    // in h, s, v stehen dann die umgerechneten Werte
    RGB_to_HSV(r, g, b, &h, &s, &v);
    

    auf jeden fall bist du hier im falschen forum und ein mod sollte dich mal verschieben.



  • So ich bin weiter gekommen puhh!

    Also mittlerweile kann ich eine Image einlesen und dann wieder speicher
    Die Umrechnung von RGB zu HSV hab ich auch drin.

    Ich weiß bloß nicht wie ich die RGB werte aus der Image bekomme und und dann wieder die HSV in die Image bekomme kann mir da jemand helfen?
    Hier mein Code!

    #include "stdafx.h"
    #include <iostream>
    
    using namespace std;
    
    int main()
    {
    	int x, y;
    	double R, G, B, Max, Min, H, S, V, r, g, b;
    	unsigned char* pData;
    
        // read the image
    	bool bSuccess = ReadBmp( "C:/P1000825.bmp", x, y, pData );
    	if ( bSuccess == false )
    	{
    		cout << "*Error loading image!*" << endl;
    		return 1;
    	}
    
    	cout<<"R Wert";
    	cin>>r;
    	cout<<"G Wert";
    	cin>>g;
    	cout<<"B Wert";
    	cin>>b;
    
    	R = r / 256.0;
    	G = g / 256.0;
    	B = b / 256.0;
    
    	if(R > G && R > B)Max = R;
    	if(G > R && G > B)Max = G;
    	if(B > G && B > R)Max = B;
    
    	if(R < G && R < B)Min = R;
    	if(G < R && G < B)Min = G;
    	if(B < G && B < R)Min = B;
    
    	if(R = Max)H = 0 + (G - B) / (Max - Min);
    	if(G = Max)H = 2 + (B - R) / (Max - Min); 
    	if(B = Max)H = 4 + (R - G) / (Max - Min);
    
    	if(H < 0) H = H + 360;
    
    	S = (Max- Min) / Max;
    	V = Max;
    
    	cout<<H<< endl;
    	cout<<S<< endl;
    	cout<<V<< endl;
    
    	// write the image
    	if ( WriteBmp( "output.bmp", x, y, pData ) == false )
    	{
    		cout << "*Error writing image!*" << endl;
    		return 1;
    	}
    
    	fgetchar ();
    
    	return 0;
    }
    

Anmelden zum Antworten