RGB-Farben zu HSV-Farben umrechnen
-
Ich soll ein umrechner schreiben, der Bilder die in RGB sind auf HSV umrechnet und Speicher leider habe ich schon alles durchsucht und nix gefunden jedenfals nix brauchbaren hab schonmal angefangen ne Datei einzulesen allerdings bringt mir mein Borland irgendein Fehler schaut euch mal an vieleicht wisst ihr da was!! Hat einer ne ahnung wie das mit dem umrechenen gehen soll?
#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(); return 0; }
und hier zum umrechnen der Bilddatei mein Anfang vieleicht findet ihr da ein fehler!!!
void __fastcall TForm1::cmbHSVClick(TObject *Sender) { float max,min,R,G,B,H; max = 0; R = txtR->Text.ToDouble() / 255; G = txtG->Text.ToDouble() / 255; B = txtB->Text.ToDouble() / 255; if(R > max) max = R; if(G > max) max = G; if(B > max) max = B; min = 256; if(R < min) min = R; if(G < min) min = G; if(B < min) min = B; float del_max = max - min; txtV->Text = max; if( del_max == 0 ) { txtH->Text = 0; txtS->Text = 0; } else { txtS->Text = del_max / max; float del_R = ( ( ( max - R ) / 6 ) + ( del_max / 2 ) ) / del_max; float del_G = ( ( ( max - G ) / 6 ) + ( del_max / 2 ) ) / del_max; float del_B = ( ( ( max - B ) / 6 ) + ( del_max / 2 ) ) / del_max; if( R == max ) H = del_B - del_G; else if( G == max ) H = ( 1 / 3 ) + del_R - del_B; else if( B == max ) H = ( 2 / 3 ) + del_G - del_R; if( H < 0 ) H += 1; if( H > 1 ) H -= 1; txtH->Text = H; } } //--------------------------------------------------------------------------- void __fastcall TForm1::cmbRGBClick(TObject *Sender) { if ( txtS->Text == 0 ) //HSV values = From 0 to 1 { txtR->Text = txtV->Text.ToDouble() * 255; //RGB results = From 0 to 255 txtG->Text = txtV->Text.ToDouble() * 255; txtB->Text = txtV->Text.ToDouble() * 255; } else { float var_r,var_g,var_b,H,S,V; H = txtH->Text.ToDouble() * 6; S = txtS->Text.ToDouble(); V = txtV->Text.ToDouble(); int var_i = (int)H; float var_1 = V * ( 1 - S ); float var_2 = V * ( 1 - S * ( H - var_i ) ); float var_3 = V * ( 1 - S * ( 1 - ( H - var_i ) ) ); if( var_i == 0 ) { var_r = V; var_g = var_3; var_b = var_1; } else if( var_i == 1 ) { var_r = var_2; var_g = V; var_b = var_1; } else if( var_i == 2 ) { var_r = var_1; var_g = V; var_b = var_3; } else if( var_i == 3 ) { var_r = var_1; var_g = var_2; var_b = V; } else if( var_i == 4 ) { var_r = var_3; var_g = var_1; var_b = V; } else { var_r = V; var_g = var_1; var_b = var_2; } txtR->Text = (int)( ( var_r * 255 ) + 0.5 ); //RGB results = From 0 to 255 txtG->Text = (int)( ( var_g * 255 ) + 0.5 ); txtB->Text = (int)( ( var_b * 255 ) + 0.5 ); } }
schonmal im vorraus DANKE!!!
ich hoffe ihr könnt mir da helfen!!!
-
mhhh und vieleicht noch das notieren was noch fehlt?
-
es wäre hilfreich wenn du die fehlermeldung von deinem borland hier rein schreibst sonst kann dir kaum einer helfen und durch dein codegewusel möchte man auch nicht freiwillig durch ausserdem könnte man deine frage mit entsprechenden satzzeichen vielleichter lesen ich habe nicht überall gesucht sondern nur den ersten treffer bei google genommen hoffe das hilft dir und gesucht habe ich übrigens nach RGB HSV Umrechnung
http://www-lehre.informatik.uni-osnabrueck.de/~cg/2000/skript/9_8_HSV_Modell.html
-
Naja das hilft mir nicht wirklich weiter!!!
[C++ Fehler] Unit1.cpp(1): E2090 Qualifizierer 'TForm1' ist kein Name einer Klasse oder einer Struktur
[C++ Fehler] Unit1.cpp(1): E2040 Deklaration nicht ordnungsgemäß abgeschlossen
-
Der Fehler klingt danach, dass dein Projekt irgendwo kaputt ist - kein Fehler bis jetzt im eigentlichen Algorithmus.
Dem (zweiten) Sourcecode nach hast Du ein GUI-Projekt? Wenn alles frisch vom Borland generiert wurde, funktioniert das normalerweise immer. Hast Du das Formular z.B. umbenannt?
Falls Du das nicht repariert bekommst, erstell einfach nochmal ein neues Projekt und paste den Sourcecode der entsprechenden Routinen in neue Events rein.
-
Hallo
@Basti_help : du solltest erstmal erklären, ob du ein Konsolenprogramm (der Teil mit dem int main(int argc, char* argv[]) ) oder ein VCL-Programm machen (der Teil mit dem TForm) willst.
Benutzt u den Borland C++ Builder? Denn nur dort ist TForm so üblich.
bis bald
akari
-
Benutze Borland c++ Builder!!!
Allerdings stimmen glaub ich meine Codes komplett net da fehlt ja einiges weiß aber ent wie ichs neu machen kann hab voll das Blackout!!!Kann mir da einer was basteln mit dem int main(){
und dann mein Prog
hab gerade gesehen das ich noch net mal variablen deklariert hab ich könnt kotzen pls help
-
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 aufrufenund 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; }