Verfasst am: 26.11.2009, 20:48
Titel: Problem bei Hugh-Trafo
Hallo
ich habe eine kleine Hugh-Trafo geschrieben zur Kreismittelpunkterkennung.
Nun habe ich das Problem, dass um die Konturen keine Kreise gesetzt werden, sondern die Kontur selbst.
Meiner Meinung nach müsste der Fehler in einer Schleife liegen, ich kann aber leider keinen finden.
Code:
%% Kantendetektion
I = imresize(I,2);
I = im2bw(I,graythresh(I));
I = double(I);
kanten = edge(I,'canny');
%% Kreiskoordinaten erzeugen
w = linspace(0,2*pi,20);
r = 20;
xkreis = fix(r*cos(w));
ykreis = fix(r*sin(w));
for z=1:length(koorx) for k=1:length(w)
neu(koorx(z)+xkreis(k),koory(z)+ykreis(k))= neu(koorx(z)+xkreis(k),koory(z)+ykreis(k)) + neu(r+xkreis(k),r+ykreis(k)) + 1;
end end
vielen Dank, ich werde es morgen mal ausprobieren.
Ich verstehe nicht ganz, warum es mit meiner Methode nicht geht.
Den Radius habe ich ja bei der Bestimmung der Kreiskoordinaten schon mit eingerechnet.
Wenn man auf xkreis und ykreis nochmal den radiuswert draufaddiert, werden die Kreise meiner Meinung nach nur um den Radius nach unten und rechts verschoben.
Beispiel: Kreis mit Mittelpunkt bei 0, r=1
xkreis=(1,0,-1,0), ykreis(0,1,0,-1)
r+xkreis=(2,1,0,1), r+ykreis(1,2,1,0)
nun wenn du dir deine berechneten Kreiskoordinaten anschaust, dann siehst du, dass du auch negative Koordinaten berechnet hast.
D.h. dein Kreis ist verschoben... dies kannst du ausgleichen, indem der Radius hinzuaddiert wird.
Grüße,
Wraith720
_________________
Dumme Fragen gibt es nicht! Dumm ist nur, wer nicht fragt.
aber ich muss die negativen Werte doch garnicht ausgleichen, da der Mittelpunkt (der vorher bei 0 war) verschoben wird indem die Koordinaten der weißen Pixel aufaddiert werden.
Vielleicht denk ich auch grad falsch. Ich werd mir das in Ruhe nochmal überlegen.
ich habe nun die for-Schleife (mit der Radius-Korrektur) kopiert und bei mir versucht.
Ich erhalte immer noch das selbe Ergebnis, wie vorher.
Wenn ich "plot(xkreis,ykreis)" mache, sehe ich eindeutig, dass ich Kreiskoordinaten habe. Im Hugh-Raum werden aber leider keine Kreise um die weißen Pixel gemacht, sondern wieder die Kontur selbst...
Ich hab jetzt garkeine Ahnung mehr...
p.s.: wenn man "neu(r+xkreis(k),r+ykreis(k))" aufaddiert, bedeutet das nur, dass man die Werte in der Matrix "neu", die auf einem Kreis mit Mittelpunkt bei (r,r) liegen, draufaddiert, die hier (glücklicherweise) alle 0 sind.
Hm, das ist aber seltsam...
Bei mir klappt das so.
Ich hab dir mal ein Bildchen mit einem Zwischenergebnis des Hough-Raumes beigefügt. Dort siehst du, dass dort eindeutig ein Kreis auf die Kontur gezeichnet wird.
Code dazu sieht so aus:
Code:
I = imread('I.jpg');
%% Kantendetektion
I = imresize(I,2);
I = im2bw(I,graythresh(I));
I = double(I);
kanten = edge(I,'canny');
%% Kreiskoordinaten erzeugen
w = linspace(0,2*pi,360);
r = 20;
xkreis = fix(r*cos(w));
ykreis = fix(r*sin(w));
%% "Hugh-Trafo"
neu = zeros(size(I));
for z=1:length(koorx) for k=1:length(w)
neu(koorx(z)+xkreis(k),koory(z)+ykreis(k))= neu(koorx(z)+xkreis(k),koory(z)+ykreis(k)) + neu(r+xkreis(k),r+ykreis(k)) + 1;
end end
so ich habs mal Schritt für Schritt verglichen.
"+ neu(r+xkreis(k),r+ykreis(k))" kann man weglassen, das hab ich ja schon erklärt.
Der "Fehler" liegt bei "w = linspace(0,2*pi,360);" ich habe da nur 20 Werte bestimmen lassen, du hast da 360.
Mit 360 Werten klappt es nun auch bei mir.
Ich wollte mit so wenig Werten wie möglich arbeiten, da das ganze so schnell wie möglich ablaufen soll (echtzeitfähigkeit ist gefordert, wird man aber sicher nicht erreichen...).
Nun teste ich herum, ab wieviel Werten ein Kreis gezeichent wird... sehr merkwürdig
also ich habs jetzt nochmal nach einer Pause und etwas Abstand versucht.
Doch nun funktioniert der Code von Wraith720 auch nicht mehr, vielleicht habe ich vorher auch nicht so genau hingeschaut.
Im Anhang habe ich markiert (mit einer lilanen Ellpise), wo man sieht, dass es nicht klappt.
Wenn man den Radius beim Berechnen der Kreiskoordinaten ändert und sich dann den Kreis ausgeben lässt, passt alles.
Wenn man diese Koordianten dann für die Hugh-Trafo verwendet, ändert sich nicht der Radius der Kreise, sondern der Abstand zu den Objekten.
Das kann ich mir nicht mehr erklären...
Langsam weiß ich nicht mehr weiter....
ich habe gerade herausgefunden, dass ich wiedermal etwas oberflächlich war und dachte, dass Hough ohne "o" geschrieben wird.
Es gibt in der ImageProcessingToolbox bereits eine Funktion Hough(), die werde ich mal testen.
Wenn man den Namen richtig schreibt, findet man die auch.
http://www.mathworks.com/access/hel.....toolbox/images/hough.html
Die geht aber leider nur zur Detektion von Linien...
danke
ich werde mir da mal etwas zusammensuchen.
vielleicht finde ich irgendwann heraus warum mins nicht ging.
Einstellungen und Berechtigungen
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
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.