208
1 Bildverarbeitung mit C++ ã Dr. Stefan Florczyk

Bildverarbeitung mit C++ - in.tum.de+.WS03/Folien_BV.pdf · 5 • • Grafikfenster - Anzeigen von Bildern - Anzeigen von Ergebnissen, die durch Anwendung von Bildverarbeitungsoperatoren

  • Upload
    hanhu

  • View
    226

  • Download
    1

Embed Size (px)

Citation preview

1

••

Bildverarbeitung mit C++

� Dr. Stefan Florczyk

2

••

HDevelop

3

••

• Starten von HDevelop

- Setzen der Umgebungsvariablen:

setenv HALCONIMAGES/usr/stud/Mayr/images:/usr/stud/Mayr/HALCON/images

setenv HALCONROOT /usr/local/halcon

setenv DISPLAY [Rechnername].informatik.tu-muenchen.de:0.0

• Aufruf für Linux mit

/usr/local/halcon/bin/i486-unknown-linux2.0.0/hdevelop&

• Damit wird HDevelop im Hintergrund gestartet

• Aufruf für HP mit

/usr/local/halcon/bin/hppa1.1-hp-hpux10/hdevelop&

• Aufruf für Sun mit

/usr/local/halcon/bin/sparc-sun-solaris2.6/hdevelop&

4

••

5

••

• Grafikfenster

- Anzeigen von Bildern

- Anzeigen von Ergebnissen, die durch Anwendung vonBildverarbeitungsoperatoren entstehen

- Sofern mehrere Fenster geöffnet sind, ist dasjenigeaktiviert, bei dem sich im Feld 'Active' ein grünerPunkt befindet

- Ein nicht aktiviertes Grafikfenster wird dadurchaktiviert, indem mit der Maus der Button 'Active'gedrückt wird

- Durch Betätigung des Buttons 'Clear' wird der aktuelleFensterinhalt gelöscht

6

••

A

B

C

7

••

• Einige Erläuterungen zum Menü des HDevelop Hauptfenster

• File

- New: Erzeugen eines neuen Projetks

- Open: Öffnen einer Hdevelop Datei

- Insert: Einfügen eines neuen Projektes an die Stelle desEinfügemarkers

- Einfügemarker wird durch Bewegen der Maus in Bereich 'A'an die einzufügende Stelle gesetzt

- Rechte Maustaste wird betätigt und der Menüpunkt 'Setinsert Cursor' ausgewählt

- Save: Abspeichern des Projekts unter dem aktuellen Namen

- Save as..: Abspeichern des Projekts unter einem anderenNamen

8

••

- Wenn die Endung .dev gewählt wird, erfolgt dieAbspeicherung als Hdevelop Datei

- Mit der Endung .cpp wird das Programm in C++ Codeexportiert

- Read Image: Einlesen eines Bildes vom Massenspeicher

- Cleanup: Löschen von Variablen, die im Programm nichtmehr benötigt werden

- Options: Auswahl diverser Menüpunkte wie beispielsweise'Automatic Program Save'

- Modules: Gibt eine Übersicht über die aktuell benutztenHdevelop Module aus

- Quit: Beendigung des Programms

9

••

•Edit

- Undo: Zurücknehmen von Befehlen (Ctrl+Z)

- Cut: Ausschneiden von Anweisungen (Ctrl+X)

- Copy: Kopieren von Anweisungen (Ctrl+C)

- Paste: Einfügen von Anweisungen an die Stelle, auf diedie Einfügemarkierung zeigt (Ctrl+V)

- Delete: Löschen von Anweisungen

- Cut, Copy, Paste und Delete beziehen sich auf markierteAnweisungen in Bereich 'B'

- Sollen mehrere Anweisungen markiert werden, so geschiehtdies bei gedrückter Ctrl-Taste und Auswahl der zumarkierenden Befehle mit Bewegen der Maus auf dieAnweisung und Drücken der linken Maustaste

10

••

• Execute

- Run: Ausführen des aktuellen Programms (F5)

- Step: Sofern das Programm sich nicht in Ausführungbefindet kann diejenige Anweisung ausgeführt werden aufdie der Ausführungspfeil zeigt (F6)

- Der Ausführungspfeil wird in Bereich 'A' gesetzt

- Dies geschieht durch Bewegen der Maus in 'A' neben dieauszuführende Anweisung und Betätigen der linkenMaustaste

- Stop: Unterbrechen eines Programms zur Laufzeit (F9)

11

••

- Activate: Aktivieren von deaktivierten Befehlen

- Ein deaktivierter Befehl ist mit einem Sternauskommentiert

- Deactivate: Deaktivieren von aktivierten Befehlen

- Activate und Deactivate beziehen sich auf die markiertenAnweisungen in Bereich 'B'

- Reset Program: Zurücksetzten eines Programms an denAnfang

- Clear Break Point: Entfernen eines Anhaltepunkts imProgramm

- Ein Anhaltepunkt wird in derselben Weise wie dieEinfügemarkierung gesetzt

- Hierbei ist nach Betätigen der rechten Maustaste derBefehl 'Set break point' aus dem erscheinenden Menüauszuwählen

12

••

• Visualization

- Open Window: Öffnen eines Grafikfensters

- In diesem Grafikfenster werden Bilder angezeigt

- Es können die Eigenschaften des Fensters, wie Höhe,Breite und Hintergrund gesetzt werden

- Reset Parameters: Zurücksetzen der Eigenschaften desGrafikfensters auf den initialen Zustand

- Clear Window: Löschen der Inhalte des Grafikfensters

- Close Window: Schließen des Grafikfensters

- Pixel Info: Liefert Informationen über die Pixel desBildes, welches im Grafikfenster angezeigt wird

- Dies geschieht durch Bewegen der Maus auf das zuuntersuchende Pixel im Grafikfenster

13

••

- Liefert dann Informationen über Grauwert oder RGB Wert

- Zeigt die Koordinaten des Pixels

- Zeigt die Höhe und Breite des Bildes an

- Gibt die Anzahl der Kanäle des Bildes aus

- Online Zooming: Zoomen eines Bildausschnitts

- Der Nutzer kann einen Zommfaktor bestimmen

- Gray Histogram Info: Zeigt die Grauwertverteilung einesBildes

- Bei einem mehrkanaligen Bild kann der Nutzer den Kanalauswählen

- An der X-Achse sind die möglichen Grauwerte abgetragen

- An der Y-Achse wird abgetragen, wie oft der Grauwert imBild vorkommt

14

••

- Region Info: Liefert Informationen über Regionen wiebeispielsweise Breite und Höhe einer Region

- Dies geschieht durch bewegen der Maus auf die zuuntersuchende Region im Grafikfenster und Betätigen derlinken Maustaste

- Size Window: Veränderung der Größe des Grafikfensters

- Zooming: Beispielsweise kann hier in das Grafikfensterherein oder heraus gezommt werden

- Colored: Auswahl der Anzahl unterschiedlicher Farben mitdenen die Regionen im Grafikfenster kenntlich gemachtwerden können

- Color: Auswahl einer Farbe mit der im Grafikfenstergezeichnet wird

- Draw: Auswahl ob im Grafikfenster nur Konturengezeichnet werden oder ob eine füllende Zeichnungverwendet werden soll

15

••

- Line Width: Mit Line Width wird die Breite der Linieder Linie eingestellt, mit der im Grafikfenstergezeichnet wird

- Shape: Hiermit wird die Gebildeform der zu zeichnendenObjekte eingestellt

- Objekte können beispielsweise als Rechtecke oder Kreisegezeichnet werden

- Lut: Auswahl verschiedener Look-Up-Tabellen für Grau-und Farbbilder möglich

- Paint: Bietet Modi zum Anzeigen von Graubildern an (z.B.Konturlinien)

- Set Parameters: Einstellen vieler Parameter für dasGrafikfenster mit 4 Registerkarten

- Save Window: Abspeichern des Inhalts des Grafikfenstersbeispielsweise im 'tif' Format

16

••

• Control: Auswahl der zur Verfügung stehenden Operatoren

- Diese werden in Bereich 'C' eingetragen und können dortparametrisiert werden

• Suggestions

- Alternatives: Zeigt Alternativen zu dem in 'C'ausgewählten Operator

• See also

- Verweist auf Operatoren, die mit den in 'C' angezeigtenin Beziehung stehen

- Beispielsweise wird bei einem angezeigten Filteroperatorauf die Faltung verwiesen

- Predeccesor: Mögliche Operatoren, die sich als Vorgängerfür den angezeigten Operator anbieten

17

••

- Wenn die Erosion angezeigt wird, wirdbeispielsweise auf die Schwellwert-Operation verwiesen

- Successor: Mögliche Operatoren, die sich als Nachfolgerfür den angezeigten Operator anbieten

- Wenn der Mittelwertfilter angezeigt wird, wirdbeispielsweise auf den Schwellwert-Operator verwiesen

- Keywords: Hier sind Schlüsselwörter in alphabetischerReihenfolge aufgelistet und können selektiert werden

- Bei der Selektion werden dann zugehörige Operatorenangezeigt

18

••

• Bereich C

- Dient zur Eingabe von HDevelop-Operatoren

- Selektion erfolgt im Feld 'Operator'

- Wenn der Name des Operators komplett bekannt ist, kanndieser durch Editierung von 'Operator' eingegeben werden

- Ist der Name des Operators nicht komplett bekannt,können Zeichenketten eingegeben werden

- Durch Betätigen des Pop-Up Menüs werden dann alle inHDevelop vorkommenden Operatoren angezeigt, dessen Namedie eingegebene Zeichenkette beinhaltet

- Mit Return wird dann der Operator ausgewählt

- Es werden Felder angezeigt, in denen die Parameter desOperators editiert werden können

19

••

- Wird 'Ok' betätigt, so wird der Operator an die Stelleim HDevelop Programm eingefügt, wo sich derEinfügemarker aktuell befindet und der Operator wirdsofort ausgeführt

- 'Enter' hat denselben Effekt wie 'Ok', allerdingsunterbleibt die sofortige Ausführung des Operators

- Mit 'Apply' kann die aktuelle Parameterbelegung getestetwerden

- Beispielsweise wird das Ergebnis, welches sich durch dieAnwendung des Operators ergibt, im Grafikfensterangezeigt

- Mit 'Cancel' werden die eingetragenen Parameterwertewieder gelöscht

- Mit 'Help' wird der Standardbrowser (z. B. NetscapeNavigator) geöffnet und die Erläuterung zum selektiertenOperator im Browser angezeigt

20

••

21

••

• Variablenüberwachung

- Im Bereich 'Iconic Variables' werden grafische Variablenangezeigt

- Dies können auch Arrays sein, welche mehrere Regionenbeinhalten

- Doppelklick auf eine 'Iconic Variable' bewirkt derenAnzeigen im Grafikfenster

- Im Bereich 'Control Variables' werden die in HDevelopverwendeten Steuervariablen mit Ihrer aktuellenBelegung angezeigt

- Doppelklick auf eine 'Control Variable' zeigt diesevergrößert in einem eigenen Fenster an

22

••

Ein erstes Beispiel in HDevelop

• Es soll die Anzahl der Büroklammern in einem Bild ermitteltwerden

• Dieses Bild kann von unserem Unix-Server über folgenden Pfadgeladen werden:

- /usr/images/industry/clip.tiff

• In HDevelop wird ein Bild mit dem Operator read_imageeingelesen

- read_image (Clip, 'clip.tif')

read_image ( : Image : FileName : )

- Einlesen eines Bildes vom Massenspeicher

- Das Eingangsbild wird in 'Image' geliefert

- Das Einlesen von nicht HALCON-Format Bildern wie 'tiff'ist auch möglich

23

••

- Dies erfolgt über 'FileName'

- Hier kann auch der Dateipfad angegeben werden

- HALCON sucht Dateien im aktuellen Verzeichnis

- Darüber hinaus kann mit der UmgebungsvariablenHALCONIMAGES ein zu durchsuchender Pfad angegeben werden

- Beispiel für das Setzen von HALCONIMAGES unter UNIX:

setenv HALCONIMAGES /usr/local/images

24

• Anschließend werden die Attribute des Eingangsbildes ermittelt

- get_image_pointer1(Clip,_,_,Width,Height)get_image_pointer1(Image : : : Pointer, Type, Width,Height)

- Liefert einen Pointer auf den ersten Kanal desEingabebildes 'Image' (also beispielsweise wird beieinem RGB Bild ein Pointer auf den Rotkanalgeliefert)

- Als weitere Informationen erhält man Bildtyp, Breite undHöhe des übergebenen Bildes in 'Type', 'Width' und'Height' geliefert

25

• Öffnen eines Grafikfensters

- dev_open_window

(0,0,0.5*Width,0.5*Height,'black',WindowID)

dev_open_window(: : Row, Column, Width, Height,Background : WindowHandle)

- Öffnen eines neuen Fensters

- Der 'Background' des Fensters ist per Voreinstellungauf 'schwarz' gesetzt

- Der Ursprung des Koordinatensystems (0,0) beginntin der oberen linken Ecke des Fensters.

- 'Row' gibt den Zeilenindex der oberen linken Ecke an.Dieser ist per Voreinstellung auf 0 gesetzt

26

- 'Column' spezifiziert den Spaltenindex der oberen linkenEcke und ist ebenfalls per Voreinstellung auf 0 gesetzt

- Der Zeilenindex Height erhöht sich von der linken oberenEcke des Fensters zur linken unteren Ecke des Fensters

- Der Spaltenindex Width erhöht sich von der linken oberenEcke des Fensters zur rechten oberen Ecke des Fensters

- HALCON liefert die logische Nummer des zu öffnendenFensters in 'WindowHandle'

27

• dev_display(Clip)

dev_display(Object : : :)

- Anzeigen eines HALCON Objekts im aktiven Grafikfenster

28

29

• mean_image(Clip, Clip_Mean, 15, 15)

mean_image(Image : ImageMean : MaskWidth, MaskHeight :)

- Dem Parameter 'Image' wird das zu glättende (ggf.mehrkanalige) Bild übergeben

- Die Filter-Matrix besteht aus Einsen,welche alle mit demselben Gewicht berücksichtigtwerden.

- 'MaskWidth' gibt die Breite der Filtermatrix anund 'MaskHeight' die Höhe

- Das Ergebnis der Glättung wird in 'ImageMean'geliefert

30

31

• threshold (Clip_Mean, Threshold, 0, 90)

threshold (Image : Region : MinGray, MaxGray :)

- Auswahl von Grauwerten welche sich innerhalb desIntervalls mit der unteren Grenze 'MinGray' und deroberen Grenze 'MaxGray' befinden

- Anwendung des Schwellwertoperators auf 'Image'liefert dann das Binärbild 'Region'

32

33

• fill_up_shape (Threshold, FillUp, 'area' ,1 , 100)

fill_up_shape( Region : RegionFillUp : Feature, Min, Max :)

- Es werden Löcher in 'Region' aufgefüllt

- Des Ergebnis wird in 'RegionFillUp' geliefert

- Mit Feature wird festgelegt, welches Merkmal dasauszufüllende Loch aufweisen muss

- Als Merkmal kann beispielsweise 'area' oder'compactness' angegeben werden

- Mit 'Min' und 'Max' wird die Untergrenze undObergrenze für das Merkmal angegeben

34

• erosion_circle (FillUp, Erosion, 1.5)

erosion_circle (Region : RegionErosion : Radius :)

- Es wird die Erosion an einer Region mit einemkreisförmigen strukturierenden Element durchgeführt

- Der Radius des kreisförmigen Elements wird mit dementsprechenden Eingabeparameter festgelegt

- Das Ergebnis der Erosion ergibt sich aus einer MinkowskiSubtraktion und wird in 'RegionErosion' geliefert

- Objekte, die kleiner als das strukturierende Elementsind, existieren im Ergebnis nicht mehr

35

36

• dilation_circle (Erosion, Dilation, 3.5)

dilation_cirlce (Region : RegionDilation : Radius :)

- 'Region' wird mit einem kreisförmigen strukturierendenElement bearbeitet

- Die Größe des kreisförmigen Elements wird analog wie beierosion_circle mit 'Radius' festgelegt

- Das Ergebnis der Minkowski Addition wird in'RegionDilation' gespeichert

- Durch Anwendung der Dilatation werden auch diejenigenLöcher aufgefüllt, welche kleiner als dasstrukturierende Element sind

37

38

• connection (Dilation, Connection)

connection (Region : ConnectedRegions : :)

- Es werden zusammengehörige Komponenten in 'Region'ermittelt

- Jede ermittelte zusammengehörige Komponente bildet in'ConnectedRegions' eine eigene Region, so dass es sichbei 'ConnectedRegions' um ein Array handelt

- Mit dem Operator 'union1' kann 'connection' wiederaufgehoben werden

39

40

• select_shape (Connection, SelectedRegions, 'width', 'and', 50,300)

- select_shape(Regions : SelectedRegions : Features,Operation, Min, Max:)

- Auswahl von Regionen, welche den spezifiziertenGebildemerkmalen entsprechen

- Hier einige Beispiele für mögliche Gebildemerkmale:

- Mit 'area' werden Flächen ausgewählt

- 'height' bezieht sich auf die Gebildehöhe

- 'width' analog zu 'height' auf die Breite

- 'compactness' verwendet als Auswahlkriterium dieKompaktheit des Gebildes

- 'compactness' wird mit folgender Formelermittelt:

41

πFLC

4²=

- L ist die Gebildelänge

- F ist die Gebildefläche

- C ist der Gebildefaktor und hat beieinem Kreis den Wert 1

- Sofern die Region Löcher hat, ist C> 1

- Mit 'Min' und 'Max' wird die Unter- bzw. Obergrenze desjeweils ausgewählten Gebildemerkmals festgelegt

42

• count_obj(SelectedRegions, Number)

count_obj (Objects : : : Number)

- Übergabe einer Menge von Objekten im Array 'Objects'

- Anzahl der Objekte im Array wird ermittelt und mit'Number' geliefert

43

• dev_clear_window()

dev_clear_window(: : :)

- Es werden die Einträge im aktiven Fenster gelöscht

• stop()

- stop (: : :)

- Unterbricht die Programmausführung

- Bei Wiederinbetriebnahme des Programms wird mit derAnweisung fortgefahren, welche auf stop() folgt

44

• dev_close_window()

dev_close_window(: : :)

- Das aktive Grafikfenster wird geschlossen

45

Steuerung des Programmablaufs in HDevelop• Zuweisen von Werten an Variablen mit assign

assign (: : Input :Result)

- Der Ausdruck 'Input' wird ausgewertet und an 'Result'zugewiesen

Beispiel:

- assign(a+b,c)

- Die Anzeige in HDevelop erfolgt ähnlich wie in anderenProgrammiersprachen:

c := a + b

- In den Bildverarbeitungsoperatoren können anstelle vonKonstanten als Parameter auch Variablen verwendet werden

46

Programmverzweigungen mit ifelse bzw. if

- if (: : Condition : )

- 'Condition' wird auf 'true' überprüft

- Trifft zu sofern 'Condition' ≠ 0

- Sofern die Auswertung von 'Condition' 'true'ergibt, werden die Anweisungen im if Teildurchlaufen

- ifelse (: : Condition : )

- Ausführungen zur if Anweisung gelten analog

- Zusätzlich gibt es einen else Teil

- Dieser wird durchlaufen, wenn die Auswertung von'Condition' 'false' ergibt

47

••

HALCON/C++

48

••

Vorgehensweise beim Kompilierenvon HALCON/C++ Dateien• Einbinden des HALCON Include-Files mit dem Befehl

#include "HalconCpp.h"

in das zu kompilierende HALCON/C++ Programm

• Setzen der Umgebungsvariablen HALCONROOT mit

setenv HALCONROOT /usr/local/halcon

• Kopieren von makefile in

/usr/local/lehrstuhl/halcon/examples/cpp/

in das Verzeichnis, in welches sich auch die zu kompilierende

HALCON/C++ Datei befindet

49

••

• Beispiel zum Kopieren von makefile ins eigene Verzeichnis

• $ cp /usr/local/lehrstuhl/halcon/examples/cpp/makefile [Blank]/usr/stud/mayer/halcon/makefile

• Das Dollarzeichen repräsentiert den Systemprompt

• Editieren des Makefiles beispielsweise mit dem grafischenEditor xemacs

• Hier ein Beispielaufruf von der Kommandozeile

$ xemacs /usr/stud/mayer/halcon/makefile &

• Damit wird makefile im xemacs im Hintergrund geladen

• Wenn xemacs aus dem Verzeichnis aufgerufen wird, in dem sichdie zu editierende Datei befindet, braucht der Pfad nichtangegeben werden

• In diesem Fall ist es hinreichend, wenn als Argument lediglichder Dateiname eingegeben wird

50

••

• Im makefile ist die folgende Zeile zu editieren

TEST_PROG = example1

• Anstelle von example1 ist der Name des zu kompilierendenHALCON/C++ Files anzugeben

• Die Endung .cpp wird nicht eingegeben

• Damit die Kompilierung erfolgreich durchgeführt werden kann,ist die Datei make.$(ARCHITECTURE) ebenfalls in das Verzeichniszu kopieren, in welcher sich die zu kompilierende Datei befindet

• Die Belegung der Umgebungsvariablen ARCHITECTURE hängt von derverwendeten Plattform ab

• Unter Linux ist ARCHITECTURE wie folgt zu setzen

setenv ARCHTITECTURE i486-unknown-linux2.0.0

• Wird die Plattform Sun verwendet ist eine andere Belegung fürARCHITECTURE erforderlich:

51

••

setenv ARCHITECTURE sparc-sun-solaris2.5

• Schließlich noch die Belegung für HP-Rechner

setenv ARCHITECTURE hppa1.1-hp-hpux10

• Natürlich besteht auch die Möglichkeit remote zu kompilieren

• Hier wird bespielsweise eine Verbindung zu einem Sun-Rechnerhergestellt

$ rlogin sunradig12.informatik.tu-muenchen.de

52

••

• Herror ::read_image(Hobject *Image, const Htuple &FileName)

- Einlesen eines Bildes vom Massenspeicher

- Das Eingangsbild wird in 'Image' geliefert

- Das Einlesen von nicht HALCON-Format Bildern wie 'tiff'ist auch möglich

- Dies erfolgt über 'FileName'

- Hier kann auch der Dateipfad angegeben werden

- HALCON sucht Dateien im aktuellen Verzeichnis

- Darüber hinaus kann mit der UmgebungsvariablenHALCONIMAGES ein zu durchsuchender Pfad angegeben werden

- Beispiel für das Setzen von HALCONIMAGES unter UNIX:

setenv HALCONIMAGES "/usr/local/images"

53

••

• Herror ::get_image_pointer1 (Hobject Image, long *Pointer,char* Type, long* Width, long *Height)

- Liefert einen Pointer auf den ersten Kanal desEingabebildes (also beispielsweise bei einem RGB Bild wirdein Pointer auf den Rotkanal geliefert)

- Als weitere Informationen erhält man die Höhe, Breiteund den Bildtyp des übergebenen Bildes

54

••

• Herror set_window_attr(const HTuple &AttributeName, constHTuple & AttributeValue)

- Belegen der Attribute eines Fensters

- Z.B. kann die Hintergrundfarbe auf 'schwarz' gesetztwerden

• Herror ::open_window(const HTuple &Row, const HTuple &Column,const HTuple &Width, const HTuple &Height, const HTuple&FatherWindow, const HTuple &Mode, const HTuple &Machine, long*WindowHandle)

- Öffnen eines neuen Fensters

- Der Hintergrund des Fensters ist per Voreinstellung auf'schwarz' gesetzt

- Der Fensterrand ist weiß und hat eine Breite von 2 Pixel

55

••

- Der Ursprung des Koordinatensystems (0,0) beginntin der oberen linken Ecke des Fensters.

- Der Zeilenindex erhöht sich von der linken oberen Eckedes Fensters zur linken unteren Ecke des Fensters undnimmt maximal den Wert Height-1 an

- Der Spaltenindex erhöht sich von der linken oberen Eckedes Fensters zur rechten oberen Ecke des Fensters undnimmt maximal den Wert Width-1 an.

- Mit dem Parameter 'Machine' wird der Name des Computersangegeben, auf dem das Fenster geöffnet werden soll

- Sofern an 'Machine' ein leerer String übergeben wird,verwendet HALCON den in der Umgebungsvariablen 'DISPLAY'gesetzten Wert

- Der Parameter 'Mode' setzt den Fenstermodus (z.B.'visible', 'invisible')

56

••

- 'Row' gibt den Zeilenindex der oberen linken Ecke an.Dieser ist per Voreinstellung auf 0 gesetzt

- 'Column' spezifiziert den Spaltenindex der oberen linkenEcke und ist ebenfalls per Voreinstellung auf 0 gesetzt

- Mit 'FatherWindow' wird ein in der Hierarchievorangehendes Fenster über seine logische Nummer(WindowHandle) angegeben

- Sofern das zu öffnende Fenster die Wurzel sein soll,kann 0 oder 'root' angegeben werden

- HALCON liefert die logische Nummer des zu öffnendenFensters in 'WindowHandle'

• Herror ::close_window (const HTuple &WindowHandle)

- Es wird dasjenige Ausgabefenster geschlossen, dessenlogische Nummer 'WindowHandle' entspricht

57

••

• Herror ::disp_obj(Hobject Object, const HTuple &WindowHandle)- Anzeigen eines HALCON Objekts im Ausgabefenstermit der logischen Nummer 'WindowHandle‚

• Herror ::clear_window(const HTuple &WindowHandle)

- Es werden die Einträge im Fenster mit der logischenNummer 'WindowHandle' gelöscht

58

••

• Digitale Darstellung von Bildern mit zweidimensionalen Arrays:

1346201465191823112743

-An die Stelle I(X,Y) wird der jeweilige Grauwert desBildes eingetragen

- Bei einkanaligen Grauwertbildern liegen die Werte vonI(X,Y) meistens im Intervall [0;255]

- Schwarze Punkte haben den Grauwert 0

- Weiße Punkte den Grauwert 255

I(X,Y)

X = 1,2...,M (Zeilen)

Y = 1,2,...,N (Spalten)

59

••

-Bei mehrkanaligen Bildern, wie beispielsweise den RGBBildern setzt sich der Farbwert aus drei Grauwertenzusammen

-Binärbilder unterscheiden nur zwischen Bit gesetztoder nicht

- Beispielsweise kann man den Sachverhalt 'Bit gesetzt(1)' durch ein weißes Pixel darstellen und 'Bit nichtgesetzt (0)' durch ein schwarzes Pixel

60

••

• Faltung:

- Homogene Operation, der eine lineare Verknüpfungzugrunde liegt

- Homogene Operation:

- Verknüpfungsoperation

- verwendet für das gesamte Bild denselbenAlgorithmus

61

••• Beispiel:

- Auf die Matrix I wird der Filter F angewendet

- Die Einträge in E ergeben sich indem F über Igeschoben wird

- Dabei wird in jeder möglichen Position von F derEintrag von F mit dem jeweils darunter liegendenEintrag von I multipliziert. Alle sich ergebendenWerte werden dann für jede mögliche Position von Faddiert und an die Stelle in E geschrieben, welche zumZeitpunkt der jeweiligen Position von F mit dermittleren Stelle von F identisch ist

1346201465191823112743

111111111

71667150

I FE

62

••• Hier die allgemeine Gleichung für die diskrete Faltung:

� �+

−=

+

−=

+−−=k

ki

l

ljcjyixIjiFcyxE 01 ),(),(),(

• C0 und C1 sind Konstanten, um im Bereich zwischen 0 und 255 zubleiben

• F(i,j) ist die Filtermatrix und wird auch als Maskebezeichnet

• F hat (2k+1) Zeilen und (2l+1) Spalten

• Damit der Bezugspunk in der Mitte eindeutig bestimmt werdenkann, muss die Matrixgröße ungerade sein

• Die Randpunkte können im Ergebnis weggelassen werden

• Es entsteht dann ein Rand der Größe k bei einer Filtergrößevon (2k+1) x (2k+1)

63

••

• Bei der im Beispiel verwendeten Maske F handelt es sich umeinen ungewichteten Mittelwertfilter

• c1 muß mit 1/10 initialisiert werden, um im diskreten Bereichzu bleiben

• Es wird somit der mittlere Grauwert aus den jeweilsbenachbarten Pixeln ermittelt

64

••

• Herror ::mean_image(Hobject Image, Hobject *ImageMean, constHTuple &MaskWidth, const HTuple &MaskHeight)

- Dem Parameter 'Image' wird das zu glättende (ggf.mehrkanalige) Bild übergeben

- Die Filter-Matrix besteht aus Einsen,welche alle mit demselben Gewicht berücksichtigtwerden.

- 'MaskWidth' gibt die Breite der Filtermatrix anund 'MaskHeight' die Höhe

- Das Ergebnis der Glättung wird in 'ImageMean'geliefert

65

••

• Originalbild Mittelwertgefiltertes BildMaskengröße: 15x15

66

••

• Anwendung der ersten und zweiten Ableitung auf ein Bild:

I x yI x y

xx' ( , )( , )

=∂

∂I x y

I x yyy' ( , )

( , )=

∂∂

• Diskrete Gradienten in X und Y Richtung:

∂∂

I x yx

I x yI x y I x x y

xx

( , )( , )

( , ) ( , )≈ =

− −∆

∆∆

∂∂

I x yy

I x yI x y I x y y

yy

( , )( , )

( , ) ( , )≈ =

− −∆

∆∆

67

••

• Hier die diskreten Ableitungen für ∆x = 1 und ∆y = 1:

∆x I x y I x y I x y( , ) ( , ) ( , )= − −1 ∆ y I x y I x y I x y( , ) ( , ) ( , )= − −1

• Für diese diskreten Ableitungen gelten die folgendenFaltungsmatrizen:

11−=yF11−

=xF

68

••

• Beide Faltungsmatrizen ergänzt mit einem mittleren Bezugspunkt:

101 −=yF1

01

−=xF

• Um ein Gradientenbild zu erhalten, muss man für jeden Bildpunktzwei Gradientenwerte Berechnen und diese nach einerRechenvorschrift wie beispielsweise dem Betrag derRichtungsdifferenz zusammenfassen:

2),(),(

),(yxIyxI

yxD yxA

∆+∆=

69

••

• Um eine Glättung von gestörten Bildsignalen zu erreichen,verwendet man Filtermatrizen der Größe 3x3 und mehr, wiebeispielsweise den Sobel-Operator :

101202101

−−−

=SyF121

000121

−−−=SxF

70

••

• Herror ::detect_edge_segments (Hobject Image, const HTuple&SobelSize, const HTuple &MinAmplitude, const HTuple&MaxDistance, const HTuple &MinLength, HTuple *BeginRow, HTuple*BeginCol, HTuple *EndRow, Htuple *EndCol)

- Es werden mit diesem Operator gerade Kantenelemente in'Image' gefunden

- Die Beschreibung der gefundenen Kanten erfolgt über dieStartkoordinaten 'BeginRow' und 'BeginCol' und dieEndkoordinaten 'EndRow' und 'EndCol'

- Die Kantenermittlung arbeitet mit dem Sobelfilter

- Die Größe der Sobel-Filtermatrix wird mit 'SobelSize'gesteuert

- Als Rechenvorschrift wird 'Betrag derRichtungsdifferenz' verwendet

71

••

- Mit 'MaxDistance' wird festgelegt, wie groß die Distanzin Pixel zwischen der approximierenden Linie und demjeweils betrachteten zugehörigen Kantenpunkt höchstenssein darf

- Mit 'MinLength' wird die minimale Länge der zuermittelnden Linien festgelegt

- 'MinAmplitude' legt fest, daß lediglich diejenigen Pixelins Endergebnis aufgenommen werden können, derenFilterantwort größer als 'MinAmplitude' ist

- somit werden bei einem hohen Wert von 'MinAmplitude' nurdiejenigen Kanten ermittelt, die eine entsprechend hoheGrauwertänderung im Bezug auf ihre direkte Umgebungaufweisen

- Wenn mehr als eine Kante ermittelt wird, erfolgt dieLieferung aller Kantendaten in Arrays

72

••

Anwendung des Sobelfilters mit Maskengröße 9x9 und derRechenvorschrift 'Betrag der Richtungsdifferenz'

73

••

• Herror ::line_orientation(const HTuple &RowBegin, const HTuple&ColBegin, const HTuple &RowEnd, const HTuple &ColEnd, HTuple*Phi)

- Liefert die Richtung der übergebenen Kanten in Phi (-π/2<Phi≤π/2)

- Messung der Richtung in Bogenmaß

- Es können auch Arrays übergeben werden

- Bei Übergabe mehrerer Kanten wird das Ergebnis in einemArray geliefert

74

••

• Herror ::gen_empty_region (Hobject* EmptyRegion)

- Erzeugung einer leeren Region, die keine Pixelbeinhaltet

• Herror ::distance_pp(const HTuple &Row1, const HTuple &Column1,const Htuple &Row2, const HTuple &Column2, HTuple *Dist)

- Ermittlung der Entfernung zwischen Punktepaaren mit derfolgenden Formel:

)²Column(Column)²Row(RowDist 2121 −+−=

75

••

• Herror ::gen_rectangle2(Hobject *Rectangle, const HTuple &Row,const HTuple &Column, const HTuple &Phi, const HTuple &Length1,const HTuple &Length2)

- Erzeugung eines Rechtecks mit Zentrum ('Row', 'Column')

- 'Phi' bestimmt die Orientierung des Rechtecks

- 'Length1' und 'Length2' legen die halbe Breite bzw.halbe Höhe des Rechtecks fest

- Bei 'Phi' handelt es sich um den Winkel zwischen'Length1' und der horizontalen Achse gemessen in Bogenmaß

- Die obere rechte Ecke des Rechtecks repräsentiert denUrsprung (0,0) des Koordinatensystems

76

••

Mathematische Morphologie bei Binärbildern

XIE +=

Grundoperationen:

• Dilatation

• X ist ein strukturierendes Element

• Die Dilatation wird auch als Minkowski-Addition bezeichnet

77

••

• Erosion

XIE −=

78

••

• Dem strukturierenden Element ist ein Bezugspunkt zugeordnet

• Dieser kann innerhalb oder außerhalb des strukturierendenElements liegen

• Bei der Dilatation wird jeder Bildpunkt des Bildes B auf dieGröße des strukturierenden Elements XD transformiert

• Bei der Erosion werden alle Punktegruppen in denen dasstrukturierende Element voll enthalten ist,auf den Bezugspunktvon X transformiert

79

••

• Vereinigungsmenge

E = IA ∪ IB

• Entspricht dem logischen OR

• Schnittmenge

E = IA ∩ IB

• entspricht dem logischen AND

• Mengendifferenz

E = IA / IB

• entspricht dem logischen EXOR

80

••

Einzelobjektverarbeitung im Binärbild• Objekttrennung durch Grassfire (Steppenbrand)

• Getrennte Objekte werden in eine eigene Region geschrieben

• Die Koordinaten mindestens eines Objektpunkts IZ(x,y) müssenbekannt sein und bilden den Zündpunkt

• Von diesem Punkt aus wird jeder Punkt des Objekts stufenweiseerfasst

• Es erfolgt eine Dilatierung mit der Objektraute

• Anschließend wird eine logische AND-Operation ausgeführt, sodass die über den Rand hinausragenden Markierungspunkte imdilatierten Bild abgeschnitten werden

81

••

• Herror ::concat_obj(Hobject Object1, Hobject Object2, Hobject*ObjectConcat)

- Der Operator bekommt zwei HALCON Objekte (Object1,Object2 übergeben

- Bei den Objekten handelt es sich um Arrays, welchejeweils mehrere Bildobjekte enthalten können

- Diese Bildobjekte werden nun alle in ObjectConcatzusammengefasst

- Jedes Bildobjekt bildet in 'ObjectConcat' eine eigeneRegion

82

••• Ein Beispiel für ein Bild, welches mehrere Regionenbeinhaltet

• Bei den Regionen handelt es sich um gerade Kanten, welchedurch unterschiedliche Farben kenntlich gemacht sind

• Zur Veranschaulichung ist das Originalbild dahinter gelegt

83

••

Herror ::union1 (Hobject Region, Hobject *RegionUnion)

- Übergabe eines HALCON Objects, 'Region', welches ineinem Array mehrere Regionen beinhalten kann

- Diese Regionen werden in 'RegionUnion' verschmolzen

Herror ::fill_up_shape(Hobject Region, Hobject *RegionFillUp,const HTuple &Feature, const HTuple &Min, const HTuple &Max)

- Es werden Löcher in 'Region' aufgefüllt

- Des Ergebnis wird in 'RegionFillUp' geliefert

- Mit Feature wird festgelegt, welches Merkmal dasauszufüllende Loch aufweisen muss

84

••- Als Merkmal kann beispielsweise 'area' oder'compactness' angegeben werden

- Mit 'Min' und 'Max' wird die Untergrenze undObergrenze für das Merkmal angegeben

85

••• Auffüllung von Löchern deren Fläche zwischen 1 und 100 Pixelnbeträgt

86

••

Herror ::erosion_circle (Hobject Region, Hobject *RegionErosion,const HTuple &Radius)

- Es wird die Erosion an einer Region mit einemkreisförmigen strukturierenden Element durchgeführt

- Der Radius des kreisförmigen Elements wird mit dementsprechenden Eingabeparameter festgelegt

- Das Ergebnis der Erosion ergibt sich aus einer MinkowskiSubtraktion und wird in 'RegionErosion' geliefert

- Objekte, die kleiner als das strukturierende Elementsind, existieren im Ergebnis nicht mehr

87

••

• Erosion mit einem kreisförmigen strukturierenden Element mitRadius 2.5

88

••

• Herror ::dilation_circle (Hobject Region, Hobject*RegionDilation, const HTuple &Radius)

- 'Region' wird mit einem kreisförmigen strukturierendenElement bearbeitet

- Die Größe des kreisförmigen Elements wird analog wie beierosion_circle mit 'Radius' festgelegt

- Das Ergebnis der Minkowski Addition wird in'RegionDilation' gespeichert

- Durch Anwendung der Dilatation werden auch diejenigenLöcher aufgefüllt, welche kleiner als dasstrukturierende Element sind

89

••

• Dilatation mit einem kreisförmigen Gebilde und Radius 3.5

90

••

• Herror ::connection(Hobject Region, Hobject* ConnectedRegions)

- Es werden zusammengehörige Komponenten in 'Region'ermittelt

- Jede ermittelte zusammengehörige Komponente bildet in'ConnectedRegions' eine eigene Region, so dass es sichbei 'ConnectedRegions' um ein Array handelt

- Mit dem Operator 'union1' kann 'connection' wiederaufgehoben werden

91

••

• Ermittlung von zusammengehörigen Regionen

• Diese werden in eine eigene Region geschrieben

• Die Regionen sind durch die unterschiedliche Verwendung vonFarben kenntlich gemacht worden

92

••

• Herror ::select_shape(Hobject Regions, Hobject*SelectedRegions, const HTuple &Features, const HTuple&Operation, const HTuple &Min, const HTuple &Max)

- Auswahl von Regionen, welche den spezifiziertenGebildemerkmalen entsprechen

- Hier einige Beispiele für mögliche Gebildemerkmale:

- Mit 'area' werden Flächen ausgewählt

- 'height' bezieht sich auf die Gebildehöhe

93

••

- 'width' analog zu 'height' auf die Breite

- 'compactness' verwendet als Auswahlkriterium dieKompaktheit des Gebildes

- 'compactness' wird mit folgender Formelermittelt:

πFLC

4²=

- L ist die Gebildelänge

- F ist die Gebildefläche

- C ist der Gebildefaktor und hat beieinem Kreis den Wert 1

- Sofern die Region Löcher hat, ist C> 1

94

••- Mit 'Min' und 'Max' wird die Unter- bzw. Obergrenze desjeweils ausgewählten Gebildemerkmals festgelegt

95

••

• Auswahl von Gebilden deren Fläche zwischen 1 und 1000 Pixelgroß ist

96

••

• Auswahl von Gebilden deren Kompaktheit zwischen 1 und 2 beträgt

97

••

• Auswahl von Gebilden deren Höhe zwischen 25 und 30 Pixelnbeträgt

98

••

• Herror ::smallest_rectangle1(Hobject Regions, long* Row1, long*Column1, long* Row2, long* Column2)

- Ermittlung eines umgebenden Rechtecks für jede Region

- 'Regions' ist ein Array und kann mehrere Regionenbeinhalten

- Mit 'Row1' und 'Column1' werden die Koordinaten deroberen linken Ecke des Rechtecks beschrieben

- Mit 'Row2' und 'Column2' entsprechend die Koordinatender unteren rechten Ecke

• Herror ::reduce_domain(Hobject Image, Hobject Region, Hobject*ImageReduced)

- Bildet die Schnittmenge von 'Image' und 'Region'

- Als Ergebnis wird ein neuer Definitionsbereichfestgelegt

99

••

- Bei dem Ergebnis kann es sich um eine Untermenge von'Region' handeln

100

••

• Reduktion des Originalbildes auf die Fläche, welche durchdas zuletzt segmentierte einzelne Objekt repräsentiert wird

101

••

Affine Transformationen• Veränderung der Ortskoordinaten

• Durchführung von Normierungen

• Translation (Verschiebung von Regionen)

• Skalierung (Größenänderungen von Regionen)

• Rotation (Drehung von Regionen)

• Bei der Translation und orthogonalen Drehungen bleibt derPixelzusammenhang erhalten

• Bei Drehungen um beliebige Winkel und Skalierungen soll eineInterpolierung durchgeführt werden

• z.B. bilineare Interpolation:

)1,1(),1()1,(),()','(' 4321 +++++++= yxIgyxIgyxIgyxIgyxI

102

••• Verwendung von Transformationsmatrizen

• Darstellung der Bildpunkte I und I‘ in homogenen Koordinaten

• I repräsentiert die Koordinaten des Ursprungsbildes

• I‘ diejenigen Koordinaten welche durch affine Transformationentstanden sind

���

���

=1yx

I���

���

=1

''

' yx

I

• Affine Transformation liefert die neuen Koordinaten ausLinearkombination der ursprünglichen Werte mit denKoeffizienten der Transformationsmatrix

103

••

• Bei der Translation hat der Ursprung im ursprünglichenKoordinatensystem in transformierten Koordinatensystem dieKoordinaten (-tx, -ty)

• Die Berechnung der neuen Koordinaten erfolgt mit derfolgenden Transformationsmatrix:

���

���

−−

1001001

y

x

tt

• Keine Änderung des Ursprungs bei der Skalierung• Vergrößerung der Pixel mit Sx und Sy > 1• Verkleinerung mit Sx und Sy < 1

104

••

���

���

1000000

y

x

SS

• Bei der Rotation ändert sich weder Ursprung noch Skalierung• Es erfolgt eine Drehung der alten Achsen um den Winkel Θ gegenden Uhrzeiger

���

���

ΘΘ−ΘΘ

1000cossin0sincos

105

••

• Herror ::hom_mat2d_identity(HTuple *HomMat2dIdentity)

- erzeugt eine Transformationsmatrix

- Diese dient als als Grundlage für Translation, Rotation,und Skalierung

• Herror ::hom_mat2d_translate(const HTuple &HomMat2D, constHTuple &Tx, const Htuple &Ty, HTuple *HomMat2DTranslate)

- Die Transformationsmatrix wird mit Werten für dieTranslation ergänzt

- Die Translation entlang der X-Achse wird durch 'Tx'spezifiziert und entlang der Y-Achse mit 'Ty'

- Die Transformationsmatrix für die Translation wird in'HomMat2DTranslate' geliefert

106

••

• Herror ::affine_trans_image(Hobject Image, Hobject*ImageAffinTrans, const HTuple &HomMat2D, const HTuple&Interpolation, const HTuple &AdaptImageSize)

- Durchführung einer beliebigen affinen Transformation

- Verwendung der Transformationsmatrix 'HomMat2D'

- Bei Drehungen und Skalierungen sollte eine Interpolationdurchgeführt werden, um einen Treppeneffekt (Aliasing) zuvermeiden

- Wenn eine Interpolation nicht gewünscht ist, kann 'none'gewählt werden

- Mit 'AdaptImageSize' wird angegeben, ob die Bildgrößeverändert werden soll

- Dies kann mit 'true' festgelegt werden

- Ansonsten ist 'false' zu wählen

- 'AdaptImageSize' vermeidet Clipping

107

••

• Verschiebung des segmentierten Objekts zum Ursprung des Bildes

108

••#include "HalconCpp.h"#include <iostream.h>

class traffic_sign_recognition

{HTuple WindowID;

HTuple HRow1, HCol1, HRow2, HCol2, HPhi, Helements, HLength;HTuple Width, Height, HomMat2D;Hobject Image, Image_Mean, RSign, RTemp1, RSign2, RSign3;Hobject RSign4, RSign5, RSign6, RSign7, RSign8, RSign9;Hobject RSign10, Image_Reduced;void segmentation(int MEAN_VALUE_SEARCH);

public:void action (char file[]);

};

109

••

void traffic_sign_recognition::segmentation(intMEAN_VALUE_SEARCH)

{char proceed;::disp_obj(Image,WindowID);cout<<"Weiter mit <RETURN>\n";cin>>proceed;

if (MEAN_VALUE_SEARCH){::mean_image(Image,&Image_Mean,HTuple(15),HTuple(15));

::detect_edge_segments(Image_Mean,HTuple(3),HTuple(10),HTuple(7),HTuple(11),&HRow1,&HCol1,&HRow2,&HCol2);

}

110

••else

::detect_edge_segments(Image,HTuple(11),HTuple(10),HTuple(7),HTuple(11),&HRow1,&HCol1,&HRow2,&HCol2);

::line_orientation(HRow1,HCol1,HRow2,HCol2,&HPhi);::gen_empty_region(&RSign);Helements = HCol1.Num();::distance_pp(HRow1,HCol1,HRow2,HCol2,&HLength);HRow1 = (HRow1+HRow2)/2;HCol1 = (HCol1+HCol2)/2;

for (int i=0; HTuple(i)<=Helements-1; i+=1){

::gen_rectangle2(&RTemp1,HTuple(HRow1[i]),HTuple(HCol1[i]),HTuple(HPhi[i]),HTuple(HLength[i]),HTuple(1));

::concat_obj(RSign,RTemp1,&RSign);}

::union1(RSign,&RSign2);

111

••::fill_up_shape(RSign2,&RSign3,HTuple("area"),HTuple(1),HTuple(100));::erosion_circle(RSign3,&RSign4,HTuple(2.5));::dilation_circle(RSign4,&RSign5,HTuple(3.5));::connection(RSign5,&RSign6);

::select_shape(RSign6,&RSign7,HTuple("area"),HTuple("and"),HTuple(1),HTuple(1000));

::select_shape(RSign7,&RSign8,HTuple("compactness"),HTuple("and"),HTuple(1),HTuple(2));

::select_shape(RSign8,&RSign9,HTuple("height"),HTuple("and"),HTuple(25),HTuple(30));

::select_shape(RSign9,&RSign10,HTuple("width"),HTuple("and"),HTuple(20),HTuple(40));::smallest_rectangle1(RSign10,&HRow1,&HCol1,&HRow2,&HCol2);

112

••

::disp_obj(RSign10,WindowID);cout<<"Weiter mit <RETURN>\n";cin>>proceed;

::clear_window(WindowID);::reduce_domain(Image,RSign10,&Image_Reduced);::hom_mat2d_identity(&HomMat2D);::hom_mat2d_translate(HomMat2D,HTuple(0)-HRow1,HTuple(0)-

HCol1,&HomMat2D);

::affine_trans_image(Image_Reduced,&Image_Reduced,HomMat2D,HTuple("constant"),HTuple("false"));

::disp_obj(Image_Reduced,WindowID);cout<<"Weiter mit <RETURN>\n";cin>>proceed;

}

113

••

void traffic_sign_recognition::action(char file [])

{Herror err = read_image(&Image,HTuple(file));if (err != H_MSG_TRUE)

{fprintf(stderr,"could not find image");exit(1);}

::get_image_pointer1(Image,_,_,&Width,&Height);::set_window_attr("background_color",HTuple("black"));

::open_window(HTuple(0),HTuple(0),HTuple(0.5)*Width,HTuple(0.5)*Height,0,"","",&WindowID);segmentation(0);close_window(WindowID);

}

114

••

int main(int argc, char *argv[])

{traffic_sign_recognition ts;ts.action(argv[1]);return 0;

}

115

••

• Herror ::access_channel(Hobject MultiChannelImage, Hobject*Image, const HTuple &Channel)

- Zugriff auf 'Channel' bei einem mehrkanaligen Bild

- Durchnumerierung der Kanäle von 1 bis n

- Der extrahierte Kanal wird dann in 'Image' geliefert

- Beispielsweise erfolgt der Zugriff auf den Blaukanal einesRGB-Bildes durch Initialisierung von 'Channel' mit 3

116

••

• Zugriff auf den Blaukanal eines RGB Bildes

• Helle Blauanteile entsprechen hohen Grauwerten und dunkleBlauanteile niedrigen Grauwerten

117

••

• Herror ::threshold(Hobject Image, Hobject *Region, const HTuple&MinGray, const HTuple &MaxGray)

- Auswahl von Grauwerten welche sich innerhalb desIntervalls mit der unteren Grenze 'MinGray' und der oberenGrenze 'MaxGray' befinden

- Anwendung des Schwellwertoperators auf 'Image' liefertdann das Binärbild 'Region'

118

••

• Anwendung des Schwellwertoperators auf den extrahiertenBlaukanal

• Auswahl von Grauwerten aus dem Intervall [120;170]

119

••

• Herror ::intersection (Hobject Region1, Hobject Region2, Hobject*RegionIntersection)

- Die Regionen, welche in 'Region1' enthalten sind, werdenmit den Regionen in 'Region2' geschnitten

- Jede Region in 'Region1' wird mit allen Regionen in'Region2' geschnitten

- Das Ergebnis wird in 'RegionIntersection' geliefert

120

••

• Herror ::zoom_image_size (Hobject Image, Hobject *ImageZoom,const HTuple &Width, const HTuple &Height, const HTuple&Interpolation)

- Skalierung von 'Image' in 'ImageZoom'

- Breite und Höhe des Ergebnisbildes werden mit 'Width' and'Height' festgelegt

- 'Interpolation' legt die Art der Interpolation fest,sofern gewünscht

121

••

#include "HalconCpp.h"

class channel

{protected:HTuple WindowID;Hobject Image, Rot, Gruen, Blau;enum farben {rot=1, gruen, blau};HTuple Width, Height;

public:virtual void show(char file[]);channel(char file[]);void get_win(char file[]);

};

122

••

channel::channel(char file[])

{get_win(file);

:}

void channel::get_win(char file[])

{Herror err = read_image(&Image,HTuple(file));

if (err != H_MSG_TRUE){fprintf(stderr,"could not find image"); exit(1);

}::get_image_pointer1(Image,_,_,&Width,&Height);::set_window_attr("background_color",HTuple("black"));

123

••

::open_window(HTuple(0),HTuple(0),HTuple(0.5)*Width,HTuple(0.5)*Height,0,"","",&WindowID);}

void channel::show(char file[]){

char proceed;get_win(file);

for (farben i=rot ; i<=blau; int(i)++){

124

••

switch(i){case rot:::access_channel(Image,&Rot,i);::disp_obj(Rot,WindowID);cout<<"Weiter mit beliebiger Eingabe und <RETURN>\n";cin>>proceed;

::

}

125

••}close_window(WindowID);

}

class channel_compound : public channel

{protected:Hobject Region_Rot, Region_Gruen, Region_Blau;Hobject RG_Intersection, RGB_Intersection;Hobject RegionFillUp, RegionErosion, SelectedRegions,

ConnectedRegions;Hobject RegionDilation, car;

public:channel_compound(char file[]);virtual void show(char file[]);void find();

};

126

••

channel_compound::channel_compound(char file[]): channel(file)

{show(file);

:}

void channel_compound::show(char file[]){char proceed;get_win(file);for (farben i=rot ; i<=blau; int(i)++){

127

••

switch(i){case rot:::threshold(Rot,&Region_Rot,HTuple(110),HTuple(170));::disp_obj(Region_Rot,WindowID);cout<<"Weiter mit beliebiger Eingabe und <RETURN>\n";cin>>proceed;break;

::

}

128

••}

}

void channel_compound::find()

{char proceed;

::intersection(Region_Rot,Region_Gruen,&RG_Intersection);::intersection(RG_Intersection,Region_Blau,&RGB_Intersection);

::fill_up_shape(RGB_Intersection,&RegionFillUp,HTuple("area"),HTuple(1),HTuple(100));::erosion_circle(RegionFillUp,&RegionErosion,HTuple(1.5));::dilation_circle(RegionErosion,&RegionDilation,HTuple(2.5));::connection(RegionDilation,&ConnectedRegions);

::select_shape(ConnectedRegions,&SelectedRegions,HTuple("width"),HTuple("and"),HTuple(16),HTuple(17));

129

••

::select_shape(SelectedRegions,&car,HTuple("height"),HTuple("and"),HTuple(9),HTuple(10));::clear_window(WindowID);::disp_obj(car,WindowID);cout<<"Weiter mit beliebiger Eingabe und <RETURN>\n";cin>>proceed;close_window(WindowID);

}

int main(int argc, char *argv[]){channel_compound com(argv[1]);return 0;

}

130

••

FouriertransformationFouriertransformation von Bildernvon Bildern

EindimensionaleEindimensionaleFouriertransformationFouriertransformation

•• Bilder I(x,y) mit den Bildkoordinaten x und y kBilder I(x,y) mit den Bildkoordinaten x und y köönnen innnen inBildfrequenzbilder S(Bildfrequenzbilder S(ffxx,, ffyy) mit den Bildfrequenzen) mit den Bildfrequenzen ffxx undund ffyytransformiert werdentransformiert werden

•• die Transformation vom Bildbereich (Zeitbereich, Ortsbereich)die Transformation vom Bildbereich (Zeitbereich, Ortsbereich)in den Frequenzbereich wirdin den Frequenzbereich wird FouriertransformationFouriertransformation genanntgenannt

131

••

Analyse eines periodischen Signals bAnalyse eines periodischen Signals b’’(x), das sich aus den(x), das sich aus denEinzelschwingungen bEinzelschwingungen b11(x), b(x), b22(x) und b(x) und b33(x) zusammensetzt(x) zusammensetzt

132

••

b(x) = eindimensionales Ortssignal

sinusförmige Helligkeitsverteilung

f(t) = Transformation durch Abtastung in ein zeitabhängigesSignal

b1(x) = Grundsignal einer Sinusschwingung

b2(x), b3(x),...,bn(x)

• b(x) = eindimensionales Ortssignal mit der Periodenlänge:

x00 f

1X =

• fx0 ist die Grundfrequenz

133

••

Signalkomponenten eines Rechtecksignals:

x)5fsin(251 (x)b

x)3fsin(231 (x)b

x)fsin(2(x)b

x03

x02

x01

π

π

π

=

=

=

134

••

• Addition der Grundschwingung b1(x) mit harmonischenOberschwingungen b2(x) und b3(x) ergibt das Summensignal b‘(x)

=++= )(3)(2)(1)(' xbxbxbxb

=−

3

1)0)12(2sin(

121

nxxfn

135

••

•Fourierreihe

001 01

/1,)12(2sin12

1)()( x

K

n

K

nn fX

Xxn

nxbxb =−

−== ��

==

π

• Approximation eines Rechtecksignals ohnePhasenverschiebung

∞→K

136

••

b(x) = b(x+kX0)• Beschreibung einer allgemein stückweise stetige periodischeFunktion durch eine Reihe von Sinus und Cosinus Gliedern

)2sin(0

xX

kπ )2cos(0

xX

137

••

•Berücksichtigung der Phasenverschiebung

dxX

kxbX

kxaaxbk

kk

k ��∞

=

=

++=11 0

0 )0

2sin()2cos(2

)( ππ

•Die Amplituden der Cosinus und Sinusfunktion sind dieFourierkoeffizienten:

dxX

kxxbX

ax

xk �

=2/

2/ 00

0

0

)2cos()(2 π

138

••

dxX

kxxbX

bx

xk �

=2/

2/ 00

0

0

)2sin()(2 π

• Bei bekannten Fourierkoeffizienten ist die Reiheb(x) definiert

Komplexe Schreibweise• Zum Vergleich der Fourierreihe mit der Fouriertransformation

�∞

−∞=

=k

xx

kj

k ecxb 0

2

)(π

139

••

• Bei den Koeffizienten ck handelt es sich i.a. umkomplexe Zahlen

kjkk ecc φ=

)(21

kkk jbac −=

}{2}{2 kkkk cbca ℑ−=ℜ=

140

••

Betrag Phase

k

kkkk a

bkbac arctan21 22 −=+= φ

•• KomplexeKomplexe FourierkoeffizientenFourierkoeffizienten::

dxexbX

cX

X

Xkj

k �−

−=

2/

2/

2

0

0

0

0)(1 π

141

••

Übergang auf das kontinuierliche Spektrum

• Mit der Fourieranalyse können nur periodische Signalebeschrieben werden

•Die Fouriertransformation eignet sich für beliebigenichtperiodische Signale

• Hierzu ist eine mathematische Umformungerforderlich

� �→

→=

xx

xxk

fkfX

kdffSc

00

)(

142

••

xxfj

x dfefSxb x�∞

∞−

= π2)()(

• Hierbei handelt es sich um die eindimensionale inverseFouriertransformation

• Aus dem Ortsfrequenzspektrum S(fx) wird die Ortsfunktion b(x)berechnet

• Die eindimensionale Fouriertransformation

dxexbfS xfjx

x�∞

∞−

−= π2)()(

143

••

Zweidimensionale kontinuierliche Zweidimensionale kontinuierliche FouriertransformationFouriertransformation

•• Es erfolgt eine Erweiterung um die beidenEs erfolgt eine Erweiterung um die beiden OrtskoordinatenOrtskoordinaten x undx undyy•• Aus derAus der OrtsfunktionOrtsfunktion I(x,y) wird dieI(x,y) wird die OrtsfrequenzfunktionOrtsfrequenzfunktionS(S(ffxx,, ffyy) berechnet) berechnet

•• Dies geschieht mit der zweidimensionalenDies geschieht mit der zweidimensionalen FouriertransformationFouriertransformation

•• FFüür die Rr die Rüücktransformation descktransformation des FourierbildesFourierbildes in denin den OrtsraumOrtsraumverwendet man dieverwendet man die inverseinverse zweidimensionalezweidimensionale FouriertransformationFouriertransformation

144

••

•• DerDer OrtsfrequenzbereichOrtsfrequenzbereich wird mit derwird mit der FouriertransformationFouriertransformationhergeleitethergeleitet

•• Bei einfachen Funktionen ist der Zusammenhang zwischen einemBei einfachen Funktionen ist der Zusammenhang zwischen einemSignal im Ortsbereich und imSignal im Ortsbereich und im OrtsfrequenzbereichOrtsfrequenzbereich aus Tabellen zuaus Tabellen zuentnehmenentnehmen

• Die zweidimensionale Fouriertransformation

� �∞

∞−

∞−

+−= dxdyeyxIffS yfxfjyx

yx )(2),(),( π

145

••

� �∞

∞−

∞−

+= yxyfxfj

yx dfdfeffSyxI yx )(2),(),( π

• Die Rücktransformation geschieht mit der inversenzweidimensionalen Fouriertransformation

• Die komplexe Ortsfrequenzfunktion

),(),(),( yx ffjyxyx effSffS φ=

146

••

mit

)}²,({)}²,({),( yxyxyx ffSffSffS ℑ+ℜ=

• Als Betrags- oder Amplitudenspektrum

147

••

• Beim Quadrat des Amplitudenspektrums handelt es sich um dasPowerspektrum

²),(),( yxyx ffSffP =

• Das Phasenspektrum

���

���

ℜℑ

=)},({)},({

arctan),(yx

yxyx ffS

ffSffφ

148

••

Darstellung von Bildern im Frequenzbereich•• Symbolische Darstellung fSymbolische Darstellung füür dier die FouriertransformationFouriertransformation

)},({),( yxIFffS yx =

)},({),( 1yx ffSFyxI −=

149

••

• Beim Bild im Ortsbereich ist der Koordinatenursprung links oben

• Dies entspricht der Abtastrichtung eines Bildes (z.B.Fernsehkamera)

• S(fx,fy) ist das Spektrum eines Bildes

• fx und fy sind die Ortsfrequenzen• Die physikalische Dimension der Ortsfrequenzen ist Linien/mmoder Bildpunkte/mm• Bei der höchsten auf einem Trägermedium darstellbarenOrtsfrequenz handelt es sich um die Auflösung

150

••

• Bei diskreten Bildsignalen handelt es sich um dieAbtastwerte einer kontinuierlichen Funktion

• Bei der Darstellung des zweidimensionalen Spektrums mussdas Abtasttheorem berücksichtigt werden:

fs = 2F

• fs ist die Abtastfrequenz• F ist die höchste Signalfrequenz oder Bandbreite• Bei gegebener fester Abtastfrequenz fs gilt:

2xs

xf

f =2

syy

ff =

151

••

• fsx ist die Grenzfrequenz in x Richtung

• fsy ist die Grenzfrequenz in y Richtung

• Normierung der Ortsfrequenzen auf die Abtastfrequenzen fsxin x Richtung und fsy in y Richtung liefert:

5.0≤sy

y

ff

5.0≤fsxfx

152

••

• Fourierbilder werden mit komplexen Funktionenbeschrieben

• Zur Darstellung verwendet man das Amplituden undPhasenbild

• Zur Beurteilung der Frequenzanteile reicht derAmplitudenanteil aus

• Der Phasenanteil beschreibt die relative Lage desObjekts zur Bildmitte

153

••

• Herror ::fft_image(Hobject Image, Hobject* ImageFFT)

- Transformation von Image in den Frequenzbereich

- Anwendung der schnellen Fouriertransformation, um dasfouriertransformierte Bild zu ermitteln

- Die Bildgröße muss quadratisch sein

- Die Werte der Eigenschaften 'Width' and 'Height' müsseneine Potenz von 2 sein

154

••

• Anwendung der schnellen Fouriertransformation auf ein Graubild,welches mit zoom_image_size auf die Größe 512x512 gebracht wurde

Ortsbild FouriertransformiertesBild

155

••

Optimalfilter• Frequenzselektive Filter

• Tiefpaß- Durchlassen von niedrigen Frequenzen unterhalb einervorgegebenen Grenzfrequenz fx < fgx und fy < fgy

• Hochpaß- Durchlassen von hohen Frequenzen oberhalb einervorgegebenen Grenzfrequenz fx > fgx und fy > fgy

• Bandpaß- Durchlassen von Frequenzen, welche sich oberhalb einerunteren Grenzfrequenz befinden und unterhalb eineroberen Grenzfrequenz fx > fgxu und fx < fgxo sowie

fy > fgyu und fy < fgyo

• Entwicklung von optimalen Filtern erfolgt im Frequenzbereich

156

••

Parameter zur Filterentwicklung• Filtergröße

- M Spalten und N Zeilen

• Filterform

-Rechteck- Die Größe des Rechtecks wird durch dieGrenzfrequenz fgx in x-Richtung und fgy in y-Richtung festgelegt

- Kreis- Die Grenzfrequenz fg legt den Radius des Kreises

um den Mittelpunkt fx =0 fy = 0 fest

157

••

•Herror ::gen_bandfilter (Hobject *ImageFilter, const HTuple&MinFrequency, const HTuple &MaxFrequency, const HTuple &Size)

- Erzeugung eines Bandpassfilters 'ImageFilter'

- Es werden Frequenzen durchgelassen, die die Untergrenze'MinFrequency' nicht unterschreiten und die Obergrenze'MaxFrequency' nicht überschreiten

- Mit 'Size' wird die Größe von 'ImageFilter' festgelegt

- Die Größe des Filters muss der Größe des Frequenzbildesentsprechen, da beide Bilder miteinander multipliziertwerden

158

••

• Bandpaßfilter der Größe 512x512

• Die untere Grenzfrequenz fgu beträgt 20 und die obereGrenzfrequenz fgo beträgt 60

Ortsbild Ortsfrequenzbild

159

••

Faltung im Frequenzbereich• Die Faltung der Ortsfunktionen führt zu einer Multiplikation derOrtsfrequenzfunktionen

),(),(

ˆ),(),(),(**),(

21

2121

yxyx ffSffS

ddyxIIyxIyxI =−−= � �∞

∞−

∞−

ηξηξηξ

Legende:

hOrtsbereicimFaltungdentspricht2**

160

••

• Herror ::convol_fft (Hobject ImageFFT, Hobject ImageFilter,Hobject *ImageConvol)

- Faltung von zwei Bildern im Frequenzbereich

- 'ImageFFT' ist die Fouriertransformierte

- Der Wert 0 bedeutet bei 'ImageFilter' vollständigeUnterdrückung der Frequenz und 255 keinerleiUnterdrückung

- Das Ergebnis der Faltung wird in 'ImageConvol'geliefert

161

••

• Anwendung des Bandpaßfilters der Größe 512 auf dasfouriertransformierte Bild der FH

• Unterdrückung der Frequenzen im Bereich zwischen 20 und 60

162

••

• Herror ::fft_image_inv (Hobject Image, Hobject *ImageFFTInv)

- Berechnung der Inversen ('ImageFFTInv') derFouriertransformierten ('Image')

- Rücktransformation vom Frequenzbereich in denOrtsbereich

- Alle Bilder müssen quadratisch sein

- 'Width' und 'Height' müssen eine Potenz von 2 sein

163

••

• Darstellung des Ortsbildes zum gefilterten Ortsfrequenzbildder FH mit einem Bandpaßfilter

• Ortsbild wurde mit Hilfe der inversen Fouriertransformationgeneriert

164

••

#include "HalconCpp.h"

class win

{HTuple Width, Height, WindowID;Hobject Im;char proceed;

public:win(Hobject Image, int standard = 0);

void change_image(Hobject Image);void display();void hold();void close();};

165

••

win::win(Hobject Image, int standard = 0)

{Im = Image;

:

:

166

••

class fourier

{protected:Hobject Image, Blau, ImageZoom, ImageFFT;

public:fourier(char file[]);void calculate();};

fourier::fourier(char file [])

{:

167

••

:

:void fourier::calculate()

{::access_channel(Image,&Blau,HTuple(3));

:

}

168

••

class bandfilter{protected:Hobject ImageFilter;

public:bandfilter();void calculate();

};

bandfilter::bandfilter(){

:}

169

••

void bandfilter::calculate(){::gen_bandfilter(&ImageFilter,HTuple(20),HTuple(60),HTuple(512));}

class convolution : public fourier, bandfilter{protected:Hobject ImageConvol, ImageFFTInv;

public:convolution(char file []);void calculate();

};

170

••convolution::convolution(char file []):fourier(file), bandfilter()

{:

}

void convolution::calculate(){::convol_fft(ImageFFT,ImageFilter,&ImageConvol);

:

:

}

171

••

class segmentation

{private:

convolution* c;Hobject ImageFFTInv;Hobject Region, RegionFillUp;Hobject RegionErosion, RegionDilation, SelectedRegions;Hobject ConnectedRegions, bike;

public:segmentation(char file []);void go();~segmentation();

};

172

••

segmentation::segmentation(char file []){c = new ... ;

:

}

void segmentation::go(){

Herror err = read_image(&ImageFFTInv,HTuple("ImageFFTInv"));if (err != H_MSG_TRUE)

{fprintf(stderr,"could not find image"); exit(1);

}

173

••

::threshold(ImageFFTInv,&Region,HTuple(60),HTuple(120));::fill_up_shape(Region,&RegionFillUp,HTuple("area"),HTuple(1),HTuple(1000));

::erosion_circle(RegionFillUp,&RegionErosion,HTuple(9.5));::dilation_circle(RegionErosion,&RegionDilation,HTuple(12.5));

::connection(RegionDilation,&ConnectedRegions);::select_shape(ConnectedRegions,&SelectedRegions,HTuple("height"),HTuple("and"),HTuple(50),HTuple(80));

::select_shape(SelectedRegions,&bike,HTuple("width"),HTuple("and"),HTuple(40),HTuple(60));

174

••

win w(bike,1);w.display();w.hold();w.close();

}

segmentation::~segmentation(){......

}

int main(int argc, char *argv[]){segmentation s(argv[1]);return 0;

}

175

••

• Herror ::gen_gabor (Hobject *ImageFilter, const HTuple &Angle,const HTuple &Frequency, const HTuple &Bandwidth, const HTuple&Orientation, const HTuple &Size)

- Bereitstellung eines Gabor-Filters ('ImageFilter')

- Mit 'Frequency' werden die durchzulassenden Frequenzenangegeben

- Es handelt sich hierbei um die untere Grenzfrequenz desBandpaßfilters

- Je größer der Wert von 'Frequency', umso höhereFrequenzen werden durchgelassen

- Mit 'Orientation' wird ebenso wie mit 'Frequency' dasFilterzentrum festgelegt

- Ein Wert von 0 für 'Orientation' erzeugt einen Filter,mit einer horizontal orientierten Mondsichel

176

••

- Die beiden Endpunkte der Mondsichel liegen also aufeiner horizontalen Linie, wobei die Sichel nach oben hingewölbt ist

- Diese Mondsichel wird durch Angabe von größeren Wertenfür 'Orientation' gegen den Uhrzeigersinn um dasBildzentrum rotiert

- Typischer Wertebereich: 0.0 ≤ 'Orientation' ≤ 3.1416

- Somit wird mit 'Orientation' bestimmt, welcheFrequenzanteile durchgelassen werden sollen, die derspezifizierten Richtung entsprechen

- 0.0 und 3.1416 lassen vertikale Frequenzanteile durch

- Mit dem Wert 1.6 werden dagegen nur die horizontalenFrequenzanteile durchgelassen

- Mit 'Angle' wird die Ausdehnung der Mondsichelfestgelegt

177

••

- Je größer 'Angle' ist, umso mehr wird die Mondsichelsymmetrisch in Richtung ihres Zentrums zusammengeschoben

- Durch hohe Werte für 'Angle' können horizontaleFrequenzanteile herausgefiltert werden

- Mit 'Bandwith' wird die Breite der Mondsichel festgelegt- Niedrige Werte für 'Bandwith' bewirken eine schmaleMondsichel

- Eine schmale Mondsichel hat zur Folge, dass auch derFrequenzbereich der durchzulassenden Frequenzen niedrigist

- Hohe Werte für 'Bandwith' haben ein großes Frequenzbandzur Folge

- 'Size' legt die Größe von 'ImageFilter' fest

178

••

• Gaborfilter der Größe 512

• Verwendung folgender Parameter:

- Angle: 1.2- Frequency: 0.4- Bandwith: 20- Orientation: 0.4

179

••

• Fouriertransformiertes Bild des Gaborfilters

180

••

• Herror ::convol_gabor (Hobject ImageFFT, Hobject GaborFilter,Hobject *ImageResultGabor, Hobject ImageResultHilbert)

- Faltung eines fouriertransformierten Bildes ('ImageFFT')mit einem Gaborfilter ('GaborFilter')

- Das Ergebnis der Gaborfilterung wird in'ImageResultGabor' geliefert

- Weiter kann auch eine Hilbertfilterung durchgeführtwerden

- In diesem Fall wird das Ergebnis in 'ImageResultHilbert'geliefert

181

••

• Faltung des fouriertransformierten Bildes der FH mit demGaborfilter

• Es zeigt sich die richtungsfilternde Wirkung des Gaborfilters

• Hier wurden die horizontalen Frequenzanteile herausgefiltert

182

••

• Herror ::dyn_threshold (Hobject OrigImage, HobjectThresholdImage, Hobject *RegionDynThresh, const HTuple &Offset,const HTuple &LightDark)

- Auswahl derjenigen Pixel, die einer Schwellwertbedingunggenügen:

OrigImage ≥ ThresholdImage + Offset

- Ein Pixel aus 'OrigImage' wird in 'RegionDynThresh'aufgenommen, sofern der Grauwert des entsprechendenPixel von 'ThresholdImage' erhöht um einen 'Offset'größer ist als der Grauwert des Pixels in 'OrigImage'

- Dies gilt, sofern die Option 'LightDark' auf 'light'eingestellt wird

183

••

- Die folgende Ungleichung gilt bei LightDark = dark

OrigImage ≤ ThresholdImage – Offset

- 'LightDark' kann auch auf 'equal' gesetzt werden:

ThresholdImage-Offset ≤ OrigImage ≤ ThresholdImage+Offset

- Schließlich noch die Ungleichung für LightDark =not_equal:

- ThresholdImage-Offset > OrigImage

- In der Regel wird für ThresholdImage ein geglättetesBild von OrigImage verwendet

- Dies kann beispielsweise durch eine Mittelwertfilterungherbeigeführt werden

- Dadurch wird ein ähnlicher Effekt erreicht, als wenn einSchwellwertoperator auf ein hochpaßgefiltertes Bildangewendet wird

184

••

- Wenn 'Offset' sehr klein gewählt wird, werden vielekleine Regionen gefunden

- Wird 'Offset' sehr groß gewählt, kann eventuellüberhaupt kein Pixel in die Lösung aufgenommen werden

185

••

#include "HalconCpp.h"

class win

{HTuple Width, Height, WindowID;Hobject Im;char proceed;

public:win(Hobject Image, int standard = 0);

void change_image(Hobject Image);void display();void hold();void close();

:

:

186

••

class fourier

{protected:Hobject Image, Blau, ImageZoom, ImageFFT;

public:fourier(char file[]);void calculate();};

187

••

fourier::fourier(char file [])

{Herror err = read_image(&Image, HTuple(file));

:

}

188

••

void fourier::calculate()

{::access_channel(Image,&Blau,HTuple(3));

:

}

189

••

class gabor

{protected:Hobject Filter;

public:gabor();void calculate();

};

gabor::gabor()

{:

}

190

••

void gabor::calculate()

{::gen_gabor(&Filter,HTuple(1.2),HTuple(0.4),HTuple(20),HTuple(0.4),HTuple(512));}

class convolution : public fourier, gabor

{protected:Hobject Hilbert, Gabor, GaborInv;

public:convolution(char file []);void calculate();

};

191

••

class segmentation

{private:

convolution* c;Hobject GaborInv, ImageZoom;Hobject RegionDynThresh, RegionFillUp;Hobject RegionErosion, RegionDilation, SelectedRegions;Hobject ConnectedRegions, bike;

public:segmentation(char file []);void go();~segmentation();

};

192

••

:

:

void segmentation::go(){

Herror err = read_image(&GaborInv, HTuple("GaborInv"));if (err != H_MSG_TRUE)

{fprintf(stderr,"could not find image"); exit(1);

}

err = read_image(&ImageZoom, HTuple("ImageZoom"));

193

••

if (err != H_MSG_TRUE){fprintf(stderr,"could not find image"); exit(1);

}

::dyn_threshold(ImageZoom,GaborInv,&RegionDynThresh,HTuple(1),HTuple("dark"));::fill_up_shape(RegionDynThresh,&RegionFillUp,HTuple("area"),HTuple(1),HTuple(1000));::erosion_circle(RegionFillUp,&RegionErosion,HTuple(0.5));::dilation_circle(RegionErosion,&RegionDilation,HTuple(17));::connection(RegionDilation,&ConnectedRegions);::select_shape(ConnectedRegions,&SelectedRegions,HTuple("width"),HTuple("and"),HTuple(40),HTuple(50));::select_shape(SelectedRegions,&bike,HTuple("height"),HTuple("and"),HTuple(55),HTuple(66));

194

••

win w(bike,1);w.display();w.hold();w.close();

}

segmentation::~segmentation(){

...

}

int main(int argc, char *argv[]){segmentation s(argv[1]);return 0;

}

195

••

• Herror ::highpass_image (Hobject Image, Hobject *Highpass,const HTuple &Width, const HTuple &Height)

- Hochpassfilterung von 'Image' mit der Matrix (hier fürdie Größe 7x5):

111111111111111113511111111111111111

196

••

- Auswahl von hochfrequenten Anteilen

- Mit zunehmender Größe der Matrix steigt derdurchzulassende Frequenzbereich in Richtung niedrigererFrequenz

- Größe der Filtermatrix wird mit 'Width' und 'Height'gesteuert

- Lieferung des gefilterten Bildes in 'Highpass'

197

••

Ortsbild Ortsfrequenzbild

• Hochpassgefiltertes Bild des vorgestellten Blaukanals

• Größe der Filtermaske 3x3

198

••

- Dadurch wird ein ähnlicher Effekt erreicht, als wenn einSchwellwertoperator auf ein hochpaßgefiltertes Bildangewendet wird

- Wenn 'Offset' sehr klein gewählt wird, werden vielekleine Regionen gefunden

- Wird 'Offset' sehr groß gewählt, kann eventuellüberhaupt kein Pixel in die Lösung aufgenommen werden

• Herror ::count_obj (Hobject Objects, long* Number)

- Übergabe einer Menge von Objekten im Array 'Objects'

- Anzahl der Objekte im Array wird ermittelt und mit'Number' geliefert

199

••

• Herror ::count_obj (Hobject Objects, long* Number)

- Übergabe einer Menge von Objekten im Array 'Objects'

- Anzahl der Objekte im Array wird ermittelt und mit'Number' geliefert

200

••

#include "HalconCpp.h"

class win

{HTuple Width, Height, WindowID;Hobject Im;char proceed;

public:win(Hobject Image, int standard = 0);

void change_image(Hobject Image);void display();void hold();void close();

:

:

201

••

class highpass

{protected:Hobject Image, Blau, Highpass;

public:highpass(char file[]);void calculate();

};

202

••

highpass::highpass(char file[])

{Herror err = read_image(&Image,HTuple(file));

:

:

}

203

••

void highpass::calculate()

{::access_channel(Image,&Blau,HTuple(3));

:

:

}

204

••

class segmentation

{private:

highpass* h;Hobject Highpass, Blau;Hobject RegionDynThresh, RegionFillUp;Hobject RegionErosion, RegionDilation, SelectedRegions;Hobject ConnectedRegions, blind_alley;HTuple Number;

public:segmentation(char file []);void go();~segmentation();

};

205

••

segmentation::segmentation(char file []){h = new …

}

void segmentation::go(){

Herror err = read_image(&Highpass, HTuple("Highpass"));if (err != H_MSG_TRUE)

{fprintf(stderr,"could not find image"); exit(1);

}

206

••

err = read_image(&Blau, HTuple("Blau"));if (err != H_MSG_TRUE){fprintf(stderr,"could not find image"); exit(1);

}

::dyn_threshold(Blau,Highpass,&RegionDynThresh,HTuple(1),HTuple("light"));::fill_up_shape(RegionDynThresh,&RegionFillUp,HTuple("area"),HTuple(1),HTuple(100));::erosion_circle(RegionFillUp,&RegionErosion,HTuple(1.5));::dilation_circle(RegionErosion,&RegionDilation,HTuple(4.5));::connection(RegionDilation,&ConnectedRegions);::select_shape(ConnectedRegions,&SelectedRegions,HTuple("height"),HTuple("and"),HTuple(15),HTuple(40));::select_shape(SelectedRegions,&blind_alley,HTuple("width"),HTuple("and"),HTuple(10),HTuple(20));::count_obj(blind_alley,&Number);

207

••

win w(Blau,1);w.display();w.hold();w.change_image(blind_alley);w.display();w.hold();w.close();

cout<<"Number of blind alley signs: "<<Number<<"\n";}

segmentation::~segmentation()

{:

}

208

••

int main(int argc, char *argv[]){segmentation s(argv[1]);return 0;

}