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.
|
| |
Types.hs |
module Types where
type Matrix a = [[a]]
type Color = Float
type Picture = Matrix Color
|
| |
PPM.hs |
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.
|
| |
Main.hs |
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.
|
| |
Funktionen
Functions.hs |
für die Bildbearbeitung
|
| |
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
|
| |
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
|
| |
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
|
| |
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.
|
| |
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
|
| |
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.
|
| |
Modularisierung |
Lagern Sie die entwickelten Funktionen aus in ein Modul Functions.hs.
Die Testfälle können in einem eigenständigen Testprogramm gesammelt werden.
|
| |
Kombination |
von mehreren Bildern
|
| |
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
|
| |
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
|
| |
Test |
Testen Sie diese Operationen indem Sie ein Schachbrett (mit 64 Feldern)
der Bildgröße 256x256 erzeugen.
|
| |
DAS Testbild |
Zum Entwickeln und Testen vielleicht erst mal etwas kleiner machen:
256x256 und
128x128
|
|
|
|
und die erste Manipulation
|
|
|
| |
Makefile |
zum Sammeln von build-Kommandos
|
| |