Grayscale to RGB
-
- Beiträge: 7
- Registriert: 20. Januar 2013 18:30
Grayscale to RGB
Hey, bin ein weiterer Neuling und hab gleich eine Frage.
Also ich möchte aus 3 Grautonbildern ein RGB-Bild erstellen. Da müsste ich im Grunde auf jedes Pixel im jeweiligen Bild zugreifen
und aus den 3 Werten mir mein RGB-Bilb basteln. Lade ich 3 gleiche Grautonbilder, kommt theoretisch wieder ein Grautonbild raus.
Lade ich jedoch 3 gleiche Grautonbilder, aber unterschiedlicher Intensität(z.b durch unterschiedliche Beleuchtung erzeugt), müsste ich
ja die Unterschiede in Farbe sehen.
Also ich möchte aus 3 Grautonbildern ein RGB-Bild erstellen. Da müsste ich im Grunde auf jedes Pixel im jeweiligen Bild zugreifen
und aus den 3 Werten mir mein RGB-Bilb basteln. Lade ich 3 gleiche Grautonbilder, kommt theoretisch wieder ein Grautonbild raus.
Lade ich jedoch 3 gleiche Grautonbilder, aber unterschiedlicher Intensität(z.b durch unterschiedliche Beleuchtung erzeugt), müsste ich
ja die Unterschiede in Farbe sehen.
-
- Beiträge: 7
- Registriert: 20. Januar 2013 18:30
Re: Grayscale to RGB
Bin auf folgendes gestoßen. Hier wird zunächst eine konvertierung zum Grautonbild gemacht.
Den Teil kann man ja überspringen, da ich berets Grautonbilder habe.
Werd aus dem rest auch nicht wirklich schlau bzw. hat bei mir nicht geklappt.
// 32bit Bild laden woher auch immer
QImage img = ...;
// Graustufen Bild erstellen, mit selben Dimensionen aber Format Indexed8
QImage img_gray(img.width(), img.height(), QImage::Format_Indexed8);
// Colortable erstellen für Graustufen
QVector<QRgb> grayscales;
for (int i=0; i<256; ++i)
grayscales.push_back(qRgb(i,i,i));
/
/ colortable dem graustufen bild zuweisen
img_gray.setColorTable(grayscales);
// farben übertragen
for (int y=0; y<img.height(); ++y)
for (int x=0; x<img.width(); ++x)
{
// farbwert holen
QRgb rgb = img.pixel(x,y);
// umrechnen in graustufe
unsigned char gray = 0.299*qRed(rgb) + 0.587*qGreen(rgb) + 0.114*qBlue(rgb);
// dem graustufen bild den wert zuweisen
img_gray.setPixel(x,y, gray);
}
Den Teil kann man ja überspringen, da ich berets Grautonbilder habe.
Werd aus dem rest auch nicht wirklich schlau bzw. hat bei mir nicht geklappt.
// 32bit Bild laden woher auch immer
QImage img = ...;
// Graustufen Bild erstellen, mit selben Dimensionen aber Format Indexed8
QImage img_gray(img.width(), img.height(), QImage::Format_Indexed8);
// Colortable erstellen für Graustufen
QVector<QRgb> grayscales;
for (int i=0; i<256; ++i)
grayscales.push_back(qRgb(i,i,i));
/
/ colortable dem graustufen bild zuweisen
img_gray.setColorTable(grayscales);
// farben übertragen
for (int y=0; y<img.height(); ++y)
for (int x=0; x<img.width(); ++x)
{
// farbwert holen
QRgb rgb = img.pixel(x,y);
// umrechnen in graustufe
unsigned char gray = 0.299*qRed(rgb) + 0.587*qGreen(rgb) + 0.114*qBlue(rgb);
// dem graustufen bild den wert zuweisen
img_gray.setPixel(x,y, gray);
}
Re: Grayscale to RGB
Es gibt verschieden Ansätze einen Grautonbild zu erstellen, was du gepostet hast ist eine davon.
Wenn du drei Bilder hast dann kannst du jedes Bild für einen Farbkanal verwenden.
Bei Verwendung der pixel-Funktion auf diese Bilder solltest du ein RGB-Wert erhalt bei dem R=G=B -> =Grauwert ist.
Jetzt Nimmst du von allen drei Bildern von der selben Koordinaten den Grauwert und weist es jeweils einem anderen Farbkanal zu.
-> R=Grauwert(Bild1), G=Grauwert(Bild2), B=Grauwert(Bild3)
Damit mixt du dir dein neues 32Bit Bild mit stPixel.
Mfg veeman
Wenn du drei Bilder hast dann kannst du jedes Bild für einen Farbkanal verwenden.
Bei Verwendung der pixel-Funktion auf diese Bilder solltest du ein RGB-Wert erhalt bei dem R=G=B -> =Grauwert ist.
Jetzt Nimmst du von allen drei Bildern von der selben Koordinaten den Grauwert und weist es jeweils einem anderen Farbkanal zu.
-> R=Grauwert(Bild1), G=Grauwert(Bild2), B=Grauwert(Bild3)
Damit mixt du dir dein neues 32Bit Bild mit stPixel.
Mfg veeman
-
- Beiträge: 7
- Registriert: 20. Januar 2013 18:30
Re: Grayscale to RGB
ähm ok, meinst du sowas?
QImage image_gray,image_gray2,image_gray3;
QRgb r = image_gray.pixel(x,y);
QRgb g = image_gray2.pixel(x,y);
QRgb b = image_gray3.pixel(x,y);
QImage rgb_pic;
rgb_pic.setPixel(r,g,b);
QImage image_gray,image_gray2,image_gray3;
QRgb r = image_gray.pixel(x,y);
QRgb g = image_gray2.pixel(x,y);
QRgb b = image_gray3.pixel(x,y);
QImage rgb_pic;
rgb_pic.setPixel(r,g,b);
Re: Grayscale to RGB
Genau. Wobei die Endgültige Farbe etwas anders berechnet wird.
// Da wie oben schon erwähnt R=G=B ist, ist es egal ob du qRed, qBlue oder qGreen verwendest um den Wert auszulessen.
Mfg veeman
Code: Alles auswählen
QRgb newcolor = qRGB(qRed(r), qRed(g), qRed(b));
rgb_pic.setPixel(x,y, newcolor);
Mfg veeman
-
- Beiträge: 7
- Registriert: 20. Januar 2013 18:30
Re: Grayscale to RGB
gut. das heißt ich müsste, um an r zu kommen, wie folg vorgehen:
for(int i = 0; i < image_gray.width(); ++i) {
for(int j = 0; j < image_gray.height(); ++j) {
QRgb r = image_gray.pixel(i,j);
}
}
Das gleiche dann für g und b ? und was pack ich dann als als parapeter in die Funktion
rgb_pic.setPixel(x,y, newcolor);
für x und y?
for(int i = 0; i < image_gray.width(); ++i) {
for(int j = 0; j < image_gray.height(); ++j) {
QRgb r = image_gray.pixel(i,j);
}
}
Das gleiche dann für g und b ? und was pack ich dann als als parapeter in die Funktion
rgb_pic.setPixel(x,y, newcolor);
für x und y?
Re: Grayscale to RGB
i und j?! Du willst du doch die Pixel an der selben Position zusammenzustellen.
Es kann sein, je nach dem in welchem Format dein Bild vorliegt, dass du eventuell auf 32Bit umstellen musst um die RGB Farbe zu extrahieren.
Oder du du greifst über den Farbindex auf die Farbtabelle un die Farbe zu.
Mfg veeman
Es kann sein, je nach dem in welchem Format dein Bild vorliegt, dass du eventuell auf 32Bit umstellen musst um die RGB Farbe zu extrahieren.
Oder du du greifst über den Farbindex auf die Farbtabelle un die Farbe zu.
Mfg veeman
-
- Beiträge: 7
- Registriert: 20. Januar 2013 18:30
Re: Grayscale to RGB
Meine Programmierkünste halten sich wohl in Grenzen
ich glaube, dass ich die Frage etwas unglücklich gestellt habe
wollt wissen ob ich dann, um an g und b ranzukommen, 2 weitere doppelscheifen schreiben müsste.
Damit hätt ich 6 variablen zb. i,j,k,l,q,p. daher die frage, welche parapeter ich der setpixel() übergeben soll.
ich glaube, dass ich die Frage etwas unglücklich gestellt habe
wollt wissen ob ich dann, um an g und b ranzukommen, 2 weitere doppelscheifen schreiben müsste.
Damit hätt ich 6 variablen zb. i,j,k,l,q,p. daher die frage, welche parapeter ich der setpixel() übergeben soll.
-
- Beiträge: 503
- Registriert: 29. Dezember 2006 22:54
- Wohnort: HL
Re: Grayscale to RGB
wie ich es verstanden habe, war es in etwa so gemeint (uebereinstimmende dimensionen aller bilder vorausgesetzt):
Code: Alles auswählen
for(int x = 0; x < width; x++)
{
for(int y = 0; y < height; y++)
{
// den pixel an derselben position (x, y) aus jedem eingabebild holen
QRgb r = grau1.pixel(x, y);
QRgb g = grau2.pixel(x, y);
QRgb b = grau3.pixel(x, y);
// und die zusammengesetzte farbe an derselben stelle im ausgabebild setzen
QRgb rgb = qRGB(qRed(r), qRed(g), qRed(b));
farbbild.setPixel(x, y, rgb);
}
}
-
- Beiträge: 7
- Registriert: 20. Januar 2013 18:30
Re: Grayscale to RGB
Ich bekomme in der Zeile
QRgb rgb= QRgb(qRed(r), qRed(g), qRed(b));
folgende Fehlermeldung: functional cast expression list treated as compound expression
Was könnte die Ursache sein?
QRgb rgb= QRgb(qRed(r), qRed(g), qRed(b));
folgende Fehlermeldung: functional cast expression list treated as compound expression
Was könnte die Ursache sein?
-
- Beiträge: 7
- Registriert: 20. Januar 2013 18:30
Re: Grayscale to RGB
oh man! das war der Fehler danke
nun Läuft es fehlerfrei!
leider tut es noch nicht was es soll.
ich lade 3 Grautonbilder und ruf eine Funktion set_rgb auf in der ich den code reingepackt habe.
es kommt folgende seehr lange Liste:
.......
.........
QImage::pixel: coordinate (149,86) out of range
QImage::setPixel: coordinate (149,86) out of range
QImage::pixel: coordinate (149,87) out of range
QImage::scaleWidth: Image is a null image
nun Läuft es fehlerfrei!
leider tut es noch nicht was es soll.
ich lade 3 Grautonbilder und ruf eine Funktion set_rgb auf in der ich den code reingepackt habe.
es kommt folgende seehr lange Liste:
.......
.........
QImage::pixel: coordinate (149,86) out of range
QImage::setPixel: coordinate (149,86) out of range
QImage::pixel: coordinate (149,87) out of range
QImage::scaleWidth: Image is a null image
-
- Beiträge: 503
- Registriert: 29. Dezember 2006 22:54
- Wohnort: HL
Re: Grayscale to RGB
initialisierst du das QImage denn richtig mit entsprechender groesse und richtigem format? siehe die doku.
Re: Grayscale to RGB
Schreib doch dein Code mal nieder (im Code Tag) oder häng die Datei als Anhang dabei, dann müssen wir dir nicht den Code schreiben, können dich verbessern und du lernst was.
Mfg veeman
Google Übersetzung sagt dazu:QImage::pixel: coordinate (149,87) out of range
QImage::scaleWidth: Image is a null image
Code: Alles auswählen
QImage :: Pixel: Koordinate (149,87) außerhalb des Bereichs
QImage :: ScaleWidth: Das Bild ist ein Null-Bild ->also nicht initialisiert wie -=Freaky=- schon gesagt hat