Dies ist eine alte Version des Dokuments!
Inhaltsverzeichnis
Dieses Tutorial befindet sich noch im Aufbau. Mehr zum Projekt auf https://github.com/luxeria/foip
Einführung in die Bildverarbeitung mit GNU Octave
In diesem Artikel sollen die grundlegenden Operationen der Bilderverarbeitung mit Octave zusammengefasst werden.
Installation
Die Installation von GNU Octave erfolgt bei Unixoiden Systemen über den Paketmanager und kann direkt per Kommandozeile erfolgen. Hier das Beispiel für den Paketmanager pacman von Archlinux
sudo pacman -S octave
und aptitude von Ubuntu (Debian)
sudo apt-get install octave
Für die Verwendung vom image
Pakets muss Octave ab Version 4 installiert werden. Für Archlinux gibt es Octave ab Version 4 derzeit nur im AUR
Erweiterungen
Die Instalation von Erweiterungen von Octave kann direkt aus der Kommandozeile von Octave erfolgen. Hierzu kann entweder das gewünschte Softwarepaket manuell lokal heruntergeladen und danach installiert werden oder direkt aus der Datenbank bezogen und installiert werden durch Octave.
pkg install -forge image
Ist eine solche Erweiterung installiert wird diese nicht automatisch geladen wenn eine neue Octave session eröffnet wird, sondern muss manuell geladen werden.
pkg load image
Bei der Verwendung von vielen Erweiterungen können auch sämtliche mit der
Angabe all
geladen werden.
pkg load all
Daten laden und speichern
Einstieg in jegliche Bildverarbeitung ist das Einlesen der Bilddaten und auch deren Speicherung. Im einfachsten Fall kann der Prozess in drei Teile gegliedert werden:
- Originaldatei einlesen
- Manipulation
- Manipulierte Daten ablegen
Graustufenbilder
Diese drei elementaren Schritte sind hier mit den beiden Funktionen
imread()
und imwrite()
des image package ein
einem Pseudobeispiel dargestellt:
I = imread("input_image.png"); % read image J = my_image_processing(I); % manipulate image imwrite(J, "output_image.png"); % write image
Durch die Verwendung von imread()
auf Graustufenbilder wird
die Grafik in eine entsprechende Matrix gespeichert mit den Pixelwerten.
Diese kann per imshow()
betrachtet werden.
RGB Dateien
Beim Einlesen von Graustufenbildern sind die Pixelwerte direkt in einer 2D Matrix ableget. Beim Einlesen von RGB-Bildern wird die Grafik in eine mehrschichtige 2D Matrix ableget, wobei jede Matrix die Pixelwerte für eine Farbe enthält. Die einzelnen Matrizen können wiederum als Graustufenbilder behandelt werden. Im Folgenden wird das Zerlegen eines RGB-Bildes in die einzelnen Farblayer aufgezeigt.
Image = imread("input_rgb_image.png"); % read the RGB image Red = Image(:,:,1); % extract red layer Green = Image(:,:,2); % extract green layer Blue = Image(:,:,3); % extract blue layer
Alternativ kann das GRB Bild auch direkt umgewandelt werden in ein Graustufenbild mittels rgb2gray()
.
ImageRGB = imread("image_rgb.png"); ImageGray = rgb2gray(ImageRGB); imwrite(ImageGray, "image_gray.png");
Beispiel 1
Das folgende Beispiel 1 liest eine RGB Bildatei ein und wandelt diese in ein Graustufenbild um. Die beiden Bilder werden in einem Plot gegenübergestellt und das neu erstellte Graustugenbild gespichert.
ImageOrig = imread(imageSource); % convert the RGB image to a grayscale image ImageGray = rgb2gray(ImageOrig); % show the two images figure(1); subplot(1,2,1); imshow(ImageOrig); title("Original RGB Image"); subplot(1,2,2); imshow(ImageGray); title("Converted Grayscale Image"); % save the grayscale image imwrite(ImageGray, "building_gray.jpg");
Pixel lesen und schreiben
Geladene Bilder sind in Octave einfache 2D Arrays bzw. Matrizen und können auch wie solche behandelt werden. Eine solche Matrix hat Spalten (x) und Zeilen (y) und wird als folgende Struktur dargestellt
Image = x1y1 x2y1 x3y1 x4y1 ... xny1 x1y2 x2y1 x3y2 x4y2 ... xny2 x1y3 x2y3 x3y3 x4y3 ... xny3 x1y4 x2y4 x3y4 x4y4 ... xny4 ... ... ... ... ... x1ym x2ym x3ym x4ym xnym
Beispiel 2
Das Beispiel 2 zeigt wie Zeilen aus einem Bild gelesen werden. Diese Zeilen werden dann im einem Plot jeweils dargestellt.
% load the image Image = imread(imageSource); % get the size of the image [sy, sx] = size(Image); % define pixel lines to read from redLine = floor(1*sy/10); greenLine = floor(5*sy/10); blueLine = floor(9*sy/10); % extract pixel data redPixels = Image(redLine,:); greenPixels = Image(greenLine,:); bluePixels = Image(blueLine,:);
Statistik
Für die Behandlung von Bilddaten sind statistische Auswertungen ein grundlegendes Werkzeug. Im folgenen sollen einige Grundbegriffe kurz erläutert werden.
Absolutes Auftreten
Nimmt man ein Graustufenbild und zählt für jeden Grauwert wie viele Pixel diesen Wert haben, dann erhält man damit das absolute Auftreten der Grauwerte. Mit diesem 'Zählen' erhält man eine Basis für weitere Auswertungen. Um ein Bild auf das absolute Auftreten von Grauwerten zu untersuchen gibt es die Funktion imhist()
.
[count, value] = imhist(Image);
Relative Häufigkeit
Die relative Häufigkeit beschreibt die Auftretenshäufigkeit eines Grauwertes in Prozent. Um die relative Häufigkeit zu erhalten wird das absolute Auftreten dividiert durch die Anzahl Pixel des Bildes. Mit dem Wert der relativen Häufigkeit kann also die Aussage gemacht werden, wie viel Prozent des Bildes genau diesen Grauwert haben.
[count, value] = imhist(Image); relCount = count/numel(Image);
Kummulative Häufigkeit
Die kummulative Häufigkeit beschreibt den prozentualen Anteil der Pixel welche den Graustufenwert unterschreiten. Die y-Achse der kummulativen Häufigkeit ist also limitiert von 0 bis 1. Die Aussage welche gemacht werden kann ist, dass y% des Bildes einen Graustufenwert kleiner als x aufweist. Die Aussage kann auch umgedreht werden mit der Subtraktion von 1. Wenn also beispielsweise 30% der Pixel einen Graustufenwert kleiner als 128 haben, dann kann die Aussage getroffen werden, dass 1 - 0.3 = 0.7 = 70%
aller Pixel einen Wert höher als 128 haben.
Um die kummulative Häufigkeit eines Bildes zu erhalten muss die kummulative Summe berechnet werden der relativen Häufigkeit wie im Folgenden gezeigt wird
[count, value] = imhist(Image); relCount = count/numel(Image); % calculate relative counts cumCount = cumsum(relCount); % calculate cumulative count