Übung 4 zu Verteilte und Parallele Programmierung: Parallele Zelluläre Automaten (Teil 2, Bildverarbeitung) (PD Stefan Bosse) [5.2024] |
Es wird die parallele LuaJit VM lvm für das jeweilige eigene Betriebssystem benötigt
# lvm myprog.lua
# lvm weblvm.lua
Service thread 2 started.
[2@1592562880] HTTP server (2) listening to http://0.0.0.0:4610
Monitor thread 4 started.
[4@1592562880] HTTP server (4) listening to http://0.0.0.0:4611
Zusätzlich werden im gleichen Verzeichnis benötigt:
caluaP.lua
weblvm.lua
png-plugin.lua
Wichtig: Da Shared Memory verwendet wird (intern über ein SM-Matrix Objekt) dürfen die Zustandsdatenvariablen der Zellen nur noch vom Typ number sein (Integer, Float)!
Boolesche Ausdrücke müssen in numerische Werte kodiert werden, z.B. mit der conditional(bexpr,vtrue,vfalse)
Hilfsfunktion.
Weiterhin ist bei paralleler partitionierter Berechnung die randomsierte Initialisierung abzuändern. Es sollte eine globale geteilte Matrix für alle Partitionen verwendet werden, die mit Pseudozufallszahlen in einem Prozess berechnet wird.
┌─────┐ ┌─────┐ ┌─────┬─────┐
│ │ │ 1 │ │ 1 │ 2 │
│ 1 │ ├─────┤ ├─────┼─────┤
│ │ │ 2 │ │ 3 │ 4 │
└─────┘ └─────┘ └─────┴─────┘
┌─────┬─────┐ ┌─────┬─────┐ ┌─────┬─────┬─────┬─────┐
│ 1 │ 2 │ │ 1 │ 2 │ │ 1 │ 2 │ 3 │ 4 │
├─────┼─────┤ ├─────┼─────┤ ├─────┼─────┼─────┼─────┤
│ 3 │ 4 │ │ 3 │ 4 │ │ 5 │ 6 │ 7 │ 8 │
├─────┼─────┤ ├─────┼─────┤ ├─────┼─────┼─────┼─────┤
│ 5 │ 6 │ │ 5 │ 6 │ │ 9 │ 10 │ 11 │ 12 │
└─────┴─────┘ ├─────┼─────┤ ├─────┼─────┼─────┼─────┤
│ 7 │ 8 │ │ 13 │ 14 │ 15 │ 16 │
└─────┴─────┘ └─────┴─────┴─────┴─────┘
Wichtig: Die Paritionierung in x- und y-Richtung muss ganzahlig sein, d.h. die Größe der Automatenwelt muss durch die Anzahl Spalten und Zeilen ganzzahlig teilbar sein!
Der Zustand einer Zelle besteht aus einer oder mehreren Variablen
I.A. ist eine Variable ein Sensor, der von der Nachbarzellen gelesen wird
I.A. ist eine andere Variable der zustandsbestimmende Aktor einer Zelle, die auch die Farbe einer Zelle bestimmt
Die Nachbarzellen sind durch das Objekt self.neighbors erreichbar (direkt mit dem Shared Memory Modell, indirekt durch get/set Methoden über Kommunikationskanäle im Distributed Memory Modell). Die Felder und relativen Positionen sind wie folgt gezeigt:
if model.neighbors == 4 then
-- Neumann
self.neighbors = {
left = {-1,0},
right = {1,0},
bottom = {0,1},
top = {0,-1}
}
elseif model.neighbors == 8 then
-- Moore
self.neighbors = {
left = {-1,0},
right = {1,0},
bottom = {0,1},
top = {0,-1},
topleft = {-1,-1},
topright = {1,-1},
bottomleft = {-1,1},
bottomright = {1,1}
}
end
┌──────────┬──────────┬──────────┬────▶ x
│ │ │ │
│ topleft │ top │ topright │
│ │ │ │
├──────────┼──────────┼──────────┤
│ │ │ │
│ left │ pixel │ right │
│ │ │ │
├──────────┼──────────┼──────────┤
│ │ │ │
│ bottom- │ bottom │ bottom- │
│ left │ │ right │
├──────────┴──────────┴──────────┘
│
│
▼ y
▸
◼
|
✗
↻
≡
|
Sehr naiver Rauschfilter durch Nachbarschaftsglättung. Wichtig: Binäre Bilder erlauben Grauwertinterpolation!
Ein Pixelwert wird durch die "Mehrheit" der Nachbarschaft gsetzt (1/0)
▸
◼
|
✗
↻
≡
|
▸
◼
|
✗
↻
≡
|
Lese Rosin,2002
Versuche die im Artikel gezeigten Muster zur Rauschunterdrückung in folgende Code einzubauen. Teste den Algorithmus
Das Zellenmodell hat eine zusätzliche after Aktivität die aktualisierte Ergebnisse der Bildbearbeitung in einer geteilten Matrix target speichert.
In der Aktivitätsfunktion müssen alle defnierten Muster der Nachbarschaftszellenpixel geprüft werden. Zellen am Weltrand (mit weniger als 8 Nachbarn) werden noch nicht berücksichtigt.
Wenn ein Muster gefunden wurde wird die Regel des zustandsübergangs pixel0 → pixel angewendet, d.h., die regel wird nur angewendet wenn wasPixel=pixel0 (Optimierung: vorher die Bedingung abfragen)
▸
◼
|
✗
↻
≡
|
Eine Regel besteht aus einer Übergangsbedingung pixel0 → pixel und dem Nachbarschaftsmuster
Alle Werte sind in einem Array enthalten
Die erste Zeile der Regeltabelle definiert die Reihenfolge und Namen der Regelwerte
▸
◼
|
✗
↻
≡
|
▸
◼
|
✗
↻
≡
|
Fehler während der Simulation werden hier angezeigt. Nach Erzeugung des Simulators das Konsolenfenster leeren!
▸
◼
|
✗
↻
≡
|
Der Aufruf der simulator:draw
Methode überträgt das aktuelle Zellenbild an das Notebook wo es im nachfolgenden Fenster entsprechend der Farbpalette dargestellt wird.
Falls die Simulation "hängt", den Stopp Knopf drücken (und Konsole aktualisieren bis INTR meldung kommt)
▸
|
✗
|
▸
◼
|
✗
↻
≡
|
▸
◼
|
✗
↻
≡
|
▸
◼
|
✗
↻
≡
|