16390 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.