SonyUserforum

SonyUserforum (https://www.sonyuserforum.de/forum/index.php)
-   Café d`Image (https://www.sonyuserforum.de/forum/forumdisplay.php?f=94)
-   -   Bildverarbeitungsalgorithmen (https://www.sonyuserforum.de/forum/showthread.php?t=113061)

Neonsquare 22.01.2012 20:23

@hans-peter
Ich kann diese Bibliothek zum anschauen sehr empfehlen:

https://github.com/slyrus/opticl

"opticl is designed to be a high-performance, but relatively lightweight, library for representing, processing, loading, and saving 2-dimensional pixel-based images."

Die Bibliothek ist in Common Lisp geschrieben, was zwar für viele Anfangs ungewohnt ist, sich am Ende aber als großer Vorteil erweist: Common Lisp ist sehr High-Level und eher funktional orientiert. Der Code ist also eher "mathematisch" - damit näher an den Textbüchern. Ebenso ist der Code auf die eigentliche Aufgabe konzentriert und enthält nicht Unmengen an Speicherverwaltungskrampf wie bei C oder C++. Last not least ist der Code recht überschaubar kurz - was eben vor allem an der Konzentration auf das Wesentliche und den High-Level Features von Common Lisp liegt.

z. B. beim Thema Schärfen:
Opticl hat die Funktion SHARPEN-IMAGE folgendermaßen definiert:

Code:

(defun sharpen-image (img)
  (trim-image
    (discrete-convolve img *sharpen-kernel*) 1 1))

"Schärfen" ist hier also eine diskrete Dekonvolution mit einer speziellen Matrix, dem "*sharpen-kernel*". Wie sieht diese Matrix aus?

Code:

(defparameter *sharpen-kernel*
  (normalize-array #2A((-1 -4 -1)
                      (-4 26 -4)
                      (-1 -4 -1))
                  :element-type 'double-float))

Beim Konvolutionskernel handelt sich also um eine quadratische, symmetrische 3x3 Matrix. Interessant dazu auch der Gauss-Kernel:

Code:

(defparameter *gaussian-kernel*
  (normalize-array #2A((1 2 1)
                      (2 4 2)
                      (1 2 1))
                  :element-type 'double-float))

Die Funktion DISCRETE-CONVOLVE ist erstmal etwas länger, weil sie einige Zweige enthält, die für bestimmte Bildtypen (8 Bit RGB, 16 bit RGB usw.) optimiert sind. Die hätte man eigentlich besser in eigene Funktionen aufgeteilt und per Inline optimiert. Der letzte Zweig enthält aber die generische Fassung des Algorithmus. Das sind dann ca. 20 Zeilen die den Algorithmus beschreiben wie jeder Pixel des Zielbildes berechnet wird Anhand der Bildmatrix und des Kernels.

Das schöne daran ist auch, dass man bei Common Lisp mit den Funktionen interaktiv auf der Kommandozeile arbeiten kann. So kann man mit Opticl einfach mal schnell ein Bild einlesen und dann direkt damit herumspielen.

Gruß,
Jochen


Alle Zeitangaben in WEZ +2. Es ist jetzt 23:50 Uhr.