跳转至

Determining the color table index from a color table array

原文链接: https://www.nv5geospatialsoftware.com/Learn/Blogs/Blog-Details/determining-the-color-table-index-from-a-color-table-array

17955 Rate this article:

No rating

Determining the color table index from a color table array

Anonym Thursday, August 1, 2013

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.

Mobile Devices and Anytime, Anywhere Strategies How the Cloud Impacts Earth Observation for Environmental Monitoring