Determining the color table index from a color table array
Anonym
Today I'd like to show something I encountered recently that's not terribly important, but that I found interesting.
In IDL 8 (a.k.a. New) Graphics, the RGB_TABLE property can take as input a color table index, an integer on 0-74. Internally, the color information is converted to a color table array, a 3 x 256 byte array. For example, here I display a distance map (with the DIST function) as an image with color table 70:
IDL> g = image(dist(400), rgb_table=70)
When I retrieve the color table, it's been converted into a color table array:
IDL> help, g.rgb_table
<Expression> BYTE = Array[3, 256]
What if I'd like to get back the color table index, 70? Here's a program that attempts to solve this problem:
; docformat = 'rst'
;+
; Attempts to determine which built-in color table matches an input [256,3]
; or [3,256] array of colors.
;
; :params:
; rgb_table: in, required, type=byte
; A [256,3] or [3,256] byte array of color table values.
;
; :returns:
; The color table index if matched, else the input is passed through unchanged.
;
; :requires:
; IDL 8.2.1
;
; :author:
; Mark Piper, VIS, 2013
;-
function determine_colortable, rgb_table
compile_opt idl2, hidden
on_error, 2
do_transpose = (size(rgb_table, /dimensions))[0] eq 3
!null = colortable(get_names=all_ct_names)
for ct_index=0, n_elements(all_ct_names)-1 do begin
ct_array = colortable(ct_index, transpose=do_transpose)
if array_equal(rgb_table, ct_array) then return, ct_index
endfor
return, rgb_table ; pass through
end
The key is the use of the COLORTABLE function, introduced in IDL 8.2.1. Use DETERMINE_COLORTABLE (I couldn't think of a better name) to determine the color table used in the graphic "g" above:
IDL> print, determine_colortable(g.rgb_table)
70
The idea for this program came from a discussion with Eddie Haskell on the IDL Engineering team.