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

Wieso aendert sich die Colorbar???

 

Sco
Forum-Meister

Forum-Meister


Beiträge: 699
Anmeldedatum: 15.08.10
Wohnort: Dundee
Version: 2008a, 2010a
     Beitrag Verfasst am: 31.01.2011, 21:30     Titel: Wieso aendert sich die Colorbar???
  Antworten mit Zitat      
Hallo,

ich habe folgendes Problem. Ich habe mir zu einer Bilderserie eine bestimmte Colormap und Colorbar gebastelt (siehe Code). Zuerst lade ich ein Bild, wandle es in ein RGB-Bild (mit meiner Colormap) um und stelle es dann mit imshow und meiner Colorbar dar. Wie in dem unteren Minimalbeispiel klappt dies auch super fuer das Clownbild. Nun ersetze ich dieses Bild durch ein neues Bild (auch zu RGB mit meiner Colormap umgewandelt) mittels dem "set"-Befehl fuer das "CData"-Feld von imshow. Das neue Bild wird auch angezeigt, jedoch stimmt meine Colorbar nicht mehr? Matlab hat die YTicks einfach geaendert, warum? Und wie kann ich dies umgehen?

Hier das Minimalbeispiel, ich habe noch 2 Varianten fuer das 2. Bild (I2) auskommentiert um zu zeigen was z.B. funktioniert und was nicht:
Code:

load clown
% manal colormap
cmap = zeros(255,3);
cmap(1,:) = [1 1 1];
cmap(2:20,:) = repmat([1 1 1],19,1);
cmap(21:30,:) = repmat([0 1 1],10,1);
cmap(31:40,:) = repmat([0 0.5 0],10,1);
cmap(41:50,:) = repmat([1 1 0],10,1);
cmap(51:60,:) = repmat([0.87 0.49 0],10,1);
cmap(61:70,:) = repmat([1 0 0],10,1);
cmap(71:80,:) = repmat([0.48 0.06 0.89],10,1);
cmap(81:90,:) = repmat([0.5 0.5 0.5],10,1);
cmap(91:100,:) = repmat([0 0 0],10,1);
cmap(101:110,:) = repmat([1 0 1],10,1);
cmap(111:140,:) = repmat([1 1 1],30,1);
cmap(141:255,:) = repmat([1 1 1],numel(141:255),1);

hs = imshow(ind2rgb(round(X),cmap));
set(gcf,'Colormap',cmap);
% create colorbar
YTicks = [0 20 30 40 50 60 70 80 90 100 110];
sl_YTickLabels = sprintf('%0.f|',YTicks);
sl_cb = colorbar('location','EastOutside',...
   'YAxisLocation','right','YTickMode','manual',...
   'YTickLabelMode','manual','YLimMode','manual',...
   'YTick',YTicks,'YTickLabel',sl_YTickLabels,...
   'Ylim',[0 110],'FontSize',8);

pause(1.5);

I2 =  ones(size(X,1),size(X,2)); % wrong colorbar
% I2 =  round(rand(size(X,1),size(X,2)))*21; % correct colorbar!
% I2 =  round(rand(size(X,1),size(X,2)))*20; % wrong colorbar!
set(hs,'CData',ind2rgb(round(I2),cmap));
 


Es muss wohl irgendwas mit dem weissen Bereich von 1 bis 20 zu tun haben. Ersetze ich naehmlich z.B.:
Code:

cmap(2:20,:) = repmat([1 1 1],19,1);
I2 =  ones(size(X,1),size(X,2));
 

durch
Code:

cmap(2:20,:) = repmat([1 0 0],19,1); % red instead of white
I2 =  ones(size(X,1),size(X,2))*2; % arrays with 2's
 

funktioniert es wieder.

Schon einmal vielen Dank fuer jegliche Tips!

MFG

Sco

Zuletzt bearbeitet von Sco am 31.01.2011, 23:26, insgesamt 2-mal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen


Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 31.01.2011, 23:03     Titel:
  Antworten mit Zitat      
Hallo Sco,

Kannst Du bitte ein paar Spaces in die riesenlangemegaschlangenartige Code Zeile einfügen? Dann könnte ich Deine Mitteilung leichter lesen, da ich auf meinem lustigen 1024 Pixel breiten Bildschirm nicht hin und herscrollen müsste.

Hilft es, wenn Du in IMSHOW die ColorMap Property manuell setzt?

Danke, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Sco
Themenstarter

Forum-Meister

Forum-Meister


Beiträge: 699
Anmeldedatum: 15.08.10
Wohnort: Dundee
Version: 2008a, 2010a
     Beitrag Verfasst am: 31.01.2011, 23:32     Titel:
  Antworten mit Zitat      
Hallo Jan,

Zitat:

Kannst Du bitte ein paar Spaces in die riesenlangemegaschlangenartige Code Zeile einfügen?

Da waren doch schon 3 Spaces Smile. Habe es nochmal überarbeitet.
Zitat:

Hilft es, wenn Du in IMSHOW die ColorMap Property manuell setzt?

Wenn ich dies tue, erhalte ich folgende Warnung und der Fehler bleibt logischerweise bestehen
Code:

hs = imshow(ind2rgb(round(X),cmap),'Colormap',cmap);


 Warning: Ignoring 'Colormap' parameter provided with a truecolor image.
 In imuitools\private\imageDisplayValidateParams>validateMap at 97
  In imuitools\private\imageDisplayValidateParams at 32
  In imuitools\private\imageDisplayParseInputs at 79
  In imshow at 199
 

Falls du was anderes meintest, dann beschreib es bitte nochmal genauer. Das Bild muss aber ein RGB-Bild sein, da ich ein Overlay eines grauen und farbigen Bildes (mit Transparenz) mache (ohne die Freeze Color Funktion aus der FEX). Ansonsten ist das Minimalbeispiel auch lauffähig, falls du selber etwas anderes probieren möchtest.

Noch eine kleine Frage am Rande (trotz das die erste noch nichtmal beantwortet ist): Ist es schneller bei callbacks von uicontrols Variablen per settappdata zu übergeben (und per getappdata in callback zu laden) oder direkt mit bei der callbackdeklaration:
Code:

setappdata und getappdata
vs
uicontrol(...,'callback',{mycallback,a,b,c})
 

Ich dachte so an ca. 10 Variablen.

Danke für weitere Hilfe.

MFG

Sco

Zuletzt bearbeitet von Sco am 31.01.2011, 23:48, insgesamt einmal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 31.01.2011, 23:45     Titel:
  Antworten mit Zitat      
Hallo,

ich sag einfach mal: ausprobieren. Meine Vermutung wäre, dass die uicontrol-Variante schneller ist, dass die zeitlichen Unterschiede im Verhältnis zur restlichen Laufzeit aber vernachlässigbar sind; allerdings kann ich da falsch liegen.

Wenn immer die gleichen 10 Variablen verwendet werden sollen, würde ich die der Übersichtlichkeit halber in eine Struktur packen.

Wenn du die GUIs programmatisch mit uicontrol-Befehlen aufbaust, könntest du die Callbacks auch als nested functions programmieren. Dann haben sie automatisch Zugriff auf alle Variablen. Du musst allerdings höllisch aufpassen, dass du nicht eine dieser Variablen versehentlich überschreibst. Aus diesem Grund bin ich eigentlich kein Befürworter dieser Variante.

Die andere Frage überlasse ich Jan Smile

Grüße,
Harald
_________________

1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
Private Nachricht senden Benutzer-Profile anzeigen
 
Sco
Themenstarter

Forum-Meister

Forum-Meister


Beiträge: 699
Anmeldedatum: 15.08.10
Wohnort: Dundee
Version: 2008a, 2010a
     Beitrag Verfasst am: 01.02.2011, 14:13     Titel:
  Antworten mit Zitat      
Hallo,

ich habe die Loesung fuer mein Colorbarproblem (nach intensiver google Suche) selber gefunden. Ich muss:
Code:

caxis manual
% bzw.
set(hax,'CLimMode','manual');
 

nach dem imshow-Befehl einfuegen und schon ist alles wie es sein soll. Trotzdem vielen Dank an Jan und Harald.

MFG

Sco
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 01.02.2011, 15:10     Titel:
  Antworten mit Zitat      
Hallo Sco,

Ich hatte vergeblich in den FIGURE Properties nach ColorMapMode gesucht. Aber die entsprechende Eigenschaft gehört zu den AXES, wie Du ja richtig herausgefunden hast.

Die Geschwindigkeit der Callbackaufrufe ist wahrscheinlich nicht signifikant unterschiedlich. Sie hängt aber auch davon ab, wie groß die übergebenen Arrays sind. Wenn ein 200MB-Array dabei ist, können schon Unterschiede auftreten, falls auf die eine Weise Matlab eine SharedDataCopy schaffte, auf die andere aber nicht. In dem Fall hilft leider nur ausprobieren - und mit der nächtsen JIT-Version kann sich die Situation wieder ändern.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
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.