Mapra: C++ Teil 7 Felix Gruber, Michael Rom IGPM 14. Juni 2016 Felix Gruber, Michael Rom (IGPM) Mapra: C++ Teil 7 14. Juni 2016 1 / 20
Themen vom letzten Mal Klassen this-pointer Virtuelle Methoden Bildbearbeitung Bildklasse GreyScale ASCII-PGM-Format Pixelweise Operatoren zur Bildverarbeitung Felix Gruber, Michael Rom (IGPM) Mapra: C++ Teil 7 14. Juni 2016 2 / 20
Heutige Themen 1 Ein-/Ausgabe über Dateien File Streams Beispiel mit Matrixklasse Byteweises Einlesen von Dateien 2 Lokale Operatoren zur Bildverarbeitung Felix Gruber, Michael Rom (IGPM) Mapra: C++ Teil 7 14. Juni 2016 3 / 20
File Streams: Ein-/ Ausgabe über Dateien Zuerst header-datei für file streams einbinden #include <fstream> Öffnen des file streams zur Ein- bzw. Ausgabe ifstream ifs ; ifs. open ( " mydata. txt " ); ofstream ofs ( " results. dat " ); gewohnte Verwendung von Ein- und Ausgabeoperator (wie mit cin und cout) ifs >> a; ofs << " Das Ergebnis lautet " << f( x ) << ".\n"; Schließen des file streams nach Verwendung ifs.close(); ofs.close(); Felix Gruber, Michael Rom (IGPM) Mapra: C++ Teil 7 14. Juni 2016 4 / 20
Einlesen Eingabeoperator >> erwartet, dass Daten durch Whitespace getrennt sind (Leerzeichen, Tabulator, Zeilenumbruch) Abfrage des Stream-Status: ifs.good() : Stream bereit zum Lesen ifs.eof( ) : Ende der Datei (end of file) erreicht ifs.fail() : letzte Leseoperation nicht erfolgreich ifs.clear(): setzt Status zurück, ermöglicht weiteres Lesen Leseoperation >> wird nur bei good-status durchgeführt Beispiel: ifstream ifs ( " input. txt " ); double d; int i; string s; Datei input.txt: 17.5 4711 Hallo ifs >> d >> i; // good ifs >> i; // fail ifs. clear (); // good ifs >> s; // good ifs >> s; // fail eof Felix Gruber, Michael Rom (IGPM) Mapra: C++ Teil 7 14. Juni 2016 5 / 20
Beispiel mit Matrixklasse Wir können ein Dateiformat für unsere Matrixklasse anlegen, um Matrizen zu speichern. In der Datei A.mat wird die Matrix A = folgendermaßen gespeichert: Datei A.mat: 5 5 1 0 0 0-1 0 1 0 0-1 0 0 1 0-1 0 0 0 1-1 -1-1 -1-1 -1 1 0 0 0 1 0 1 0 0 1 0 0 1 0 1 0 0 0 1 1 1 1 1 1 1 R 5 5 Felix Gruber, Michael Rom (IGPM) Mapra: C++ Teil 7 14. Juni 2016 6 / 20
Beispiel mit Matrixklasse Einlesen der Matrix A aus der Datei A.mat: ifstream ifs ( "A. mat " ); int zeilen, spalten ; ifs >> zeilen ; ifs >> spalten ; Matrix A( zeilen, spalten ); for ( int i = 0; i < zeilen ; ++ i ) for ( int j = 0; j < spalten ; ++ j ) ifs >> A( i, j ); Felix Gruber, Michael Rom (IGPM) Mapra: C++ Teil 7 14. Juni 2016 7 / 20
Beispiel mit Matrixklasse Auslesen der Matrix B = A A in die Datei B.mat: ofstream ofs ( "B. mat " ); ofs << B. Zeilen () << endl ; ofs << B. Spalten () << endl ; for ( int i = 0; i < B. Zeilen (); ++ i ) { for ( int j = 0; j < B. Spalten (); ++ j ) ofs << B( i, j ) << " "; ofs << endl ; } Felix Gruber, Michael Rom (IGPM) Mapra: C++ Teil 7 14. Juni 2016 8 / 20
Beispiel mit Matrixklasse Auslesen der Matrix B = A A in die Datei B.mat: ofstream ofs ( "B. mat " ); ofs << B. Zeilen () << endl ; ofs << B. Spalten () << endl ; for ( int i = 0; i < B. Zeilen (); ++ i ) { for ( int j = 0; j < B. Spalten (); ++ j ) ofs << B( i, j ) << " "; ofs << endl ; } Datei B.mat: 5 5 2 1 1 1 0 1 2 1 1 0 1 1 2 1 0 1 1 1 2 0 0 0 0 0 5 Felix Gruber, Michael Rom (IGPM) Mapra: C++ Teil 7 14. Juni 2016 8 / 20
Funktionen zum Einlesen von Dateien Wir betrachten verschiedene Möglichkeiten für das Einlesen der Datei test.txt: 753 1706 1789 999 2013 2014 Felix Gruber, Michael Rom (IGPM) Mapra: C++ Teil 7 14. Juni 2016 9 / 20
Funktionen zum Einlesen von Dateien Wir betrachten verschiedene Möglichkeiten für das Einlesen der Datei test.txt: 753 1706 1789 999 2013 2014 Hier werden whitespaces (Leerzeichen, Umbrüche,...) als Trenner der Integers 753, 1706, 1789,... interpretiert: ifstream Istr ( " test. txt " ); int n; Istr >> n; cout << n << endl ; // 753 Istr >> n; cout << n << endl ; // 1706 Istr >> n; cout << n << endl ; // 1789 Istr >> n; cout << n << endl ; // 999 Felix Gruber, Michael Rom (IGPM) Mapra: C++ Teil 7 14. Juni 2016 9 / 20
Funktionen zum Einlesen von Dateien Wir betrachten verschiedene Möglichkeiten für das Einlesen der Datei test.txt: 753 1706 1789 999 2013 2014 Die Funktion get() liest den nächsten character ein. Auch Leerzeichen (32), Umbrüche (10),... sind character! ifstream Istr ( " test. txt " ); int n; n = Istr. get (); cout << n << endl ; // 55 ( 7 ) n = Istr. get (); cout << n << endl ; // 53 ( 5 ) n = Istr. get (); cout << n << endl ; // 51 ( 3 ) n = Istr. get (); cout << n << endl ; // 32 ( ) Felix Gruber, Michael Rom (IGPM) Mapra: C++ Teil 7 14. Juni 2016 10 / 20
Funktionen zum Einlesen von Dateien Wir betrachten verschiedene Möglichkeiten für das Einlesen der Datei test.txt: 753 1706 1789 999 2013 2014 Wenn wir char n statt int n verwenden, wird die ASCII-Repräsentation der character ausgegeben: ifstream Istr ( " test. txt " ); char n; n = Istr. get (); cout << n << endl ; // 7 n = Istr. get (); cout << n << endl ; // 5 n = Istr. get (); cout << n << endl ; // 3 n = Istr. get (); cout << n << endl ; // /* Leerzeichen */ Felix Gruber, Michael Rom (IGPM) Mapra: C++ Teil 7 14. Juni 2016 11 / 20
Funktionen zum Einlesen von Dateien Wir betrachten verschiedene Möglichkeiten für das Einlesen der Datei test.txt: 753 1706 1789 999 2013 2014 Mit >> werden ebenfalls einzelne character nach char n eingelesen, Leerzeichen/Umbrüche werden allerdings übersprungen! ifstream Istr ( " test. txt " ); char n; Istr >> n; cout << n << endl ; // 7 Istr >> n; cout << n << endl ; // 5 Istr >> n; cout << n << endl ; // 3 Istr >> n; cout << n << endl ; // 1 Felix Gruber, Michael Rom (IGPM) Mapra: C++ Teil 7 14. Juni 2016 12 / 20
Funktionen zum Einlesen von Dateien Wir betrachten verschiedene Möglichkeiten für das Einlesen der Datei test.txt: 753 1706 1789 999 2013 2014 Die Funktion peek() arbeitet wie get(), entfernt das Zeichen allerdings nicht aus dem Stream. ifstream Istr ( " test. txt " ); char n; n = Istr. peek (); cout << n << endl ; // 7 n = Istr. peek (); cout << n << endl ; // 7 n = Istr. get (); cout << n << endl ; // 7 n = Istr. peek (); cout << n << endl ; // 5 Felix Gruber, Michael Rom (IGPM) Mapra: C++ Teil 7 14. Juni 2016 13 / 20
Funktionen zum Einlesen von Dateien Mittels Istr >> ws werden alle whitespaces am Anfang des Streams entfernt. Als Beispiel betrachten wird die folgende Datei test.txt: 0 12 3 und lesen alle Nicht-whitespace-Zeichen aus: ifstream Istr ( " test. txt " ); string s; char ch; while (! Istr. eof () ) { Istr >> ws; // whitespace entfernen Istr >> ch; // naechsten char einlesen s += ch; // s = s + ch ( hinten anhaengen ) } cout << s << endl ; // 0123 Felix Gruber, Michael Rom (IGPM) Mapra: C++ Teil 7 14. Juni 2016 14 / 20
Lokale Operatoren zur Bildverarbeitung Aus (Funktional)analysis bekannt (?): Faltungen: Eine (kontinuierliche) Funktion E(x), x R n wird mit einem Integralkern k(x) gefaltet. Man erhält so eine neue Funktion A(x): A(x) := (E k)(x) := E(x t) k(t) dt R n = E(x t) k(t) dt supp(k) Felix Gruber, Michael Rom (IGPM) Mapra: C++ Teil 7 14. Juni 2016 15 / 20
Lokale Operatoren zur Bildverarbeitung Aus (Funktional)analysis bekannt (?): Faltungen: Eine (kontinuierliche) Funktion E(x), x R n wird mit einem Integralkern k(x) gefaltet. Man erhält so eine neue Funktion A(x): A(x) := (E k)(x) := E(x t) k(t) dt R n = E(x t) k(t) dt supp(k) Für diskrete Funktionen f (x), x J Z n (z.b. Matrizen) kann das Integral als f (x) dx := f (x) J x J definiert werden (Zählmaß). Felix Gruber, Michael Rom (IGPM) Mapra: C++ Teil 7 14. Juni 2016 15 / 20
Lokale Operatoren zur Bildverarbeitung Diskrete Faltung von M E mit Faltungskern K(i, j) mit i, j = 1, 0, 1, d.h. K ist eine 3 3-Matrix: M A (x, y) := (M E K)(x, y) := M E (x + i, y + j) K(i, j), hier also supp(k) = { 1, 0, 1}. i,j { 1,0,1} Felix Gruber, Michael Rom (IGPM) Mapra: C++ Teil 7 14. Juni 2016 16 / 20
Lokale Operatoren zur Bildverarbeitung Diskrete Faltung von M E mit Faltungskern K(i, j) mit i, j = 1, 0, 1, d.h. K ist eine 3 3-Matrix: M A (x, y) := (M E K)(x, y) := M E (x + i, y + j) K(i, j), hier also supp(k) = { 1, 0, 1}. i,j { 1,0,1} Die Abbildung M E M A entspricht hier einem lokalen Bildverarbeitungsoperator: Ein Pixel des Ausgabebildes hängt i.a. nicht allein vom entsprechenden Pixel des Eingabebildes ab. Felix Gruber, Michael Rom (IGPM) Mapra: C++ Teil 7 14. Juni 2016 16 / 20
Lokale Operatoren zur Bildverarbeitung Diskrete Faltung von M E mit Faltungskern K(i, j) mit i, j = 1, 0, 1, d.h. K ist eine 3 3-Matrix: M A (x, y) := (M E K)(x, y) := M E (x + i, y + j) K(i, j), hier also supp(k) = { 1, 0, 1}. i,j { 1,0,1} Die Abbildung M E M A entspricht hier einem lokalen Bildverarbeitungsoperator: Ein Pixel des Ausgabebildes hängt i.a. nicht allein vom entsprechenden Pixel des Eingabebildes ab. Beispiel Laplace-Filter: K = 0 1 0 1 4 1 0 1 0 Felix Gruber, Michael Rom (IGPM) Mapra: C++ Teil 7 14. Juni 2016 16 / 20
Beispiele zur Faltung Faltungen mit Faltungskern χ [ 1/2,1/2] : http://commons.wikimedia.org/wiki/file: Convolution_of_box_signal_with_itself2.gif http://commons.wikimedia.org/wiki/file: Convolution_of_spiky_function_with_box2.gif Felix Gruber, Michael Rom (IGPM) Mapra: C++ Teil 7 14. Juni 2016 17 / 20
Beispiel: Laplace-Filter Der Laplace-Filter entspricht dem Laplace-Operator = ( 11 + 22 ): Mittels Taylorentwicklung: f (x) f (x + h) 2f (x) + f (x h) h 2 Felix Gruber, Michael Rom (IGPM) Mapra: C++ Teil 7 14. Juni 2016 18 / 20
Beispiel: Laplace-Filter Der Laplace-Filter entspricht dem Laplace-Operator = ( 11 + 22 ): Mittels Taylorentwicklung: f (x) f (x + h) 2f (x) + f (x h) h 2 Im diskreten Fall (h = 1) für M E (x, y): 11 M E (x, y) := M E (x + 1, y) 2M E (x, y) + M E (x 1, y) 22 M E (x, y) := M E (x, y + 1) 2M E (x, y) + M E (x, y 1), Felix Gruber, Michael Rom (IGPM) Mapra: C++ Teil 7 14. Juni 2016 18 / 20
Beispiel: Laplace-Filter Der Laplace-Filter entspricht dem Laplace-Operator = ( 11 + 22 ): Mittels Taylorentwicklung: f (x) f (x + h) 2f (x) + f (x h) h 2 Im diskreten Fall (h = 1) für M E (x, y): 11 M E (x, y) := M E (x + 1, y) 2M E (x, y) + M E (x 1, y) 22 M E (x, y) := M E (x, y + 1) 2M E (x, y) + M E (x, y 1), d.h. M E (x, y) := ( 11 + 22 )M E (x, y) := -1 M E (x + 1, y) -1 M E (x 1, y) -1 M E (x, y + 1) -1 M E (x, y 1) +4 M E (x, y) Felix Gruber, Michael Rom (IGPM) Mapra: C++ Teil 7 14. Juni 2016 18 / 20
Beispiel: Laplace-Filter Original: Felix Gruber, Michael Rom (IGPM) Mapra: C++ Teil 7 14. Juni 2016 19 / 20
Beispiel: Laplace-Filter Laplace-Filter: Felix Gruber, Michael Rom (IGPM) Mapra: C++ Teil 7 14. Juni 2016 20 / 20