Seite 1 von 1

Grayscale to RGB

Verfasst: 20. Januar 2013 19:27
von silverwing
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.

Re: Grayscale to RGB

Verfasst: 20. Januar 2013 19:51
von silverwing
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);
}

Re: Grayscale to RGB

Verfasst: 20. Januar 2013 20:21
von veeman
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

Re: Grayscale to RGB

Verfasst: 20. Januar 2013 20:42
von silverwing
ä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);

Re: Grayscale to RGB

Verfasst: 20. Januar 2013 20:56
von veeman
Genau. Wobei die Endgültige Farbe etwas anders berechnet wird.

Code: Alles auswählen

QRgb newcolor = qRGB(qRed(r), qRed(g), qRed(b));
rgb_pic.setPixel(x,y, newcolor);
// 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

Re: Grayscale to RGB

Verfasst: 20. Januar 2013 23:08
von silverwing
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?

Re: Grayscale to RGB

Verfasst: 21. Januar 2013 14:25
von veeman
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

Re: Grayscale to RGB

Verfasst: 21. Januar 2013 17:03
von silverwing
Meine Programmierkünste halten sich wohl in Grenzen :D
ich glaube, dass ich die Frage etwas unglücklich gestellt habe :D
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.

Re: Grayscale to RGB

Verfasst: 21. Januar 2013 18:52
von -=Freaky=-
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);
  }
}

Re: Grayscale to RGB

Verfasst: 21. Januar 2013 21:09
von silverwing
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?

Re: Grayscale to RGB

Verfasst: 21. Januar 2013 23:10
von veeman
q != Q ;)

Siehe auch Funktion qRGB und typedef QRGB.

Mfg veeman

Re: Grayscale to RGB

Verfasst: 22. Januar 2013 00:06
von silverwing
oh man! das war der Fehler :D 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

Re: Grayscale to RGB

Verfasst: 22. Januar 2013 08:37
von -=Freaky=-
initialisierst du das QImage denn richtig mit entsprechender groesse und richtigem format? siehe die doku.

Re: Grayscale to RGB

Verfasst: 22. Januar 2013 11:19
von veeman
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.
QImage::pixel: coordinate (149,87) out of range
QImage::scaleWidth: Image is a null image
Google Übersetzung sagt dazu:

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
Mfg veeman