Verfasst am: 19.08.2014, 17:12
Titel: Linienpunkte einer Linie ermitteln.
Hallo zusammen,
vielleicht kann mir jemand helfen. Sollte ich das Problem gelöst haben, poste ich gerne den Code.
Hier nochmal das Problem:
Zu einer durch zwei Punkte x1 und x2 gegebenen Linie h sollen alle zur Linie gehörenden Punkte p ermittelt werden. Die Linie h ist exakt ein Pixel breit.
Im Prinzip ist die gesuchte Funktion ähnlich wie die durch Matlab bereits gegebene ShapeInserter-Funktion, die ebenso die gesuchten Linienpunkte aus einem Punktepaar ermittelt, wenn sie die Linie h in ein vorhandenes Bild einzeichnet. Da ich jedoch nur eine Matlab-function für ein Simulink-Modell erstelle, welches letzlich auf einem Embedded-System laufen soll, kann ich die ShapeInserter-Funktion wahrscheinlich nicht verwenden.
Daher zu meiner Frage:
Hat irgendjemand eine Idee, wie die gesuchten Linienpunkte ermittelt werden können?
Zum Schluß noch zwei Ansätze, die ich bisher verfolgt habe, die allerdings nicht oder noch nicht verwendbar sind.
1.
Eine einfache, aber für mich nicht verwendbare Lösung (siehe oben), wäre:
Code:
% 600x800-Schwarzbild zum Einzeichnen Linie erstellen.
Black_Image = zeros(600,800);
% Linie h über zwei Punkte x1 und x2 definieren.
Points = [10,10,100,100];
% Linie h in Schwarzbild einzeichnen.
Line_Pic = step(shapeInserter,Black_Image,Points);
% Elemtennummern der Linien-Punkte ermitteln (Elemente der Wertigkeit 1 % werden ermittelt).
El_Nr = find(Line_Pic);
% Vektor zur Speicherung der Linienpunkte initialisieren.
Line_Points = zeros(size(El_Nr,1),2);
% Indizes der Linien-Punkte ermitteln. Die im Vektor 'Line_Points' % enthaltenen Punkte (ein Punkt pro Zeile. 1. Spalte: Spaltenindex, % 2. Spalte: Zeilenindex) sind die gesuchten Linienpunkte der Linie h. [Line_Points(:,1),Line_Points(:,2)] = ind2sub([size(Line_Pic,1),... size(Line_Pic,2)],El_Nr);
In diesem Fall wird einfach eine durch das Punktepaar x1 (10,10) und x2 (100,100) gegebene Linie h durch den ShapeInserter in ein Schwarz-Bild eingezeichnet und über die Funktion 'find' die weißen Bildpunkte ermittelt. Nicht wirklich die feine Art, aber funktional, wie ich finde. Vielleicht hilft es jemand.
2.
Das Rechnen mit einer Standard-Geradengleichung im zweidimensionalen, kartesischen Koordinatensystem: y(x)= m*x+b , mit m= Steigung und b= Y-Achsenabschnitt.
Es wird eine Steigung errechnet, und daraus ein Linienstück 'Delta_h', welches die Anzahl an Pixeln angibt, deren Spalten-/bzw. Zeilenindex gleich ist. Als Beispiel: Eine Gerade mit der Steigung m=1, hat nur ein Pixel, pro Spaltenindex. Eine Gerade mit der Steigung m=2, hat zwei Pixel mit dem gleichen Spaltenindex.
Auf diese Art können die zur Geraden h gehörenden Linienpunkte errechnet werden. Das Problem an meinem Code in diesem Fall ist leider die Genauigkeit. Ich erhalte bei einem 600x800 Bild und einer Linie der Länge 800 Pixel Abweichung am Ende der Linie von bis zu 30 Pixeln. Für mich nicht akzeptabel. Ausgereifte Funktionen errechnen diese Linienpunkte sehr viel genauer. Leider habe ich keine derartige. Daher dachte ich, ich Frage hier mal nach Ideen.
Ist denn bekannt welche mathematische Funktion dort abgebildet wird? Oder handelt es sich um ein beliebiges System?
Ist es möglich die Punkte näher zusammen zu legen? Abstand z.B. nur noch 100 Pixel? Würde zwar Rechenzeit kosten aber wäre theoretisch auch eine Idee oder?
tut mir leid, dass ich erst so spät antworte. Das ist nicht die feine Art.
Danke für deine Antwort.
Was meinst du mit der 'mathematischen Funktion?' Also eingesetzt wird das Ganze im Bereich der Bildverarbeitung um entlang der Linie (deren Punkte hier ermittelt werden sollen) im Ursprungsbild nach hellen Pixeln zu suchen. Und die Idee aus Lösungsansatz 2 war aus Anfangs- und Endpunkt der Linie (deren Linienpunkte ich suche) eine Steigung zu errechnen, mit der in Verbindung einer Geradengleichung der jeweils nächste Lininepunkt bestimmt werden kann.
Ich habe mittlerweile doch den ersten Lösungsansatz umgesetzt, da der Real-Time-Workshop aus der shapeinserter-Funktion wider Erwarten doch C-Code erstellen kann. Ich denke ich werde mit dieser Lösung arbeiten, solange sie funktioniert.
Trotzdem hier, für alle die vielleicht mal das selbe Problem haben, noch ein Zusatz zum 2. Lösungsweg (mit dem sollte auch der funktionieren):
Es bleibt alles wie beschrieben, nur dass die Steigung der Linie nicht nur einmal ausgerechnet und anschließend die daraus konstruierten Linienstücke einfach aneinander gereiht werden. So kommt die Abweichung zu stande, da die Steigungsberechnung (Steigung m = Y2-Y1/X2-X1) ein Integer-Ergebnis liefert. Also eine ganzzahlige Pixeländerung in X und Y-Richtung (beispielsweise: Linienpunkt 2 liegt zwei Pixel weiter rechts und ein Pixel über Linienpunkt 1.). Der Nachkomma-Teil der Division geht dabei verloren. Je länger die Nachkonstruierte Linie ist, desto größer der Fehler am Ende, weil sich die Fehler aller zusammengefügten Linienteile adiieren (Linienpunkt 1 zu Linienpunkt 2 ist ein Linienteil).
Stattdessen muss für jeden Linienteil (also für jeden nächsten Linien-Punkt) eigens eine Steigung berechnet werden, wobei der Nachkomma-Teil der vorigen Steigungsberechnung zur aktuell errechneten Steigung dazu addiert wird. Damit wird der Modulo-Teil (Nachkomma-Teil) berücksichtigt und es kommen ggf. verschiedene Steigungen für die verschiedenen Linienteile heraus (Beispiel. Linienpunkt 1 zu Linienpunkt 2: Zwei Pixel nach rechts, ein Pixel nach oben. Linienpunkt 2 zu Linienpunkt 3: DREI Pixel nach rechts, ein Pixel nach oben.).
Durch die Berücksichtigung des Nachkomma-Teils der Division sollte die Genauigkeit sehr viel besser werden. Ich habe diesen Weg allerdings noch nicht ausprobiert. Der Tip kam von meinem Prof. Wenn es jemand tut, kann er ja gerne seine Erfahrungen hier schildern.
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.