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

Colormap verändern und damit Bild speichern/umwandeln

 

Jasey Jay
Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 29.11.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.11.2012, 11:04     Titel: Colormap verändern und damit Bild speichern/umwandeln
  Antworten mit Zitat      
Hallo,

ich habe folgendes Problem: ich möchte ein Graustufen-Bild in ein Falschfarben-Bild umwandeln, wobei jedoch alle Pixel, die wirklich schwarz sind, also den Wert 0 haben, auch schwarz bleiben sollen.

Ich hatte dazu den Ansatz das ganze über verschiedene Colormaps zu realisieren. Zuächst habe ich mein 8Bit-Graustufen-Bild (Dimension M x N x 1) in eine RGB-Bild (M x N x 3) umgewandelt:

Code:

[m n]=size(Bild);
BildRGB=zeros(m,n,3);
BildRGB(:,:,1)=Bild;
BildRGB(:,:,2)=BildRGB(:,:,1);
BildRGB(:,:,3)=BildRGB(:,:,1);
Bild=BildRGB/255;
 


Im Anschluss habe ich es auf Basis der Colormap Gray in ein Indexed Image umgewandelt:

Code:

X=rgb2ind(Bild, Gray);
 


Danach habe ich der Variable map die Colormap Jet zugeordnet, welche ja sehr gut mein Falschfarbenproblem löst. Um die schwarzen Flächen auch schwarz zu lassen, habe ich dem ersten Element von map den wert [0 0 0] zugeordnet, da der erste Wert in der colormap Gray ja für schwarz steht und somit eigtl nur an die gleiche Position in der neuen Colomap übertragen werden müsste. Wenn ich mir mein Bild per imagesc anzeigen lasse und dann die Colormap map darauf anwende, funkitioniert das auch und ich habe ein Falschfarbenbild mit teilweise schwarzen Stellen. Wenn ich das Bild dann aber mit ind2rgb wieder zurücktransformieren will oder es mit imwrite speichern will, dann sind die schwarzen Flächen wieder weg und es ist als ob ich die ganz normale Colormap Jet verwendet hätte:

Code:

imagesc(X)    % Bild wird in Graustufen angezeigt
map = Jet;
map(1,:) = [0 0 0];
colormap(map)  % Hier wird das Bild angezeigt, wie es sein soll, bunt mit schwarzen Stellen

imwrite(X, map, 'Bild.bmp')
Bild = ind2rgb (X,map);
imshow(Bild);
imwrite(Bild, 'Bild2.bmp') % Hier sind die schwarzen Flächen auf den Bildern wieder weg/blau
 


Ich habe leider keine Idee, warum die veränderte Colormap, bei Speichern nicht funtioniert. Kann wir jemand aushelfenß

Danke schonmal

Grüße
Jasey


P.S.: ich könnte natürlich auch die colormaps weglassen und eine manuelle Farbzuordnung von grau zu bunt machen. Da es aber sehr viele und sehr große Bilder sind, würde das ganze vermutlich unverhältnismäßig lange dauern, weshalb ich eine andere Lösung brauche.
_________________

Go MatLab! Go! Go! Go MatLab! Wink
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: 29.11.2012, 11:47     Titel:
  Antworten mit Zitat      
Moin,

wäre es nicht einfacher ohne colormap, in dem du die einzelnen Grauwertbereiche in den Farbauszügen indizierst?

Grüsse

Hubertus
Private Nachricht senden Benutzer-Profile anzeigen
 
Jasey Jay
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 29.11.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.11.2012, 12:02     Titel:
  Antworten mit Zitat      
naja dann müsste ich aber auf jedem Bild jedes Pixel abtasten und dann jedem Grauwert eine Farbe zuordnen oder? Das ist zum einen relativ aufwändig und zum anderen würde es wie gesagt aufgrund der hohen Bildanzahl und Bildauflösung einen sehr zeitintensiven Rechenaufwand bedeuten, den ich eigtl gern vermeiden würde, da diese Falschfarbenumwandlung auch nur ein Teilprozess in einer übergeordneten Funktion ist, die von sich aus auch schon recht rechenintensiv ist. Deshalb fand ich die Lösung mit den colormaps eigtl recht elegant, da sie sehr schnell geht. Es funktioniert ja prinzipiell auch, bis auf den letzten Schritt...
_________________

Go MatLab! Go! Go! Go MatLab! Wink
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: 29.11.2012, 12:27     Titel:
  Antworten mit Zitat      
OK, du musst nicht jedes Pixel indizieren. Es werden ganze Graubereiche indiziert. Mir ist bei deiner Lösung im Moment nicht klar, wo der Fehler auftritt. Du musst beim Speichern die Map mit übergeben. Um zu kontrollieren, ob das funktioniert, musst du beim Einlesen natürlich die Map mit berücksichtigen und auch bei imshow: (Bild,map). Wenn ich das berücksichtige habe ich keinen Fehler.
Private Nachricht senden Benutzer-Profile anzeigen
 
Jasey Jay
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 29.11.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.11.2012, 13:05     Titel:
  Antworten mit Zitat      
Ja na berücksichtigt hab ich die Map eigtl immer, siehe Code oben. Ich hab in der Map jetzt einfach mal nicht nur den ersten Wert sondern die ersten 5 mit dem Wert [0 0 0] überschrieben und dann funktionierts plötzlich auch beim Speichern.

Wie genau meinst du das denn mit dem Graubereiche indizieren? Wie funktioniert das und wie kann man das umsetzen? Geht das ähnlich schnell wie die Colormap-Umwandlung?
_________________

Go MatLab! Go! Go! Go MatLab! Wink
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: 29.11.2012, 13:14     Titel:
  Antworten mit Zitat      
Du musst selber entscheiden, ob das auf dein Bild passt. Der Vorteil ist, dass du die Map nicht mehr mitschleppen musst:

Code:
I=imread('cameraman.tif');
I2=repmat(I,[1 1 3]);
R=I2(:,:,1);
ind=(R>10) & (R<50);  % Graubereiche festlegen
ind2=(R>120) & (R<180);
Y=R;
Y(ind)=255; % indizieren auf einen anderen Bereich
Y(ind2)=5;
G=I2(:,:,2);  % oder hier indizieren
B=I2(:,:,3);
s=cat(3,Y,G,B);
figure; imshow(s)
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.