Verfasst am: 29.11.2012, 15:23
Titel: Orthogonale Geraden entlang einer Linie
Hallo Forum,
ich möchte gerne Geraden einer bestimmten Länge (rote Linien im Bild) im rechten Winkel durch eine andere Linie (schwarze Linie) in einem Bild zeichnen und von den roten orthogonalen Linienen dann Lineprofiles erstellen.
Von der schwarzen Linie habe ich die Koordinaten. Es ist eine Linie aus einem Grauwertbild in der jeder Pixel der Linie (außer Anfang und Ende) genau zwei Nachbarn hat. (Keine diagonalen Nachbarn, also nur oben, unten, links, rechts).
Ich bastel gerade etwas ziellos durch die Gegend an folgendem Code:
Code:
... [xi2,yi2] = scanline (pt2_x, pt2_y);
% xi1 und yi1 enthalten die Koordinaten der schwarzen Linie
% und jetzt beginnt das Chaos des Unwissenden... % [N,YI] = polydeg(xi1,yi1); // Funktion aus FEX, schätz Grad des Polynoms % das die Messwerte am besten beschreibt. % Ergab 17, Ein Plot der Werte zeigt, das die Funktion die Linie wirklich %fast perfekt überlagert.
[p,S,mu]= polyfit(xi1,yi1,17); % das Polyfit mache ich, da die Punkte wegen der "genau zwei Nachbarn" Bedingung sonst immer nur inf oder 0 sein können, oder?
% das ergibt eine Kurve die nahezu perfekt auf der Linie läuft
dy = diff2(y); % vermute das ich nun die steigung in den punkten habe % diff2 ist auch aus der FileExchange, habs über das Forum hier gefunden [url]http://www.mathworks.com/matlabcentral/fileexchange/28920-derivative[/url]
% testweise jeden 20. Punkt nehmen und ortho. Gerade berechnen for i=10:20:size(xi1,1)
n=-((1/dy(i))*xi1(i))+y(i); % ich dachte ich löse die Geradengleichung der Orthogonalen nach n auf. Dann habe ich einen zweiten Punkt und lasse eine Linie vom Achsenabschnitt der Orthogonalen zu dem aktuellen Punkt zeichnen. Damit hätte ich zwei Punkte und kann meine Gerade zeichnen hold on
xo=[xi1(i),0];
yo=[y(i),n];
plot(xo,yo) end
Die Linien die ich bekomme laufen nun alle von den jeweiligen Punkten zu den jeweiligen Achsenabschnitten der Orthogonalen. Ich brauche sie aber zB 25px in beide Richtungen wie auf dem Bild zu sehen ist. Also rote Gerade 50px lang, orthogonal auf schwarzer Linie, schwarze Linie schneidet rote Linie in Mitte.
Des Weiteren schaut die Steigung nicht immer wirklich gut aus. Das liegt wohl an der Tatsache das die jeweiligen Pixel immer nur genau zwei Nachbarn haben können. Ich denke also, dass es besser wäre die Steigung eines Punktes aus jeweils einigen Nachbarn zu berechnen um so Kurven mit darstellen zu können, die bei diesen Bedingungen ja immer einige Pixel benötigen.
Wie würdet ihr an meine Fragestellung ran gehen, welche Stichworte fallen euch dazu ein. Ist die Berechnung der Orthogonalen wie ich sie geprutscht habe überhaupt richtig???
Grüße und vielen Dank für jedes Feedback!
Localhorst
ich verstehe nicht so recht, wo dein Problem ist. Ich würde den Gradienten bestimmen. y=f(x) => [df/dt, -1]. Die Funktion lässt sich als Punktmenge darstellen [x, f(x)] => [1, df/dt]. Diese beiden Vektoren sind orthogonal. Damit hast du die Richtung. Nun erstellt die Gerade in Parameterform (x_0 + t*g). Der Startpunkt ist der Punkt auf der Kurve, das Intervall für den Parameter definiert die Länge der Strecke.
Grüße, Marc
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.