Converting an indexed image into an RGB image
Anonym
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
[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.