home Funktionale Programmierung: Bilder als Listen von Listen Prof. Dr. Uwe Schmidt FH Wedel

Bilder als Listen von Listen

weiter

weiter

Aufgabe

Bildbearbeitung
als Trainingslager für Listenverarbeitung.
 
Eine sehr einfache Datenstruktur für Graustufen-Bilder sind Matrizen realisiert als Listen von Listen. Farben, genauer Helligkeitswerte, sind dabei reelle Zahlen aus dem Intervall 0.0 .. 1.0. Folgende Typen seinen hierfür vordefiniert.
weiter
module Types where
 
type Matrix a   = [[a]]
 
type Color      = Float
type Picture    = Matrix Color
 
weiter
Damit interessante Beispiele behandelt werden können, wird das Einlesen und Ausgeben von Bildern benötigt. Hierfür bietet sich zum Experimentieren das PGM (Portable Grey Map) Format an. Dieses ist rein textbasiert, sehr einfach einzulesen und zu erzeugen. Vorgefertigte Routinen hierfür sind in der Datei PPM.hs enthalten.
weiter
Ein Mini-Hauptprogramm enthält einfache Kommandos für das Einlesen und Ausgeben von Bild-Dateien und eine rudimentäre Verarbeitung der Kommandozeilen-Parameter. Dieses kann in der Übung schrittweise erweitert werden.
weiter
Funktionen
Functions.hs
für die Bildbearbeitung
weiter
Erzeugende Funktionen
Entwickeln Sie einige Funktion zum Erzeugen von einfachen Bildern: Ein konstant schwarzes Bild in vorgegebener Größe, ein konstant weißes, ein konstant graues mit Helligkeit als Parameter, ein Farbverlauf von schwarz nach weiß horizontal, vertikal und diagonal.
 
black   ::          Int -> Int -> Picture
white   ::          Int -> Int -> Picture
grey    :: Color -> Int -> Int -> Picture
b2wH    ::          Int -> Int -> Picture
b2wV    ::          Int -> Int -> Picture
b2wD    ::          Int -> Int -> Picture
weiter
Punktweise Bildmanipulation
Entwickeln Sie eine Funktion mapPicture mit der eine Funktion zur Manipulation eines Farbwertes auf ein Bild angewendet werden kann.
 
Nutzen sie diese Funktion zur Entwicklung folgender Bildmanipulationen:
  • Negativ berechnen
  • Gamma-Funktion anwenden: gamma g x = x ^ (1/g)
  • Reduktion auf eine Bitmap (0.0 .. 0.5: schwarz, 0.5 .. 1.0 weiß)
  • Reduktion der Helligkeitsstufen auf eine vorgegebene Anzahl (Hinweis: dies ist eine Verallgemeinerung von bitMap)
  • Helligkeitsbereich maximieren: Bilder, die nicht den maximal möglichen Helligkeitsbereich ausnutzen, sollen so manipuliert werden, dass sowohl schwarz als auch weiß im Resultat vorkommen. (Immer möglich?)
 
invert        ::          Picture -> Picture
bitMap        ::          Picture -> Picture
reduceColors  :: Int   -> Picture -> Picture
gamma         :: Float -> Picture -> Picture
stretch       ::          Picture -> Picture
weiter
Testfälle
Entwickeln Sie auf systematische Weise Testfälle für die Operationen. Nutzen Sie dafür Eigenschaften (Gesetze), die von diesen Funktionen erfüllt werden.
Punkt-Transformationen
Entwickeln Sie eine Funktion zum Spiegeln an der Horizontalen und der Vertikalen und zum Drehen um 90 Grad. Tipp: Im Paket Data.List gibt es einige nützliche Funktionen hierfür.
 
flipH        ::          Picture -> Picture
flipV        ::          Picture -> Picture
rot90        ::          Picture -> Picture
rot180       ::          Picture -> Picture
rot270       ::          Picture -> Picture
weiter
Testfälle
Entwickeln Sie auf systematische Weise Testfälle für die Operationen. Nutzen Sie dafür Eigenschaften (Gesetze), die von diesen Funktionen erfüllt werden.
weiter
Vergrößern und Verkleinern
Entwickeln Sie eine Funktion zum Verdoppeln der Größe eines Bildes durch Duplizieren der Bildpunkte und eine Funktion zum Halbieren der Größe durch Mittelwertbildung zweier Bildpunkte.
 
doubleSize   ::          Picture -> Picture
halfSize     ::          Picture -> Picture
weiter
Testfälle
Entwickeln Sie auf systematische Weise Testfälle für die Operationen. Nutzen Sie dafür Eigenschaften (Gesetze), die von diesen Funktionen erfüllt werden.
weiter
Modularisierung
Lagern Sie die entwickelten Funktionen aus in ein Modul Functions.hs. Die Testfälle können in einem eigenständigen Testprogramm gesammelt werden.
weiter
Kombination
von mehreren Bildern
weiter
Punktweise Kombination
Entwickeln Sie eine Funktion zipPicture zum punktweisen Kombinieren zweier Bilder und nutzen Sie diese für die Addition und die Multiplikation und Subtraktion zweier Bilder. Wählen Sie geeignete Additions- Subtraktions und Multiplikationsoperationen.
 
zipPicture  :: ??? ->
               Picture -> Picture -> Picture
addPicture  :: Picture -> Picture -> Picture
subPicture  :: Picture -> Picture -> Picture
multPicture :: Picture -> Picture -> Picture
 
-- Gesetz:
-- (p1 `addPicture` p2) `subPicture` p2 = p1
weiter
Kombination durch Anordnung
Entwickeln Sie eine Funktion `beside` zum nebeneinander plazieren und `above` zum übereinander plazieren von zwei Bildern. Erweitern Sie diese zweistelligen Operationen zu n-stelligen.
 
beside      ::  Picture -> Picture -> Picture
above       ::  Picture -> Picture -> Picture
 
row         :: [Picture] -> Picture
stack       :: [Picture] -> Picture
weiter
Test
Testen Sie diese Operationen indem Sie ein Schachbrett (mit 64 Feldern) der Bildgröße 256x256 erzeugen.
weiter
Zum Entwickeln und Testen vielleicht erst mal etwas kleiner machen: 256x256 und 128x128
 
 
und die erste Manipulation
 
weiter
zum Sammeln von build-Kommandos
weiter

weiter

Vorgefertigte Module und Lösungen


Letzte Änderung: 27.03.2015
© Prof. Dr. Uwe Schmidt
Prof. Dr. Uwe Schmidt FH Wedel