Grayscale to RGB

Alles rund um die Programmierung mit Qt
Antworten
silverwing
Beiträge: 7
Registriert: 20. Januar 2013 18:30

Grayscale to RGB

Beitrag 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.
silverwing
Beiträge: 7
Registriert: 20. Januar 2013 18:30

Re: Grayscale to RGB

Beitrag 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);
}
veeman
Beiträge: 277
Registriert: 3. Oktober 2012 01:43
Kontaktdaten:

Re: Grayscale to RGB

Beitrag 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
silverwing
Beiträge: 7
Registriert: 20. Januar 2013 18:30

Re: Grayscale to RGB

Beitrag 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);
veeman
Beiträge: 277
Registriert: 3. Oktober 2012 01:43
Kontaktdaten:

Re: Grayscale to RGB

Beitrag 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
silverwing
Beiträge: 7
Registriert: 20. Januar 2013 18:30

Re: Grayscale to RGB

Beitrag 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?
veeman
Beiträge: 277
Registriert: 3. Oktober 2012 01:43
Kontaktdaten:

Re: Grayscale to RGB

Beitrag 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
silverwing
Beiträge: 7
Registriert: 20. Januar 2013 18:30

Re: Grayscale to RGB

Beitrag 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.
-=Freaky=-
Beiträge: 503
Registriert: 29. Dezember 2006 22:54
Wohnort: HL

Re: Grayscale to RGB

Beitrag 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);
  }
}
silverwing
Beiträge: 7
Registriert: 20. Januar 2013 18:30

Re: Grayscale to RGB

Beitrag 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?
veeman
Beiträge: 277
Registriert: 3. Oktober 2012 01:43
Kontaktdaten:

Re: Grayscale to RGB

Beitrag von veeman »

q != Q ;)

Siehe auch Funktion qRGB und typedef QRGB.

Mfg veeman
silverwing
Beiträge: 7
Registriert: 20. Januar 2013 18:30

Re: Grayscale to RGB

Beitrag 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
-=Freaky=-
Beiträge: 503
Registriert: 29. Dezember 2006 22:54
Wohnort: HL

Re: Grayscale to RGB

Beitrag von -=Freaky=- »

initialisierst du das QImage denn richtig mit entsprechender groesse und richtigem format? siehe die doku.
veeman
Beiträge: 277
Registriert: 3. Oktober 2012 01:43
Kontaktdaten:

Re: Grayscale to RGB

Beitrag 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
Antworten