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

Bild um bestimmten Punkt drehen

 

JaWi
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 56
Anmeldedatum: 10.08.13
Wohnort: Deutschland
Version: ---
     Beitrag Verfasst am: 20.08.2013, 12:38     Titel: Bild um bestimmten Punkt drehen
  Antworten mit Zitat      
Hallo, ich möchte gern eine Karte, image A, in meiner GUI um einen bestimmten Punkt BS1 drehen.
Imrotate dreht um den Mittelpunkt, so dass ich den Punkt BS1 in die Mitte verschiebe und dann das Bild drehe.
Das Problem ist, dass das verschobene Bild in der figure ja nicht in der zugrunde liegenden matrix A "mitgeändert" wurde und imrotae(A, Winkel) wieder um den Mittelpunkt dreht.
Wie bekomme ich das hin? Kann ich das aktuelle Bild in der figure speichern, drheen und wieder setzen? Allerdings brauche ich das gesamte Bild, nicht nur den sichtbaren Ausschnitt.

Hier ein Minimalbsp zu meinem Problem:

Code:

load mandrill
figure
image(X)
image([0 20], [0 20], X)
colormap(map)
axis on
% Punkt, um den gedreht werden soll
line('XData',5, 'YData',5, ...
    'Color','w', ...
    'Marker','x', 'MarkerSize',8, 'LineWidth',3);

text(5,5,...
    sprintf('BS_1'), ...
    'Color','w', 'FontSize',10, ...
    'HorizontalAlignment','right', 'VerticalAlignment','top');
% Achsen verschieben, so dass Punkt in Mitte liegt:
% set axes
set(gca, 'XLim', [-5 15]);
set(gca, 'YLim', [ -5 15]);

A = imrotate(X,15,'crop');
image(A);
 


Danke!
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: 20.08.2013, 12:58     Titel:
  Antworten mit Zitat      
edit:

Habe meine Antwort geändert, da ich deine sets vergessen hatte. Was ich nicht verstehe ist erstens:

Zitat:
A = imrotate(X,15,'crop');
image(A);


Alle anderen Befehle nach load sind völlig wirkungslos. Die Figur mit den Settings zeigt einen Inhalt, den ich nicht verstehe. Erkläre bitte mal, wie der Inhalt geändert werden soll.
Private Nachricht senden Benutzer-Profile anzeigen
 
JaWi
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 56
Anmeldedatum: 10.08.13
Wohnort: Deutschland
Version: ---
     Beitrag Verfasst am: 20.08.2013, 13:31     Titel:
  Antworten mit Zitat      
Was meinst du mit völlig wirkungslos?
Erst wird das mandrill-Bild über image(X) in eine figure geladen, dann wird bei (5,5) ein Punkt mit line(...) gesetzt, dann werdern die Achsen über set(gca,...) so verändert, dass der Punkt BS1 in der Mitte des Bildes liegt.
Das wird über imrotate(X,15,'crop') das Bild X (der Affe aus mandrill) um 15 Grad gedreht (aber eben NICHT um BS1 wie gewünscht, sondern ums Zentrum des Bildes) und mit 'crop' bleiben die Bild-Dimensionen erhalten. Über image(A) wird dann das gedreht Bild wieder geladen.
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: 20.08.2013, 13:37     Titel:
  Antworten mit Zitat      
Ich meine damit, dass die Folge: A = imrotate(X,15,'crop'); image(A); ein Ergebnis unabhängig der dazwischen liegenden Befehle zeigt. Ist es richtig, dass BS_1 der gesuchte Drehpunkt ist?
Private Nachricht senden Benutzer-Profile anzeigen
 
JaWi
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 56
Anmeldedatum: 10.08.13
Wohnort: Deutschland
Version: ---
     Beitrag Verfasst am: 20.08.2013, 13:53     Titel:
  Antworten mit Zitat      
Ja genau, Drehung um BS1. Dieso Info dürftest du aber sowohl im Code ("Punkt, um den gedreht werden soll") und meinem letzen Post ("...nicht wie gewünscht um BS_1") finden Wink

Ich habe gerade eine interessante Funktion gefunden, die ich noch nicht ganz verstehe, die aber einen Origin als Übergabeparameter hat:
http://www.mathworks.com/matlabcent.....on-fixed/content/rotate.m
Private Nachricht senden Benutzer-Profile anzeigen
 
JaWi
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 56
Anmeldedatum: 10.08.13
Wohnort: Deutschland
Version: ---
     Beitrag Verfasst am: 20.08.2013, 14:08     Titel:
  Antworten mit Zitat      
edit: Es funktioniert doch für images, man sollte nur nicht vergessen den Handle dem Bild zuweisen, das man übergibt Wink

Mit der Funktionen rotate oben aus dem Link:

Code:

load mandrill
figure
h1=image([0 20], [0 20], X);
colormap(map)
axis on

% Punkt, um den gedreht werden soll
line('XData',5, 'YData',5, ...
    'Color','w', ...
    'Marker','x', 'MarkerSize',8, 'LineWidth',3);
text(5,5,...
    sprintf('BS_1'), ...
    'Color','w', 'FontSize',10, ...
    'HorizontalAlignment','right', 'VerticalAlignment','top');
origin=[5,5,0];
alpha=180;
azel= [0, 0, 1];
rotate(h1,azel,alpha,origin)
 
Private Nachricht senden Benutzer-Profile anzeigen
 
JaWi
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 56
Anmeldedatum: 10.08.13
Wohnort: Deutschland
Version: ---
     Beitrag Verfasst am: 20.08.2013, 14:29     Titel:
  Antworten mit Zitat      
Allerdings funktioniert es nur bei 180 Grad, so ganz durchblicke ich es noch nicht.
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: 20.08.2013, 16:27     Titel:
  Antworten mit Zitat      
Du wolltest doch das ganze Bild sehen oder ist das hinfällig.
Wenn alles so bleiben soll, ist das doch prinzipiell einfach. Ich habe dir ein Beispiel beigefügt. Ist das so richtig oder was ist falsch?

Man kann das Bild natürlich noch beschneiden.

test.jpg
 Beschreibung:

Download
 Dateiname:  test.jpg
 Dateigröße:  63.43 KB
 Heruntergeladen:  930 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
JaWi
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 56
Anmeldedatum: 10.08.13
Wohnort: Deutschland
Version: ---
     Beitrag Verfasst am: 20.08.2013, 19:15     Titel:
  Antworten mit Zitat      
Ohne vorher-Bild und/oder Code fällt es mir ehrlich gesagt gerade etwas schwer nachzuvollziehen, was du überhaupt gemacht hast.

Bei mir geht es prinzipiell darum:

- ich habe eine google map als Hintergund in meiner GUI, in der Punkte eingezeichnet sind (siehe Bild)
- das Bild soll nun so um BS1 gedreht werden, dass BS1 und BS2 eine Waagerechte bilden, die Achsenskalierung (in Metern) soll erhalten bleiben
- wenn die Karte sich teilweise aus dem Bild dreht ist das kein Problem
- der Winkel ist bekannt und bei jeder map anders

Hast du eine Idee?

Vorher.JPG
 Beschreibung:

Download
 Dateiname:  Vorher.JPG
 Dateigröße:  92.98 KB
 Heruntergeladen:  949 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: 20.08.2013, 20:12     Titel:
  Antworten mit Zitat      
Mir fehlt im Moment eine durchgängige Struktur. Das Eingangsbeispiel mit mandrill hat mich verwirrt. Man sieht bei Bildern natürlich auf den Inhalt und fragt sich, welcher Sinn realisiert werden soll. Jetzt wird mir das klar.

Ich habe absichtlich keinen Code gepostet. Es ging mir nur darum, ob die Darstellung jetzt korrekt ist und habe einfach nur erwartet dass du zustimmst oder den Fehler aufzeigst. Es wird hier zu recht nicht gerne gesehen, wenn wir Hausaufgaben lösen. Ein gutes Mittel, sich nicht diesem Vorhalt auszusten ist, nur ein Prinzip zu erklären, dass noch jede Menge Gestaltungsspielraum zulässt.

Zitat:
Allerdings brauche ich das gesamte Bild, nicht nur den sichtbaren Ausschnitt.
Auch das verhält sich jetzt anders. Ich möchte dir nur eine Hilfestellung für weitere Fragen geben.

Du kannst jedes Bild in jedem Winkel drehen. Es ist schon wichtig, ob dann immer noch das ganze Bild oder Teile des Bildes gezeigt werden sollen.

Dein Hinweis auf die Funktion rotate.m zeigt, dass solche Funktionen nicht mit einfachen Befehlen aufgebaut sind. Alle Matlabfunktionen, mit denen man eine Matrix drehen kann, drehen im Centrum. Du musst nur dafür sorgen, dass das deine Koordinate BS_1 gleich dem Centrum entspricht. Ich habe das Bild zunächst gedreht und dann so verschoben, dass ein Drehpunkt außerhalb der Bildmitte dargestellt wird. Alles dabei Überflüssig kann man wegschneiden.

Du kannst ja versuchen, mit der Funktion rotate.m dein Ziel zu erreichen und gleichzeitig einen anderen Weg beschreiten. So ist man schneller am Ziel. Hier mein Code:

Code:

A=imread('cameraman.tif');
AA=imrotate(A,-15);
figure; imshow(AA)
B([1:size(AA,1)] + 100, [1:size(AA,2)] + 100) = AA;  % Drehen und verschieben
figure; imshow(B,[])

[x1,y1]=ginput(1);  % Alles Überflüssige entfernen
[x2,y2]=ginput(1);
cropped=B((y1:y2),(x1:x2));
imshow(cropped)
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: 21.08.2013, 07:56     Titel:
  Antworten mit Zitat      
Ich habe mir dein Problem noch einmal angesehen und habe mir ein ähnliches Bild gemacht. Ich finde, es ist nicht notwendig, BS_1 zum Drehpunkt zu machen. Selbst wenn du im Centrum drehst, liegen irgendwann deine Punkte BS1 und BS2 auf einer Linie. Lediglich die Lage von BS1 verschiebt sich oder ist das ein Problem? Sonst bleibt nur der Befehl "imrotate" übrig.

Wenn du BS1 wirklich als Drehpunkt benötigst, musst du nach dem Drehen einfach das Bild so verschieben (wie gezeigt), dass die beiden BS1 übereinander liegen.
Private Nachricht senden Benutzer-Profile anzeigen
 
JaWi
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 56
Anmeldedatum: 10.08.13
Wohnort: Deutschland
Version: ---
     Beitrag Verfasst am: 21.08.2013, 09:47     Titel:
  Antworten mit Zitat      
- Ohne Code und vorher-Zustand kann ich aber leider nicht sehen, was du gemacht hast und deswegen weder zustimmen noch ablehnen.
- Ja, es muss immer um den Punkt BS1 gedreht werden, dass hinterher eine Waagerechte herauskommt ist nur ein Sonderfall, ich muss einfach immer mit Ursprung BS1 um einen bestimmten Winkel drehen, der aber variiert
- ich brauche stets weiterhin das vollständige Bild zwecks zoom-Funktionen, d.h. es muss nach der Drehung nicht in den Achsen sichtbar sein, muss aber noch abzeigbar sein
- wenn mir dann nur imrotate übrig bleibt, sind wir wieder Anfang, denn mein Minimalbeipsiel ist mit imrotate und wie beschrieben bekomme ich es nicht hin, dass um BS1 gedreht wird
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: 21.08.2013, 10:28     Titel:
  Antworten mit Zitat      
Den Code habe ich doch gepostet!

Mir fällt im Moment nur die Lösung ein, deinen Drehpunkt in das Centrum eines Bildes zu legen. Dafür brauchst du eine leere Matrix, in der du das Bild verschieben kannst, damit der Drehpunkt im Centrum liegt. Das Centrum zeigt dir "axescenter" an:

Code:
I1=double(imread('cameraman.tif'));
I2=ones(500,500);
I1=im2double(I1);
I2=im2double(I2);
I3=I2;
links=200;
oben=200;
row=(1:size(I1,1))+oben;
col=(1:size(I1,2))+links;
I3(row,col,:)=I3(row,col,:)+I1;
figure; imshow(I3,[]);
axescenter
I3=uint8(I3);
Ro=imrotate(I3,-65);
figure; imshow(Ro);
axescenter
Private Nachricht senden Benutzer-Profile anzeigen
 
JaWi
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 56
Anmeldedatum: 10.08.13
Wohnort: Deutschland
Version: ---
     Beitrag Verfasst am: 21.08.2013, 10:34     Titel:
  Antworten mit Zitat      
Ja tut mir leid, ich dachte der Code gehört zu dem Post, dass das Bild beschnitten und nicht um die Mitte gedreht wird, was ja nicht meinen Bedürfnissen entspricht, deswegen habe ich mir den gar nicht angesehen.
Bei deinem Beispiel erhalte ich die Fehlermeldung "Undefined function or variable 'axescenter'.", ich kann es nicht ausführen.
Aber die Idee, die Werte auf direkt auf die Bildmatrix zu rechnen, ist natürlich wirklich sinnvoll!
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: 21.08.2013, 11:14     Titel:
  Antworten mit Zitat      
Sorry, axescenter ist eine Funktion, die nicht zu Matlab gehört.

http://www.mathworks.com/matlabcent.....exchange/22956-axescenter

Es gibt auch noch eine andere Möglichkeit. Um nur die Achse zu verschieben, könnte man auch das Bild um diese Werte auf 2 Seiten erweitern. Dazu gehört der Befehl: padarray. Er fügt in einer Einstellung auf der rechten und unteren Seite leere Streifen an. Wenn der Drehpunkt anders gelagert ist, so wie bei dir, müsste man nur das Bild vorher drehen, padarray ausführen und das Bild wieder zurück drehen. Vielleicht ist das sogar noch einfacher
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2  Weiter

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.