Farb RGB Bild zu Schwarz/weis Bild



  • Hallo,

    wie mache ich aus einem rgb Farbild ein Schwarzweissbild? Wie ein Graustufenbild erzeugt wird weiss ich, ich benötige aber ein Bild mit nur schwarzen und weisen Pixeln.



  • Frage ist unklar gestellt. Wenn du schon weißt, wie man ein Bild "eingraut", was ist dann dein Problem? Hat es mit dem Programmieren zu tun oder eher mit dem Algorithmus? Außerdem stellt sich für jeden, der nicht du selber ist, die Frage, was für Bilder du "konvertieren" willst. Sind es bestimmte oder soll jedes Bild konvertiert werden können? Ich glaube, für letzteres gibt es da kaum einen zufriedenstellenden Algorithmus.



  • Danke für den Hilfeversuch, bin inzwischen aber selbst daufgekommen wie es geht.

    for (int i=0; i< 240; i++)
    {
         for (int j=0; j< 320; j++)
         {
    	output [j][i] = picture[j][i].rgbBlue * 0.299 + picture[j][i].rgbRed  * 0.587 + picture[j][i].rgbGreen * 0.114;  // graustufenbild
    	output[j][i]= (output[j][i]<100) ? 0:255; //s/w bild
         }
    }
    

    Mein Bild ist 320x240 Pixel groß. Ich mache daraus ein Graubild indem ich in diesem Fall den rgb blau wert nehme und ihn mit den Werten durchmultipliziere. Dabei entsteht auch ein wunderbares Graustufenbild. Mein output lege ich später auf die 3 Farben. Bei einem Graustufenbild sind die Farbanteile aller drei Farben gleich.

    mit der Zeile darunter erzeuge ich ein s/w Bild. Ich entscheide einfach ob dieses Pixel mehr schwarz oder weis ist. Je nachdem mache ich es dann ganz schwarz oder weis (weis = 255 / schwarz = 0).

    Falls noch jemand Fragen dazu hat kann ich sie beantworten.
    Diskussionen sind ausdrücklich erwünscht 😉



  • Das mag jetzt bei einem speziellen Bild schön aussehen, bei anderen mag dagegen das Ergebnis ganz miserable sein.
    Du musst IMHO noch die Verteilung der Helligkeit im gesamten Bild berücksichtigen...



  • @Jochen

    wenn du weisst wie das geht, dann probiere ich das gerne nocht aus. 😉

    Aber du hast recht mit deiner Aussage, das wäre eine gute Verbesserung. Ich muss mir darüber einmal Gedanken machen.

    Wahrscheinlich müsste man dann das ganze Bild durch einen Filter laufen lassen, der die Helligkeit pro Pixel/ oder Bildauschnitt festlegt.
    Darraus müsste man dann einen Multiplikator machen mit dem man dann den Schwarz/weisFilter durchmultipliziert.

    Eine ander Möglichkeit wäre vielleicht das Bild von RGB in HSV umzuwandeln. Damit hätte man die Helligkeit schon in dem S-wert enthalten.

    Das sind jetzt auch nur Ideen, aber wie gesagt ich muss mir darüber einmal Ganken machen.

    Wenn jemand mehr weiss wie ich, dann freue ich mich auf seine Antwort!!!



  • Hi,
    Jochen Kalmbach meint einen solchen Effekt:

    http://www.ewu-thueringen.de/grauverteilung_norm.jpg
    http://www.ewu-thueringen.de/grauverteilung_schlecht.jpg

    Das obere Bild hat eine "perfekte" Grauwertaufteilung.
    Das untere Bild hat eine Grauwertunterlauf.

    Man muß also das Bild so bearbeiten, das die Grauwerte komplett verteilt sind.

    Such dazu mal nach folgenden Bildbearbeitungsoperationen:

    Kontrastverstärkung
    Kontrastspreizung
    Kompression des Grauwertbereichs

    Mfg Reinhold Fischer



  • Reinhold_Fischer schrieb:

    http://www.ewu-thueringen.de/grauverteilung_norm.jpg
    http://www.ewu-thueringen.de/grauverteilung_schlecht.jpg

    Zu den URLs: 404!, FileNotFound 👎

    dann:

    Reinhold_Fischer schrieb:

    Kontrastverstärkung
    Kontrastspreizung
    Kompression des Grauwertbereichs

    Das heißt abstrakt ?



  • hi, folgende müssten gehen:

    http://www.ewu-thueringen.de/grauverteilung_schlecht.JPG
    http://www.ewu-thueringen.de/grauverteilung_norm.JPG

    scheiß paint, speichert die endungen als großbuchstaben :))

    nach den 3 Begriffen sollt ihr mal suchen,
    genau gesagt:

    Die Grauverteilung sollte "gleichmäßig" über alle 255 Werte sein.

    Mfg Reinhold Fischer



  • ok, das sind zwei schöne Bildchen. Hast du dazu vielleicht eine Methode oder Funktion die schon in C++ geschrieben ist? Ich weiss nämlich nicht wie ich solche Kurven realisieren soll.



  • Hi,
    erstmal würde ich so ein Histogramm virtuell erstellen,
    und findest heraus, ob es normal ist ( so wie in dem Bild oben ) , also eine gleichmäßige Verteilung der Pixelwerte über alle 255 Farbtöne.
    oder ob es im unteren Bereich 90% der farbwerte sind (Grauwertunterlauf), oder ob 90% der Farbtöne im oberen Bereich sind(Grauwertüberlauf).
    Und dann verstärkst du den Kontrast.

    Bsp.:

    90% deiner Farbwerte haben einen Grauton zwischen 0 und 30.
    Dies mußt du nun auf die 255 Grauwerte abbilden.
    z.B.: 255/30=8,5
    Also erhält ein Pixel der im Original den Grauwert 10 hat,
    erhält dann den Grauwert (10*8,5) 85.

    Mfg Reinhold Fischer

    P.S.: Den Sourcecode mußt du schon noch selbst schreiben.



  • @Reinhold
    das mit dem Sourcecode bekomme ich gerade noch hin, wenn ich verstehen würde was du mir erklären willst 😉

    Wenn ich dich richtig verstanden habe soll ich mir alle Pixel des Bildes anschauen und 255 durch den Durchschnitt aller Pixel teilen.

    Danach habe einen Multiplikator mit dem ich dann jedes Pixel durchmultiplizieren soll.

    Dann erhalte ich den Grauwert.

    Und wie komme ich dann zu meinem Schwarzweissbild?????

    schon so wie ich es gemacht habe oder??



  • Folgendes Grundproblem:

    Also, in einem Histogramm wird jedem Grauwert (0...255) die Anzahl der Pixel zugeteilt, welche diesen Grauwert haben. So wie in den beiden Bildern die ich vorher gepostet habe.

    In dem einen Bild http://www.ewu-thueringen.de/grauverteilung_norm.JPG ist das Histogramm eines guten Bildes dargestellt, , eine gleichmäßige Verteilung. Hier kannst du ohne Probleme eine Schwellwertfunktion drüber laufen lassen, ohne signifikante Details zu verlieren.z.B beim Schwellwert 127 ist ca. die Hälfte der Pixel schwarz, die andere Hälfte weiß.

    Bei dem anderen Bild http://www.ewu-thueringen.de/grauverteilung_schlecht.JPG ist das Histogramm schlecht, eine Grauwertunterlauf. Wenn du hier eine Schwellwertfkt mit dem Schwellwert 127 drüber laufen läßt, werden fast alle Pixel weiß, du verlierst also einen Großteil der Bildinformationen.

    Das ist das Hauptproblem.
    Um das zu verhindern mußt du die vorhandenen Grauwert (0...30) auf die gesamte möglichen Grauwerte (0..255) strecken.
    z.B. folgendermaßen:
    Bei Bildern mit nur Grauwerten zwischen 0 und 30:

    255/30=8,5.
    Also muß im Endbild ein Pixel mit dem original Grauwert 10 , den Grauwert 85 bekommen.

    Oder anderst ausgedrückt:

    Du setzt den kleinsten Grauwert aus dem Histogramm , welchem aber noch genügend Pixel zugewiesen sind ( größer 50 oder so , muß man ausprobieren) als 0 Grauwert, und den größten Grauwert , welchem noch genügend Pixel zugewiesen sind, als 255 .
    Dann interpolierst du die Werte dazwischen einfach.

    bsp:

    Das Histogramm zeigt , das 95% der Pixel zwischen 20 und 50 liegen.
    Also setzt du 20=0 und 50=255 und interpolierst die Grauwerte dazwischen.

    Mfg Reinhold Fischer

    P.S.: Hoffe das problem ist jetzt klar geworden, dann dürfte eine Lösungsfindung kein Problem sein.



  • Danke, ich glaube ich habe es kapiert. Ich muss es nur noch ausprobieren. Ich melde mich dann wenn es funktioniert oder auch nicht 😉


Anmelden zum Antworten