Upload
hanhu
View
226
Download
1
Embed Size (px)
Citation preview
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&
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
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
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
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
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'
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
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
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
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
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
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
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
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
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
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
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
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
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
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);
}
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
nπ
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
kπ
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 φ=
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();};
166
••
class fourier
{protected:Hobject Image, Blau, ImageZoom, ImageFFT;
public:fourier(char file[]);void calculate();};
fourier::fourier(char file [])
{:
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
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();};
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();
};
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()
{:
}