Aufgabe 2 - 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

Für alle zu implementierenden Filter gilt zunächst: Sofern Teile des Filterkerns außerhalb des Bildbereiches liegen, soll der Kernel für den entsprechenden Hotspot nicht angewandt werden. Andere Formen der Randbehandlung sind Gegenstand des optionalen Bewertungsteils.

Außerdem gilt für alle Filter, dass auf einem höher aufgelösten Zwischenbild gearbeitet werden soll. Dieses Zwischenbild soll für jeden Kanal den Datentyp float zugrundelegen. Konvertiert das Zwischenbild entspreched mit cv::Mat::convertTo und CV_32FC1 als Parameter.

Nach der Verarbeitung befinden sich möglicherweise einzelne Pixel außerhalb des zulässigen Wertebereichs, also durch Fließkommazahlen jenseits des Intervals [0, 1] . Wenn das der Fall ist soll bei der Rückkonvertierung in die RGB Repräsentation linear zwischen dem minimalen und dem maximal auftretenden Wert skaliert werden. 

  • Erosion und Dilatation
    • Diese Verfahren sollen, abweichend von der Veranstaltung von Prof. Bohn, auch für Farbbilder implementiert werden. Auch wenn es sich hierbei streng genommen nicht um eine lineare Operation handelt, sollen diese Verfahren auf jeden Kanal einzeln angewandt werden.
    • Für jedes Pixel sollen die acht unmittelbar benachbarten Pixel berücksichtigt werden.
    • Beispielaufrufe
      • ./bba <img> dilate
      • ./bba <img> erode
  • Opening und Closing
    • Aufbauend auf den Funktionen für Erosion und Dilatiation sollen auch diese Operationen für Farbbilder implementiert werden.
    • Als Parameter sollen diesem Verfahren zunächst die Anzahl der Vorgänge übergeben werden (also der Parameter n bezogen auf die Folien von Herrn Bohn).
      • ./bba <img> opening 3 # 3-faches Opening
      • ./bba <img> closing 4 # 4-faches Opening
  • Beliebige Filterkernel
    • Über die Kommandozeile sollen dem Programm eine beliebige Anzahl (mind. 1) quadratischer Filter übergeben werden können. Da der Kernel in jedem Fall quadratisch ist kann aus der Anzahl der übergebenen Werte auf die Größe der Matrix geschlossen werden. Die Indizierung der Zellen beginnt dabei in der linken, oberen Ecke der Matrix und verläuft zeilenweise.
    • Der erste Parameter des Programms entspricht dem Koeffizienten durch den nach Anwendung des Filters abschließend dividiert wird. Dieser Koeffizient entspricht nicht zwingend der Summe aller Elemente der Matrix! 
      • ./bba <img> filter 16 1 2 1 2 4 2 1 2 1 # Gauß Filter
      • ./bba <img> filter  1 1 2 3 0 0 0 0 0 0 # 1 2 3
                                                # 0 0 0
                                                # 0 0 0
  • Spezielle Filterkernel
    • Aufbauend auf der Funktionalität für beliebige Filterkernel sind die folgenden speziellen Filter entsprechend der Vorlesungsunterlagen bereitzustellen. Die Bezeichnung in Klammern ist dabei der erwartete Parameter für die Kommandozeile.
      • Gleitender Mittelwert (moving-average)
      • Gauß Filter (gaussian)
      • Prewitt (prewitt-x und prewitt-y)
      • Sobel (sobel-x und sobel-y)

Bewertungsteil: Randbehandlung (2 Punkte)

Für jede der hier zu implementierenden Filteroperationen soll optional angegeben werden können, nach welchem Verfahren die Randbehandlung zu implementieren ist. In diesem Fall kommt als globaler Parameter die Option --edge hinzu. Die zu implementierenden Methoden der Randbehandlung sind:

  • none, also das auslassen von Pixeln die eine Randbehandlung erfordern würden.
  • const <value>, also die implizite Fortsetzung des Bildes mit einem gegebenen Wert.
  • continue, also die konstante fortsetzung.
  • tile, also die periodische fortsetzung.

Alle diese Verfahren sind ohne eine Veränderung der Bilddaten möglich und auch so zu implementieren. Das allokieren von weiterem Speicher zur Randbehandlung ist damit explizit unzulässig.

Bewertungsteil: Verkettung von linearen Filtern (2 Punkte)

Dieser Bewertungsteil erweitert das Programm um die Verkettung von Filtern. Statt genau einem Filter soll jetzt eine beliebig lange Liste von Filtern angegeben werden können, mindestens jedoch immer einer. Sofern zwei aufeinanderfolgende Filterkernel durch eine einzelne Matrix gefaltet werden können, müssen diese entsprechend den Unterlagen von Herrn Bohn zusammengefasst werden. Konkret für diese Aufgabe müssen also Kombinationen aus allen Filtern ausser dilate, erode, opening und closing zu einer einzigen Matrix zusammengefasst werden. Daraus ergeben sich z.B. die folgenden korrekten Aufrufe:

  • ./bba <img> dilate dilate dilate erode erode erode
  • ./bba <img> dilate filter 16 1 2 1 2 4 2 1 2 1 erode
  • ./bba <img> gaussian prewitt-x prewitt-y # 1 Matrix

Abnahme

10:0010:3011:0011:30
Alex03: minf100674,minf10066606: iam10042009: inf10197901: inf100434,ite101935
mri05: minf100554,minf10010607: minf1084,minf104610: iam10083002: minf100593,minf100579