WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

lens distortion: Bestimmung relevanter Kanten

 

Hans Peter
Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 27.01.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.01.2013, 01:37     Titel: lens distortion: Bestimmung relevanter Kanten
  Antworten mit Zitat      
Hallo liebes Forum!
Ich sitze nun schon seit einer halben Ewigkeit über folgendem Problem:
Ich möchte aus einem Bild die Linsenverzerrung herausrechnen. Eine einfache Kantendetektion mit Reduzierung der Kantenbreite auf einen Pixel bekomme ich hin. Jedoch hapert es bei der Umsetzung der Bedingung welche Kanten auch relevant zur Behebung der Linsenverzerrung sind. Ich habe eine Folgende Arbeit im Internet gefunden: http://www.cs.ait.ac.th/vgl/faisal/paper/JMIV-Paper.pdf (Relevanter Code steht auf Seite 5).
Hier wird beschrieben, dass nur Konturen mit mindestens 10 Pixeln Länge und Kreisbogen-Anordnung genommen werden. Doch wie realisiert man das in Matlab? Ich habe durch die Kantendetektion und die Binarisierung des Bildes nur 1 und 0 als Werte in meiner Bildmatrix. Aber wie kann man nur aus einzelnen Werten auf die Länge einer Kante schließen? Oder überprüfen ob es sich bei der Kante um einen Kreisbogen handelt?

Ihr würdet mir sehr mit einer Erklärung, einem Ansatz oder einer kurzen Lösung helfen!
Tausend Dank schon mal im Voraus
Private Nachricht senden Benutzer-Profile anzeigen


Hans Peter
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 27.01.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.01.2013, 21:26     Titel:
  Antworten mit Zitat      
Ich habe ein Bild mit fisheye Verzeichnung.
Nun bin ich wie folgt vorgegangen:
>> bw=rgb2gray(im);
>> bi=edge(bw,'canny');
>> bi2=bwareaopen(bi,100);

Nach der Kantenerkennung möchte ich nun eine Kreiserkennung, um den Radius und den Kreismittelpunkt zu bestimmen, machen. Mit dem Befehl imfindcircles kann ich jedoch keine Kreise finden. Kann es daran liegen, dass ich die Kreise zu groß sind? Welchen anderen Befehl könnte ich nehmen?

Im Anhang befindet sich das kantendetektierte Bild.

Bitte helft mir!

im.jpg
 Beschreibung:

Download
 Dateiname:  im.jpg
 Dateigröße:  80.02 KB
 Heruntergeladen:  960 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Hubertus
Forum-Meister

Forum-Meister


Beiträge: 1.034
Anmeldedatum: 08.01.09
Wohnort: Hamburg
Version: ---
     Beitrag Verfasst am: 29.01.2013, 09:07     Titel:
  Antworten mit Zitat      
Moin,

imfindcircles wird keinen Kreis finden, da kein Kreis geschlossen abgebildet wird. Es gibt im File Exchange eine Funktion zu Distortion:

http://www.mathworks.de/matlabcentr.....ens-distortion-correction

oder hier:

http://stackoverflow.com/questions/.....s-visual-effect-in-matlab

Zur optischen Verzerrung gibt es nur wenige Funktionen. Kreise werden dir nicht weiter helfen, da immer nur Kreise gefunden, aber nicht deren Kreisumfang begradigt werden.

Viele Grüße, Hubertus
Private Nachricht senden Benutzer-Profile anzeigen
 
Hans Peter
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 27.01.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.01.2013, 12:45     Titel:
  Antworten mit Zitat      
Ahh okay, hier funktioniert es allerdings auch:
http://www.mathworks.de/products/im.....ng/images/ipexradius.html

Was ich jedoch machen möchte, ist weniger eine komplett lens distortion oder undistortion auf mein bild anwenden, als viel mehr nur die für die Verzeichnung relevanten Kanten extrahieren und deren Funktion herausfinden. Dabei reichen 3 durch lens distortion gebogene Kanten. Das erste Problem wäre also die relevanten Kanten zu filtern. Das Zweite, die Funktionen der gefilterten Kanten herausfinden.
Gibt es zb einen Befehl welcher in meiner binären Kanten-Bildmatrix plötzliche Richtungswechsel herausfiltert? dass Praktisch nur noch lange, leicht gebogene Kanten übrig bleiben, in der sich die Linsenverzerrung deutlich zeigt.
Private Nachricht senden Benutzer-Profile anzeigen
 
Hans Peter
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 27.01.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.01.2013, 12:46     Titel:
  Antworten mit Zitat      
Ahh okay, hier funktioniert es allerdings auch:
http://www.mathworks.de/products/im.....ng/images/ipexradius.html

Was ich jedoch machen möchte, ist weniger eine komplett lens distortion oder undistortion auf mein bild anwenden, als viel mehr nur die für die Verzeichnung relevanten Kanten extrahieren und deren Funktion herausfinden. Dabei reichen 3 durch lens distortion gebogene Kanten. Das erste Problem wäre also die relevanten Kanten zu filtern. Das Zweite, die Funktionen der gefilterten Kanten herausfinden.
Gibt es zb einen Befehl welcher in meiner binären Kanten-Bildmatrix plötzliche Richtungswechsel herausfiltert? dass Praktisch nur noch lange, leicht gebogene Kanten übrig bleiben, in der sich die Linsenverzerrung deutlich zeigt.
Private Nachricht senden Benutzer-Profile anzeigen
 
Hubertus
Forum-Meister

Forum-Meister


Beiträge: 1.034
Anmeldedatum: 08.01.09
Wohnort: Hamburg
Version: ---
     Beitrag Verfasst am: 29.01.2013, 13:36     Titel:
  Antworten mit Zitat      
Also, das Beispiel ist gut gemacht. Aber alleine wird der Radius und Mittelpunkt auch nicht gefunden. Du gibst 3 Variable vor und wenn man im Bild die Grauwerte innerhalb des Kreises angleicht,wird der Kreis auch nicht erkannt. Beide Werte werden auch nicht gefunden, wenn das Kreissegment verformt wird. Es muss wohl ein exakter Kreis sein! Im Moment habe ich für deine anderen Fragen noch kein Bespiel. In ähnlichen Fällen wird immer die Hough-Transformation angewendet - kenne mich da leider nicht aus, nur Beispiele gesehen.

Wenn ich etwas passendes finde melde ich mich.
Private Nachricht senden Benutzer-Profile anzeigen
 
Hubertus
Forum-Meister

Forum-Meister


Beiträge: 1.034
Anmeldedatum: 08.01.09
Wohnort: Hamburg
Version: ---
     Beitrag Verfasst am: 29.01.2013, 14:16     Titel:
  Antworten mit Zitat      
Bei deinem Bild fällt mir zunächst auf, dass sehr viel Doppelkontouren vorhanden sind. Die würde ich zunächst entfernen, um die Breiche zu isolieren, die du untersuchen willst. Ich habe das so gemacht:

Code:
I=imread(Bild);
I2=max(max(I))-I;  % Bild invertieren
I3=imopen(I2,strel('rectangle',[5 15]));
bw=im2bw(I3,0.5);
bw2=~bw;
bw3=bwmorph(bw2,'thin',inf);
figure; imshow(i3)


Wenn das dir nicht weiter hilft, gebe einen kurzen Hinweis!
Private Nachricht senden Benutzer-Profile anzeigen
 
Hans Peter
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 5
Anmeldedatum: 27.01.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.01.2013, 15:44     Titel:
  Antworten mit Zitat      
Ja, dankeschön, hat ein wenig geholfen.
imopen macht in deinem Code quasi eine Kantenglättung, oder? Was ich mir überlegt hatte, war eigentlich eine Funktion, die einen schnellen Richtungswechsel der Kantenstrukturen in der Bildmatrix erkennt und diese dann heraus filtert. Oder eine Funktion, die die kreisförmige Darstellung in der Realität gerader Kanten nutzt, um daraus die Kanten herauszufiltern welche für die Linsenentzerrung relevant sind.

Im Anhang nochmal das originale Bild.

fisheye1.jpg
 Beschreibung:

Download
 Dateiname:  fisheye1.jpg
 Dateigröße:  130.97 KB
 Heruntergeladen:  885 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Hubertus
Forum-Meister

Forum-Meister


Beiträge: 1.034
Anmeldedatum: 08.01.09
Wohnort: Hamburg
Version: ---
     Beitrag Verfasst am: 29.01.2013, 15:54     Titel:
  Antworten mit Zitat      
Meine Idee war, den oberen großen Kreisbogen auszuschneiden. Dann hast du ein Kreissegment, auf das man den Durchmesser errechnen kann. Mit "find" lassen sich alle schwarzen Pixel finden. find gibt dir einen 2-spaltigen Vektor zurück.
Private Nachricht senden Benutzer-Profile anzeigen
 
Hubertus
Forum-Meister

Forum-Meister


Beiträge: 1.034
Anmeldedatum: 08.01.09
Wohnort: Hamburg
Version: ---
     Beitrag Verfasst am: 30.01.2013, 07:56     Titel:
  Antworten mit Zitat      
Ich habe mir das Bild jetzt noch einmal genauer angesehen und versucht, mit CS6 die Verzeichnung zu begradigen. Da kommt kein sauberes Bild bei raus.Es müssen einzelne Bereiche mit unterschiedlichen Richtungsänderungen bearbeitet werden. Diese wiederum haben verzerrenden Einfluss auf andere Bildteile.

Ich denke, dass eine Fisheye-Aufnahme nichts mit einer Linsenverzerrung im Allgemeinen zu tun hat. Die Verzerrungen der Fisheye-Aufnahme sind in den Dimensionen zu groß. Die Linsenverzerrungen, die auch in Kameras heraus gerechnet werden, liegen in kleineren Dimensionen. Vielleicht ist dein Bild nicht der richtige Ansatzpunkt, zumal es für eine Fisheye-Aufnahme irgendwie asymmetrisch wirkt - ist es nur ein Bildausschnitt?
Private Nachricht senden Benutzer-Profile anzeigen
 
Phate
Forum-Guru

Forum-Guru



Beiträge: 283
Anmeldedatum: 09.11.09
Wohnort: Stuttgart
Version: R2008b
     Beitrag Verfasst am: 22.02.2013, 12:19     Titel:
  Antworten mit Zitat      
Hallo,

also wenn es nur darum geht die Linsenverzeichnung zu korrigieren, kann ich dir folgende Toolbox nahe legen:
http://www.vision.caltech.edu/bouguetj/calib_doc/.

Mit der Toolbox war es möglich starke Verzeichnungen die auch druch eine Fischaugenlinse erzeugt wurden in meinen Projekt zu kompensieren. Einziger Kritikpunkt ist, dass bei starker Verzeichnung die automatische Kantendetektion nicht funktioniert.

Falls du allerdings selbst einen Algorithmus schreiben bzw. umsetzten möchtest hilft dir das natürlich nicht weiter, auser als Vergleich zum Stand der Technik.

Viele Grüße
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.