Aufgabe 1 - Einfache Bild- und Histogramm-Transformationen

Ziel ist ein Kommandozeilenprogramm, welches die im folgenden Text beschriebenen Funktionen anbietet. Sofern die einzelnen Aufgabenteile keine anderen Werte vorschreiben gilt ein Wertebereich von [0 - 255] (dabei sind Imin die minimale bzw. Imax die maximale Intensität, die für ein Pixel dargestellt werden kann). Sollte der Wertebereich der Intensitäten des Zielbildes durch eine Transformation verlassen werden, soll ein Clipping durchgeführt werden, d.h. falls f(Iy,x) > Imax ist f(Iy,x) = Imax und falls f(Iy,x) < Imin ist f(Iy,x) = Imin.

Das zu erstellende Programm soll mit Graustufenbildern und Farbbildern umgehen können. Bei Graustufenbildern ist I nach dem Einlesen ein ganzzahliger Wert zwischen 0 und 255. Bei Farbbildern ist I ein Tripel bestehend aus drei ganzzahligen Werten zwischen 0 und 255. Eine Berücksichtigung von  Imin!=0 bzw. Imax!=255 ist nur für die den Aufgabenteil der Äquilibrierung notwendig, da hier explizit das Beispiel aus der Vorlesung (Folie 13 der Folien zu Histogramm-Transformationen) nachvollzogen können werden soll.

Während eine Histogramm-Transformation bei Graustufenbilder gleichermaßen auf den Intensitätswerten als auch auf den Farbwerten der Pixel operiert, ist dies bei Farbbildern nicht automatisch der Fall. Handelt es sich um eine lineare Histogramm-Transformation, so kann sie separat auf jeden Farbkanal des Bildes angewandt werden, doch bei nicht-linearen Histogramm-Transformationen würde dies die Farbbalance des Ergebnisbildes verändern. Eine explizite Berücksichtigung dieses Umstandes ist für den Bewertungsteil vorgesehen.

Basisteil

  • Einhaltung der Code Richtlinien
    • Eigentlich eine Selbstverständlichkeit, an dieser Stelle weise ich darauf aber einmalig hin: Alle zu implementierenden Funktionen müssen sich in ein "typisches" Gerüst einfügen. Für die folgenden Aufgaben werdet ihr weite Teile dieses Gerüstes übernehmen können, arbeitet also entsprechend sorgfältig.
  • Globales aufhellen von Bildern
    • Ausgehend von der aktuellen Intensität Iy,x an einem Pixel der Bildzeile y und Spalte x eines Bildes, soll ein neues Bild bestimmt werden, dessen Pixel-Intensitäten sich durch folgenden lineare Histogramm-Transformation ergeben:
      • f(Iy,x) = Iy,x + v
    • Dabei ist v das Maß für die Helligkeitsveränderung.
    • Beispielaufruf (erster Parameter ist die Veränderung der Intensität):
      • ./bba <img> brighten 10
  • Lineare Histogramm-Transformation
    • Ausgehend von der aktuellen Intensität Iy,x an einem Pixel der Bildzeile y und Spalte x eines Bildes, soll ein neues Bild bestimmt werden, dessen Pixel-Intensitäten sich durch folgenden lineare Histogramm-Transformation ergeben: 
      • f(Iy,x) = k * Iy,x + h
    • Dabei ist k ein Maß für die Kontraständerung und h ein Maß für die Helligkeitsänderung des transformierten Bildes, welche per Kommandozeilenparameter übergeben werden müssen. Für k und h sollten Wertebereiche nach folgenden Kriterien festgelegt werden:
      • welchen minimalen/maximalen Wert sollten k bzw. h annehmen können, so dass ein kleinerer/größerer Wert keine andere Auswirkung auf das Ergebnisbild haben könnte? 
      • sollte die Eingabe von k bzw. h als Dezimalzahl oder als Ganzzahl erfordert/zugelassen werden?
    • Beispielaufruf (erster Parameter: k, zweiter Parameter: h, beide Parameter zwingend erforderlich!):
        • ./bba <img> linear 2.1 -10
  • Gamma-Korrektur
    • Ausgehend von der aktuellen Intensität Iy,x an einem Pixel der Bildzeile y und Spalte x eines Bildes, soll ein neues Bild bestimmt werden, dessen Pixel-Intensitäten sich durch folgende Histogramm-Transformation ergeben: 
      • f(Iy,x) = Imin + ((Iy,x Imin)/(Imax Imin))^a * (Imax Imin)
    • Dabei ist a ein Maß für die Kontraständerung - für a < 1 wird der Kontrast im dunklen Bereich des Bildes erhöht, für a > 1 wird der Kontrast im hellen Bereich erhöht.
    • Einschränkungen des Wertebreichs von a sollen wie im vorigen Aufgabenteil berücksichtigt (und in der Programmhilfe ausgegeben werden).
    • Beispielaufruf (Parameter für a zwingend erforderlich!):
      • ./bba <img> gamma 0.1

Bewertungsteil: Spezifische Verarbeitung von Farbbildern (2 Punkte)

Dieser Aufgabenteil befasst sich mit der korrekten Verarbeitung von Farbbildern. Wie eingangs erwähnt können nichtlineare Transformationen die Farbbalance eines RGB Bildes verändern. Allerdings kann ein Farbwert (r,g,b) im RGB-Farbmodell in einen Farbwert im YCbCr-Frabmodell umgewandelt werden, in welchem die Y-Komponente ausschließlich die Intensität des Pixels beschreibt und Cb sowie Cr ausschließlich die Farbinformation. Wird die nicht-lineare Histogramm-Transformation nun auf die Y-Komponente angewandt und anschließend der Farbwert zurück in das RGB-Farbmodell konvertiert, so wurde nur die Intensität des Bildes bearbeitet und die Farbbalance bleibt erhalten.

In OpenCV kann dies wie folgt implementiert werden:

 cv::Mat ycrcb;
cv::cvtColor(inputImage, ycrcb, CV_RGB2YCrCb);
cv::vector<cv::Mat> channels;
cv::split(ycrcb, channels);
// Beispiel einer nichtlinearen Histogramm-Transformation
equalize(channels[0], channels[0]);
cv::merge(channels, ycrcb);
cv::cvtColor(ycrcb, result, CV_YCrCb2RGB);

Jeder der hier geforderten Operationen soll für diesen optionalen Aufgabenteil nur auf eine Teilmenge der möglichen Kanäle angewandt werden. In diesem Fall kommt als globaler Parameter die Option --channels hinzu. Als Parameter sind hierbei stets der Farbraum und eine kommagetrennte Liste der zu transformierenden Kanäle anzugeben. Zulässige Farbräume im Sinne dieser Aufgabe sind RGB, BGR, HSV, YUV und YCrCb. Die Angabe der Kanäle ist dabei optional, im Normalfall soll auf allen Kanälen gearbeitet werden.

Beispiele für korrekte Aufrufe:

  • ./bba <img> brighten 10 --channels RGB 0 1 2 # Alle Kanäle RGB
  • ./bba <img> brighten 10 --channels RGB       # Alle Kanäle RGB
  • ./bba <img> brighten 10 --channels YCrCb 0   # Helligkeitskanal

Bewertungsteil: Äquilibrierung (2 Punkte)

  • Ausgehend von der aktuellen Intensität Iy,x an einem Pixel der Bildzeile y und Spalte x eines Bildes, soll ein neues Bild bestimmt werden, dessen Intensitäten f(Iy,xdem äquilibrierten Quellbild entsprechen.
  • Als Kommandozeilenparameter können diesmal die minimale und maximale Intensität (jeweils ganzzahlig) mit angegeben werden. Werden diese nicht mit angegeben, ist Imin=0 bzw. Imax=255.
  • Ob die Äquilibrierung korrekt berechnet wird, kann mit dem Beispiel auf Folie 13 der Vorlesungsfolien überprüft werden: Folien zu Histogramm-Transformationen 
  • Beispielaufrufe (entweder ohne weitere Parameter, oder mit beiden Parametern in der Reiehnfolge Imin Imax):
    • ./bba <img> equalize
    • ./bba <img> equalize 1 11

Abnahme

10:0010:3011:0011:30
mri01: inf100434,ite10193503: minf100674,minf10066606: iam10042009: inf101979
hoe02: minf100593,minf10057905: minf100554,minf10010607: minf1084,minf104610: iam100830