16105 Rate this article:

Converting an indexed image into an RGB image

Here’s an example of how to convert an indexed image into an RGB image. Though they require more memory, I often find RGB images easier to work with because I don’t have to deal with color tables: I invariably forget to read the color table of an indexed image or pass the color table to a display routine in IDL. Start by reading an indexed image from a PNG file in IDL’s examples/data directory:
IDL> f = file_which('africavlc.png')
IDL> img = read_image(f, r, g, b)
IDL> help, img, r, g, b
IMG             BYTE      = Array[540, 560]
R               BYTE      = Array[256]
G               BYTE      = Array[256]
B               BYTE      = Array[256]
The variable img is a two-dimensional array. The value of each element of img is mapped as an index into the arrays r, g and b; this is what gives each pixel of the image its RGB color[1]. Visualize the image with:
IDL> i_idx = image(img, rgb_table=[[r],[g],[b]])
To create a single RGB image from these four arrays, perform the following array concatentation[2]:
IDL> rgb = [[[r[img]]], [[g[img]]], [[b[img]]]]
IDL> help, rgb
RGB             BYTE      = Array[540, 560, 3]
This makes an RGB image with band sequential interleaving. Use TRANSPOSE to convert it to a pixel-interleaved RGB image:
IDL> rgb = transpose(rgb, [2,0,1])
IDL> help, rgb
RGB             BYTE      = Array[3, 540, 560]
View the result with:
IDL> i_rgb = image(rgb)
Last, write the RGB image to a new PNG file:
IDL> write_png, 'africavlc_rgb.png', rgb
An RGB image created from an indexed image
[1] For example, the value of img at [200,300] is 65. The RGB triple formed by [r[65], g[65], b[65]] is [50, 145, 19], the greenish color you see at this location in img.
[2] The values of img are being used as subscripts into the arrays r, g and b, so r[img] is a 540 x 560 array of 8-bit intensities in the red channel. Doing the same for g and b provides the intensities for the green and blue channels. (This is the inverse of [1]!) Experiment with img as a simple 2 x 2 array of colors to see how this works.