Verfasst am: 29.11.2012, 11:04
Titel: Colormap verändern und damit Bild speichern/umwandeln
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:
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,:) = [000];
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.
_________________
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...
_________________
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.
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?
_________________
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,[113]);
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)
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.