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

Linie über ein Bild legen, diese unterteilen und ausmessen

 

Localhorst
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 86
Anmeldedatum: 18.02.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.10.2008, 14:39     Titel: Linie über ein Bild legen, diese unterteilen und ausmessen
  Antworten mit Zitat      
Hallo Forum,

ich stehe ganz am Anfang ein neues GUI zu schreiben und wollte einige Ideen sammeln, bzw vielleicht gibt es ja auch schon Funktionen, die einen Teil meiner Arbeit erleichtern.

Der Benutzer soll zei Punkte in einem Bild bestimmen, dazwischen wird eine Linie gezeichnet - wird kein Problem sein.

Die Länge der Linie wird als 100% gesetzt, nun soll der Benutzer Unterteilungen setzen können, und die prozentuale Länge der gemachten Abschnitte soll der Ausgabewert sein.

Ich habe eine Grafik in den Anhang gepackt, die eigentlich zeigen sollte was ich meine.

Für möglichst viele Ideen und Ratschläge wäre ich sehr dankbar.

MfG
Localhorst

scribble.jpg
 Beschreibung:

Download
 Dateiname:  scribble.jpg
 Dateigröße:  25.73 KB
 Heruntergeladen:  852 mal


Zuletzt bearbeitet von Localhorst am 13.10.2008, 15:45, insgesamt einmal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen


Bijick
Ehrenmitglied

Ehrenmitglied



Beiträge: 914
Anmeldedatum: 18.06.07
Wohnort: Nürnberg
Version: R2006b, R2008b
     Beitrag Verfasst am: 13.10.2008, 15:12     Titel:
  Antworten mit Zitat      
Hallo Localhorst,

mir sind gleich mal zwei Dinge eingefallen:

1. Was passiert, wenn der Benutzer nicht auf die Linie, sondern nur in die Nähe klickt? Sinnvoll wäre wahrscheinlich, den Punkt auf der Linie mit dem geringsten Abstand zum Klick zu wählen. Das hängt aber auch von der tatsächlichen Anwendung ab.

2. Müssen die Ausgabewerte "online" ermittelt werden oder reicht eine Auswertung, wenn alle Unterteilungspunkte feststehen? Im ersten Fall ist die Programmierung wahrscheinlich umständlicher, weil erst entschieden werden muss, in welchem Intervall der neue Punkt überhaupt liegt.

Herzliche Grüße
Bijick

PS: Korrigierst Du noch den Titel? Smile
_________________

>> why
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Localhorst
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 86
Anmeldedatum: 18.02.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 13.10.2008, 15:28     Titel:
  Antworten mit Zitat      
Hi,

die Auswertung kann ruhig danach erfolgen. Die gesetzten Punkte sollten nur deutlich auf der Gerade zu erkennen sein und es sollte die Möglichkeit bestehen gesetzte Punkte auf der Gerade zu verschieben.

Das mit dem nächsten Punkt wollte ich so machen, dazu habe ich bereits in der FileExchange eine Funktion gefunden. (MagnetGInput.m)

Über GInput kann ich auch die ersten beiden Punkte setzen und diese dann mit Line verbinden. (Wobei Matlab mit der MagnetGInput Funktion und dem Handle der Linie nur zu dem Start bzw Endpunkt springen konnte. Punkte auf der Linie wurden nicht erkannt. )

Gruß
Localhorst
Private Nachricht senden Benutzer-Profile anzeigen
 
Bijick
Ehrenmitglied

Ehrenmitglied



Beiträge: 914
Anmeldedatum: 18.06.07
Wohnort: Nürnberg
Version: R2006b, R2008b
     Beitrag Verfasst am: 13.10.2008, 16:58     Titel:
  Antworten mit Zitat      
Hallo,

das MagnetGInput arbeitet nur mit den XData und YData. Da die Linie nur aus den zwei Endpunkten erzeugt ist, sind das die einzigen Zielpunkte. Aber der geringste Abstand eines Punktes zu einer Geraden müsste doch ein Standardproblem sein.

Herzliche Grüße
Bijick
_________________

>> why
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Maddy
Ehrenmitglied

Ehrenmitglied



Beiträge: 494
Anmeldedatum: 02.10.08
Wohnort: Greifswald
Version: ---
     Beitrag Verfasst am: 13.10.2008, 17:16     Titel:
  Antworten mit Zitat      
Genug Punkte zu erzeugen, wenn man 2 Punkte einer Geraden kennt, sollte kein Problem sein.

Start- und Endpunkt mittels ginput und dann einfach ne Gerade durchfitten (stichwort: polyfit). Der Fit liefert die Funktion und mittels linespace kann man dann die gewünschte Genauigkeit an Punktdichte für MagnetGInput erreichen.
_________________

>> why
The computer did it.
Private Nachricht senden Benutzer-Profile anzeigen
 
Bijick
Ehrenmitglied

Ehrenmitglied



Beiträge: 914
Anmeldedatum: 18.06.07
Wohnort: Nürnberg
Version: R2006b, R2008b
     Beitrag Verfasst am: 13.10.2008, 18:02     Titel:
  Antworten mit Zitat      
Hm, oder man rechnet doch exakt:

Wenn der Startpunkt (x1,y1), der Endpunkt (x2,y2) und der neue Punkt (x3,y3) gegeben sind, dann ist der gemeinte Punkt bei

Code:
x = 0.5*((y3-y1)*(x2-x1)/(y2-y1)+x3+x1);
y = 0.5*((x3-x1)*(y2-y1)/(x2-x1)+y3+y1);


Den kann man dann einzeichnen. Wenn er auf der Strecke liegt, hab ich richtig gerechnet. Smile

Herzliche Grüße
Bijick
_________________

>> why
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Localhorst
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 86
Anmeldedatum: 18.02.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.10.2008, 09:25     Titel:
  Antworten mit Zitat      
Danke euch beiden!

Aus den beiden Ideen meine Linie mit vielen Punkten zu basteln wird kein Problem.

Ich würde dann also die magnetische Funktion über einen Pushbutton aufrufen lassen, und so meine Punkte sammeln können.

Aber wie würdet ihr die Beweglichkeit bzw Editierbarkeit der Punkte umsetzen? Ein ausgewählter Punkt muss noch verschoben werden können!

Gruß
Localhorst
Private Nachricht senden Benutzer-Profile anzeigen
 
Bijick
Ehrenmitglied

Ehrenmitglied



Beiträge: 914
Anmeldedatum: 18.06.07
Wohnort: Nürnberg
Version: R2006b, R2008b
     Beitrag Verfasst am: 14.10.2008, 10:23     Titel:
  Antworten mit Zitat      
Hallo Localhorst,

zum Verschieben direkt fällt mir nichts ein, aber ich könnte mir vorstellen, dass folgendes klappt:

Zwei Schaltflächen "setzen" und "löschen". Dann kann man Punkte setzen wie gehabt, und wenn man einen Punkt verschieben will, muss man ihn erst löschen und dann einen neuen setzen.

Zum Löschen wäre dann die Magnetfunktion wirklich gut geeignet. Sie springt zum nächsten Unterteilungspunkt, der wird mit delete gelöscht.

Aber vielleicht ließe sich das auch gleich kombinieren, sodass der Benutzer nichts davon merkt. Es muss dem Programm nur klar gemacht werden, ob ein Punkt nah an den vorigen gesetzt werden soll, oder der Punkt selbst verschoben werden soll. Vielleicht ginge das auch über rechte und linke Maustaste.

Herzliche Grüße
Bijick
_________________

>> why
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Maddy
Ehrenmitglied

Ehrenmitglied



Beiträge: 494
Anmeldedatum: 02.10.08
Wohnort: Greifswald
Version: ---
     Beitrag Verfasst am: 14.10.2008, 13:49     Titel:
  Antworten mit Zitat      
Zu meiner Anmerkung "Polyfit" möchte ich noch sagen:

Wenn man 2 Punkte einer Gerade kennt, dann brauch man nicht fitten, sondern kann direkt die Geradengleichung aus den Punkten bestimmen. Ist mir erst jetzt aufgegangen, kommt wohl von zu viel nachdenken. Wink *peinlich*
_________________

>> why
The computer did it.
Private Nachricht senden Benutzer-Profile anzeigen
 
Lord nibbler

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.10.2008, 15:00     Titel:
  Antworten mit Zitat      
verschieben ist gar nicht so schwer:
Hier ein kurzes Video vom beliebten Doug:

http://blogs.mathworks.com/pick/200.....b-capture-mouse-movement/

Gruß Lord nibbler
 
Localhorst
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 86
Anmeldedatum: 18.02.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.10.2008, 15:18     Titel:
  Antworten mit Zitat      
HI,

danke für die vielen guten Ideen, die Linie habe ich mittlerweile mit der bresenham() Funktion aus der Fileexchange umgesetzt.

Ich habe bis jetzt mein GUI, das mein Bild einliest, (dann kann ein Abschnitt gezoomt werde) über den gezoomten Abschnitt lege ich meine Linie. (Zwei Punkte werden geklickt, dazwischen dann die Punkte mit bresenham() ergänzt)

Meine Punkte auf der Linie kann ich auch bereits mit der Magnet Funktion selektieren. Ich schaue nun nach der Beweglichkeit meiner Punkte bzw Linien, ich hoffe das ich mit deinem Ansatz weiter komme. BIn mir aber noch nicht ganz sicher, da sich meine Linien bzw Punkte im rechten Winkel zu der selbst eingezeichneten Gerade bewegen muss, nicht parallel zu den Achsen.

Ich suche weiter und hoffe das ich weiter komme.

Gruß
Localhorst
Private Nachricht senden Benutzer-Profile anzeigen
 
Localhorst
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 86
Anmeldedatum: 18.02.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.10.2008, 12:44     Titel:
  Antworten mit Zitat      
Hallo zusammen,

ich bin nach dem ganz guten Start noch nicht viel weiter gekommen.

Ich hänge gerade bei einem Darstellungsproblem.

Ich habe das GUI einmal als rar Datei in den Anhang gepackt.

Das Gui mit select_seperator starten.
Dann über file->new ein beliebiges Bild wählen. Das wird dann rechts oben in der Ecke dargestellt.
Dann auf "select detail part" klicken und in dem kleinen Bild einen Bereich mit gedrückter Maustaste auswählen.(imcrop)
Der Bereich wird dann in dem Hauptfeld angezeigt.

Wenn ihr dann auf "select start end" klickt, könnt ihr einen Start und einen Endpunkt einer Gerade bestimmen, die dann in dem großen Bild angezeigt wird.

Und da beginnt mein Problem...

Nachdem die Gerade dargestellt wird, ändern sich die Proportionen des großen Bildes und es wird genau quadratisch dargestellt (so wie ich es mit GUIDE erstellt habe) aber die Proportionen sollen natürlich gleich bleiben.

Ich habe schon mit PlotBoxAspectRatio gespielt, bin aber zu keinem Ergebnis gekommen! Wenn ich dann nämlich auf "select seperator" geklickt habe wird die jetzt im rechten Winkel dargestellte grüne Linie nicht mehr im rechten Winkel dargestellt, was bestimmt nur an den verzerrten Proportionen liegt, ich weiß aber leider nicht wie ich das korrigieren muss.

Wäre super, wenn einer von euch einmal rein schaut.

(Ich weiß das die Knöpfe noch nicht aussagekräftig sind und nicht gerade, aber solche Kleinigkeiten mach ich erst am Ende. Das Wechseln der Colormap ist auch kein Problem, da nur mit 8bit Grauwerten gearbeitet werden wird.)

Freundliche Grüße
Localhorst

plwn_tool.rar
 Beschreibung:

Download
 Dateiname:  plwn_tool.rar
 Dateigröße:  34.92 KB
 Heruntergeladen:  606 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
dafocus

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.03.2010, 13:42     Titel: weiterführend ...
  Antworten mit Zitat      
Hallo,

ich hänge grad an einem ähnlichen Problem. Ich habe eine GUI erstellt, wo ich in einer axes-Umgebung auch mit der Maus Linien einzeichne.

Jetzt ist aber das Problem, wenn ich einen Polygonzug erstellen will, müssen Endpunkt der alten und Startpunkt der neuen Gerade gleich sein.
Gibt es in Matlab eine Funktion, um beispielsweise wie in AutoCAD den Endpunkt durch Annähern der Maus zu markieren?
Oder geht das nur, wie hier bereits angesprochen, indem ich mir eine Funktion bastel, die den minimalsten Abstand wahrnimmt.

Grüße
 
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 - 2025 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.