Aufgabe 3 - Geometrische Transformationen & Komplexe Filter

Ziel ist ein Programm, 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.

Basisteil

  • In dieser Aufgabe beschäftigen wir uns vor allem mit geometrischen Transformationen von Bildern und untersuchen dabei inwiefern die verschiedenen Verfahren bei der Diskretisierung eine Rolle spielen. Besonderes Augenmerk liegt dabei auf dem visuellen Unterschied zwischen forward und inverse Mapping. Der Benutzer kann für jede Operation wählen, ob die Transformation ausgehend vom Quellbild (forward Mapping) oder ausgehend vom Zielbild (inverse Mapping) durchgeführt werden soll. Die "Richtung" wird dabei vom Benutzer normalerweise (siehe Bewertungsteil) nach Angabe der Operation auf der Kommandozeile übergeben.
  • Es ist für diese Aufgabe nicht erforderlich, die nötigen affinen Abbildungn (und deren Invertierung) selbst zu implementieren, ohne auf die entsprechenden Matrixoperationen aus OpenCV zurückzugreifen. Verwenden Sie bitte eine der stark typisierten Matx Varianten von OpenCV.
  • Im Basisteil berechnen Sie alle interpolierten Werte mit dem Nearest Neighbour Verfahren, andere Interpolationsmethoden sind im optionalen Bewertungsteil zu finden. Alle Interpolationsverfahren sind selbst zu implementieren, also ohne eine Nutzung der unzähligen Möglichkeiten die OpenCV an dieser Stelle bietet! Schreiben Sie für jedes Verfahren eine eigene Funktion, welche die entsprechenden Interpolation implementiert, also eine zur Position passende Intensität zurückliefert.
  • Für alle zu implementierenden Operationen fungiert der Mittelpunkt des Bildes als Fixpunkt.
  • Skalierung
    • Diese Operation soll das Quellbild frei in X und Y Richtung skalieren. Sofern der Koeffizient für die entsprechende Skalierung betragsmäßig 1 ist, müssen im Zielbild die exakten Werte aus dem Quellbild entnommen werden, ohne etwaige Ungenauigkeiten durch eine Interpolation herbeizuführen.
      • ./bba <img> scale forward  2  1 # Doppelte Breite
      • ./bba <img> scale inverse  1  2 # Doppelte Höhe
      • ./bba <img> scale forward -1  1 # Spiegelung Y Achse
      • ./bba <img> scale inverse  1 -1 # Spiegelung X Achse
  • Rotation
    • Diese Operation soll das Quellbild um einen frei wählbaren Winkel im Uhrzeigersinn rotieren und dabei ggfs. auch die Bildgröße des Zielbildes anpassen.
    • Sofern es zu einer Anpassung der Dimensionen des Zielbildes kommt, ist als Wert für unbekannte Intensitäten die häufigste vorkommende Intensität am unmittelbaren Bildrand einzusetzen. Als "am Bildrand gelegen" gilt dabei jedes Pixel des Quellbildes, bei dem eine der Positionskomponenten 0 ist oder der Höhe - 1 (y-Komponente) bzw. Breite - 1 (x-Komponente) des Quellbildes entspricht.
    • Sofern die Rotation um ein ganzzahliges Vielfaches von 90° vorgenommen werden soll, müssen im Zielbild die exakten Werte aus dem Quellbild entnommen werden, ohne etwaige Ungenauigkeiten durch eine Interpolation herbeizuführen.
      • ./bba <img> rotate forward  90 # Keine Interpolation zulässig
      • ./bba <img> rotate inverse -90 # Keine Interpolation zulässig
      • ./bba <img> rotate forward  45 # Behandlung von unbekannten Intensitäten nötig

Bewertungsteil: Interpolationsmethoden (2 Punkte)

Implementieren Sie neben der Nearest-Neighbour Interpolation aus dem Basisteil noch zusätzlich eine Möglichkeit bilinear oder bikubisch zu interpolieren. Die Angaben auf der Kommandozeile werden in diesem Fall um die Methode der Interpolation unmittelbar nach der Angabe der Operation "eingeschoben".

    • ./bba <img> scale nearest inverse 1 1
    • ./bba <img> scale linear  inverse 1 1
    • ./bba <img> scale bicubic inverse 1 1

    Update vom 8.1.2015: Die Interpolation ist nur für die inverse Transformation zu Implementieren.

    Bewertungsteil: Pencil-Sketch (2 Punkte)

    Implementieren Sie anhand der Vorgehensskizze von Herrn Bohn (Foliensatz 8, Folie 2) einen Pencil-Sketch-Filter (Kommandozeile: pencil). Sie können dabei für die nötigen Zwischenschritte wahlweise auf den vollen Funktionsumfang von OpenCV zugreifen oder die entsprechenden Funktion selber implementieren. Visualisieren Sie, sofern die globale Option --imshow aktiv ist, jeden der in den Folien beschriebenen Zwischenschritte in dem sie die entstehenden Bilder am Ende des Vorgangs gemeinsam in einem Fenster anzeigen. Ordnen sie dabei die Bilder von links nach rechts, ein Zeilenumbruch ist nicht erforderlich.

    Abnahme

    10:0010:3011:0011:30
    mri06: iam10042009: inf10197901: inf100434,ite10193503: minf100674,minf100666
    Alex07: minf1084,minf104610: iam10083002: minf100593,minf10057905: minf100554,minf100106