Von colormap auf graustufen

18 views
Skip to first unread message

Thom

unread,
Jul 8, 2009, 2:41:21 PM7/8/09
to
Hi,
um ein Bild aus Graustufen in Falschfarben umzuwandeln, gehe in etwa
ich folgendermaßen vor:

--
from pylab import *
import Image
bild=Image.open("test.png")
bild=Image.fromarray((cm.jet(array(bild.convert(mode="L")))[:,:,0:3]
*255).astype("uint8"))
bild.save("test_bunt.png")
--
(das [:,:,0:3] ist weil cm.jet(...) wohl n bild mit alpha-kanal
ausgibt, mich interessiert aber nur RGB = [0:3])

Wie kann ich jetzt ein solches farbiges Bild wieder in Graustufen
umwandeln, wenn ich die colormap kenne, mit der die farbige Version
erstellt wurde? Gibts da nen Trick?

Danke schonmal, ciao
Thom

Diez B. Roggisch

unread,
Jul 8, 2009, 3:56:20 PM7/8/09
to
Thom schrieb:

> Hi,
> um ein Bild aus Graustufen in Falschfarben umzuwandeln, gehe in etwa
> ich folgenderma�en vor:

>
> --
> from pylab import *
> import Image
> bild=Image.open("test.png")
> bild=Image.fromarray((cm.jet(array(bild.convert(mode="L")))[:,:,0:3]
> *255).astype("uint8"))
> bild.save("test_bunt.png")
> --
> (das [:,:,0:3] ist weil cm.jet(...) wohl n bild mit alpha-kanal
> ausgibt, mich interessiert aber nur RGB = [0:3])
>
> Wie kann ich jetzt ein solches farbiges Bild wieder in Graustufen
> umwandeln, wenn ich die colormap kenne, mit der die farbige Version
> erstellt wurde? Gibts da nen Trick?

Garnicht. Um mal mit ein paar rostigen Mathekenntnissen einen
Erklaerungsversuch zu starten: Deine Abbildung von Farbe -> Grau ist
nicht bijektiv, d.h. sie ist nicht invertierbar - zwei oder mehr Farben
werden auf einen Grauwert abgebildet. Was auch recht klar im
Speicherbedarf wird - aus 24Bit/Pixel auf 8Bit.. da geht n bueschen was
verloren.

Diez

Mark Asbach

unread,
Jul 10, 2009, 9:01:53 AM7/10/09
to
Hallo Thom,

> um ein Bild aus Graustufen in Falschfarben umzuwandeln, gehe in etwa

> ich folgenderma�en vor:

Erlaube mir hier den Verweis auf ein viel zu selten beachtetes Paper mit
dem Titel "Rainbow Color Map (still) considered harmful".

http://ieeexplore.ieee.org/xpls/abs_all.jsp?arnumber=4118486

BibTeX Referenz h�ngt an.


Aber zu Deinem Problem:

> Wie kann ich jetzt ein solches farbiges Bild wieder in Graustufen
> umwandeln, wenn ich die colormap kenne, mit der die farbige Version
> erstellt wurde? Gibts da nen Trick?

Die R�ckwandlung von Farbe in Graustufen w�rde ich mit numpy machen. Da
im Gegensatz zur Annahme von Diez eine Colormap bijektiv sein sollte
(wer will sich schon Daten anschauen, die mehrdeutig sind?), kannst Du
die R�cktransformation genau so machen, wie die Hintransformation,
n�mlich mittels einer Lookup-Table bzw. 'fancy indexing'.

Beispielcode:

----------------- SCHNIPP -----------------

import numpy
import pylab

# create color map that maps to green -> red
gray_to_color = numpy.vstack ((numpy.arange (255,-1, -1),
numpy.arange (0,256),
numpy.zeros (256)))
gray_to_color = gray_to_color.transpose().astype(numpy.uint8)


# create silly demo image
gray_image = numpy.array ([[ 0, 0, 0, 255, 0, 0, 0],
[ 0, 0, 255, 150, 255, 0, 0],
[ 0, 255, 150, 80, 150, 255, 0],
[255, 150, 80, 20, 80, 150, 255]],
dtype=numpy.uint8)

# show silly demo image
pylab.gray()
pylab.imshow(gray_image)
pylab.show()

# convert to silly color image via 'fancy indexing' and show result
color_image = gray_to_color [gray_image]
pylab.imshow(color_image)
pylab.show()

# create reverse LUT
color_to_gray = numpy.zeros ((256, 256, 256), dtype=numpy.uint8)
color_to_gray [gray_to_color[:,0],
gray_to_color[:,1],
gray_to_color[:,2]] = numpy.arange (0, 256,
dtype=numpy.uint8)


# use reverse LUT
new_gray_image = color_to_gray[color_image[:,:,0],
color_image[:,:,1],
color_image[:,:,2]]
pylab.imshow(new_gray_image)
pylab.show()

----------------- SCHNAPP -----------------

Hier noch die Literaturempfehlung:

@article{BoTa07,
Address = {Los Alamitos, CA, USA},
Author = {Borland, David and Taylor II., Russell M.},
Issn = {0272-1716},
Journal = {IEEE Comput. Graph. Appl.},
Number = {2},
Pages = {14--17},
Publisher = {IEEE Computer Society Press},
Rating = {5},
Read = {Yes},
Title = {Rainbow Color Map (Still) Considered Harmful},
Volume = {27},
Year = {2007}}

Viel Erfolg,
Mark

--
Dipl.-Ing. Mark Asbach Tel +49 (0)241-80-27677
Institut f�r Nachrichtentechnik Fax +49 (0)241-80-22196
Melatener Stra�e 23 asb...@ient.rwth-aachen.de
D-52072 Aachen http://www.ient.rwth-aachen.de

Diez B. Roggisch

unread,
Jul 10, 2009, 9:06:22 AM7/10/09
to
> Die R�ckwandlung von Farbe in Graustufen w�rde ich mit numpy machen. Da

> im Gegensatz zur Annahme von Diez eine Colormap bijektiv sein sollte
> (wer will sich schon Daten anschauen, die mehrdeutig sind?), kannst Du
> die R�cktransformation genau so machen, wie die Hintransformation,
> n�mlich mittels einer Lookup-Table bzw. 'fancy indexing'.


Oh mann. Selten ein Posting so missverstanden wie das von Thorn.
Verzeiht den FUD.

Diez

Reply all
Reply to author
Forward
0 new messages