Escolar Documentos
Profissional Documentos
Cultura Documentos
El Programa de Histolmage
El programa que quiero escribir se llamar HistoImage. Es muy simple. Ser mostrar una imagen con los ejes alrededor. Por encima de la imagen ser una barra de colores que se indicar los valores de la imagen. Y por encima de la barra de colores aparecer un histograma de los valores de los pxeles de la imagen. En otras palabras, el histograma muestra el nmero de pxeles en la imagen correspondiete a un valor de la imagen en particular. Usted ve una ilustracin de cmo el programa
aparecer en la Figura 94. La lista completa del cdigo fuente del programa se puede encontrar en la pgina 409 "Programa HistoImage". Y el archivo histoimage.pro esta entre los archivos de programa que ha descargado para su uso con este libro.
Figura 94: El programa HistoImage consta de histograma, una barra de colores, y una imagen rodeado de ejes.
PRO HistoImage, $ imagen, $ AxisColorName = axisColorName, $ BackColorName = backcolorName, $ Binsize = binsize, $ ColorTable=colortable, $ DataColorName = datacolorName, $ Depurar = debug, $ _Extra=extra, $ ImageColors=imagecolors, $ Max_Value=max_value, $ NoLoadCT=noloadct, $ XScale=xscale, $ YScale=yscale
El primer y nico parmetro posicional, imagen, son los datos de la imagen que se pasarn en el programa. Voy a tener que comprobar si se trata de un array 2D, ya que no tiene mucho sentido para calcular el histograma de una imagen 24_bit o 3D, pero lo har retrasar esto por un momento. Vers tres nombres "colores" en la lista de palabras clave: AxisColorName, BackColorName, y DataColorName. Estos sern los nombres de los colores a utilizar para los ejes y otras anotaciones, los antecedentes y los datos, respectivamente. Voy a usar nombres de los colores de estos, porque uno de mis objetivos para el programa es utilizar colores que sean independientes del estado de descomposicin del color o la profundidad de la pantalla. S que el programa GetColor. Que figura en el apartado en la pgina 87 "Obtencin de dispositivos independientes de Colores" tiene la capacidad de darme un color tal cual si le pregunto por uno de los 16 colores que conocen por sus nombres. Al permitir que el usuario seleccione sus colores propios, les doy un poco de control sobre cmo se ven las cosas en la pantalla. Tambin le permito al usuario especificar el nmero ndice de la tabla de colores con la palabra clave Colortable. Los datos de las imgenes se pueden ampliar en ndices cargados por la tabla de colores. Los Colores de las imgenes casi siempre presentan un dilema para m. Por un lado, tengo muchas ganas de ajustar los colores de la imagen de forma correcta, especialmente si estoy llamando este programa desde la Lnea de comandos de IDL. Pero por otro lado, a menudo prefiero que la manipulacin del color sea hecho fuera del cdigo del programa. Por ejemplo, en el programa de colores de imagen widget que son a menudo controladas por una herramienta cambiadora de color como XLoadCT o XColors. Carga una tabla de colores dentro de un programa de visualizacin de grficos a menudo interfieren con los colores que estn siendo manipulados en otros lugares. Me comprometo en este programa mediante la definicin de dos parmetros clave adicionales: NoLoadCT y ImageColors. NoLoadCT ser un indicador de que si se establece evitar que el programa se cargue la tabla de colores especificada por la palabra clave ColorTable. Es decir, voy a tener una manera de convertir la tabla de colores cargados desde fuera del programa, si esto es lo que yo quiero hacer. ImageColors ser una palabra de salida que me permita aprender desde fuera del programa la cantidad de colores deben ampliarse a los datos de la imagen. Esta informacin es esencial si voy a manejar los colores fuera del programa. (Aqu voy a cargar los colores de la imagen a partir de un vector ndice de color 0. Si no fuera el caso, tambin puede definir una palabra clave, por ejemplo BottomIndex, que indicara la parte inferior de los ndices de color de la imagen.) La palabra clave BinSize es una palabra clave que usa el comando Histogram. Usar el comando Histogram dentro de este programa para calcular el histograma y es posible que quiera el usuario ser capaz de configurar las propiedades de este comando. Tenga en cuenta que no proporciono todas las palabras clave que estn disponibles para Histogram, slo aquellos usuarios que quieran especficamente usuario manipularlo. Del mismo modo, la palabra clave es una
palabra clave Max_Value es una palabra clave del comando Plot y que a menudo se encuentran utilidad en los histogramas, por lo defino aqu. Es muy posible (sobre todo con el comando Plot) querer manipular las palabras claves Histogran, Plot o TVImage que no se definen aqu. Por ejemplo, puede querer diferentes ejes de anotaciones o marcas. Por esta razn, incluir una palabra clave _Extra, para tomar ventaja de la herencia de palabras claves, que se describe en el "Pasando Palabras Claves No Definidas de la Herencia de Palabras Clave" en la pgina 216. Hay dos palabras claves, XScaIe y YScale, que se utilizarn para definir el rango y escala de los ejes que rodean la imagen. Estas palabras claves de entrada sern matrices de dos elementos que definen la extensin mnima y mxima de los ejes. Por ltimo, hay una palabra clave Debug, que tengo la intencin de utilizar en la parte del controlador de errores del cdigo para forzar un rastreo del lugar donde se produjo el error. Normalmente a m no me gusta escribir errores en la ventana de registro de comandos a menos que el usuario solicite expresamente lo contrario. Utilizando una palabra clave Debug me da una manera fcil de depurar mi cdigo, sin que los usuarios no familiarizados se aterroricen con aterradoras largas lneas de texto de error.
Tenga en cuenta que cancelo el controlador de errores de captura como el primer paso en la parte de control de errores del cdigo. Hago esto porque hago muchos errores de escritura durante el desarrollo y tienen a veces errores en mi cdigo de gestin de errores. Esto har que IDL haga un bucle infinito. Llame a esto una buena programacin defensiva si no puede pensar en una ms suave explicacin. Tenga en cuenta que estoy aadiendo un poco ms de informacin (la cadena de retorno) respecto al normal mensaje de error. Slo quiero que el usuario sepa lo que estoy haciendo con el error. Y fjense que la palabra clave Traceback est configurado para Error_Message slo si el usuario establece la palabra clave Debug cuando l o ella llaman
al programa HistoImage. Puesto que la palabra clave Debug o bien puede estar encendido o apagado, puse su valor con Keyword_Set, que slo devuelve un 0 1.
Tenga en cuenta que he usado N_Elemens para comprobar el parmetro de la imagen, en lugar de N_Params, se podra haber esperado que utilice un parmetro posicional. Hay que recordar que N_Elemens me dice si el parmetro imagen es definida o no, mientras que N_Params me cuenta el nmero de parmetros posicionales del procedimiento de llamada. (Consulte "Definicin de Parmetros opcionales u posicionales obligatorios "en la pgina 212 para obtener ms informacin.)Algunos usuarios inexpertos estn seguros de llamar al rograma HistoImage con un solo parmetro de posicin que es una variable no definida. Mediante el uso de N_Elements te informo de esta eventualidad. Si no se proporciona un parmetro de imagen, simplemente cargar los datos de elevacin mundiales establecidos con el programa LoadData que ha descargado para su uso con este libro. Ahora que tengo un parmetro de imagen, voy a comprobar para asegurarse de que es un array 2D, ya que es tambin un requisito para los datos del histograma para que tenga sentido. Puedo usar el comando Size con la palabra clave N_Dimensions configurado para determinar el nmero de dimensiones de la imagen. (Tenga en cuenta que la palabra clave N_Dirnensions para el comando Size es bastantemente reciente a la Introduccin del lenguaje de programacin IDL. Si est utilizando una versin de IDL posterior a IDL 5.2, se puede obtener la misma informacin del comando Size directamente. Ver su ayuda On_Line para ms detalles).
ndim = size(image,/N_Dimensions) if ndim NE 2 then $
El comando message ser un error, que ser manejada por mi Catch manejo de errores de cdigo. Tenga en cuenta que la palabra clave NoName se establece para evitar ERROR_MESSAGE que informe el nombre del programa de dos veces.
El tamao de bin o biene ser 2, o ser el rango de datos de imagen dividido por 128, si esta ltima cifra es mayor. Estoy haciendo la suposicin aqu que yo no voy a tener datos de imagen de punto flotante, que oscila de 0,0 a 1,0, por ejemplo. Mi programa se ver mal con esos datos, pero las posibilidades parecen tan baja de este acontecimiento que estoy dispuesto a correr el riesgo. Y, de todos modos, si el usuario tienen datos de imagen de esa manera, que siempre podra especificar un tamao del bin adecuado para la visualizacin del histograma. Observe el uso del IDL "mayor que" (>). Este operador devuelve el mayor de los dos valores que se comparan. Tenga en cuenta, tambin, los parntesis alrededor del valor que quiere comparar a la derecha del operador. Sin los parntesis, 2.0 se comparara con el registro, y luego el valor that se divide por 128. No es lo que yo quiero para todos! Esto sucede debido a que el mayor operador tiene el mismo orden de precedencia como el operador de divisin. Este es un tipo comn de error en los programas de IDL. Otro error comn se produce dentro de los parntesis. Fjate que he hecho el nmero 128.0 un nmero de punto flotante mediante la adicin de un punto decimal en el nmero. Es posible caer fcilmente en el error de escribir este nmero como un nmero entero (por ejemplo, 128). Entonces, un byte o que los datos de imagen sean enteros, se divide un valor entero (el rango) por otro valor entero. Esto puede fcilmente darle un tamao bin coherente de 0. Un grave error. La palabra clave Max_Value se le asigna un valor de 5,000, un valor que funciona con la mayor parte de los datos de imagen de ejemplos se establece con la distribucion IDL. A continuacin, puede poner a prueba los valores de palabra clave XScaIe y YScale. Si stos no se suministran,utilizen las dimensiones de la imagen para los valores de la escala. Tambin voy aprobar para asegurarme que los valores de sean dos conjuntos de elementos. Si no es as, voy a difundir los mensajes de error. El cdigo se ver as:
S = Size(image,/Dimensions) IF N_Elements(xscale) EQ 0 THEN xscale = [0, S[0]]
IF N_Elements(xscale) NE 2 THEN $ Message,'XSCALE must be 2-elementos array', /noname IF N_Elements(ysca1e) EQ 0 THEN yscale = [0, S[1]] IF N_Elements(ysca1e) NE 2 THEN $ Message, 'YSCALE must be 2-elementos array', /noname
Fjese una nueva palabra clave para el comando Size aqu: Dimensions. A diferencia de la palabra clave N_Dimensions, devuelve el tamao con el nmero de dimensiones de su argumento, la palabra clave Dimensions devuelve un vector que contiene el tamao de cada una de sus dimensiones. En otras palabras, con una serie de imgenes 2D, voy a tener una matriz de dos elementos de tamao X y tamao Y para la imagen, respectivamente. Por ltimo, puedo comprobar la palabra clave Color. Porque quiero escribir un dispositivo de estado de descomposicin con cdigos independientes, voy a utilizar el programa de GetColor para especificar los colores de dibujo. (GetColor se discute en " Obtencin de Dispositivos Independientes de Colores "en la pgina 87.) GetColor" sabe "los nombres de los 16 colores de dibujo que utiliza con frecuencia y puede obtener esos colores para m de una forma independiente del dispositivo. (Puede fcilmente aadir ms colores a GetColor) revise las palabras clave como esto:
IF N_Elements(dataCo1orName) EQ 0 THEN $ dataColorName = 'Red' IF N_Elements(axisColorName) EQ 0 THEN $ axisColorName = 'Navy' IF N_Elements(backcolorName) EQ 0 THEN $ backcolorName = 'White'
Pude comprobar para asegurarse de que los nombres de los colores aprobados en el programa son las variables de cadena, pero GetColor va a hacer de todos modos. Y s que va a regresar al llamado del programa que lo llam. Por lo tanto, voy a ser capaz de atrapar a ese error en mi controlador de errores cuando se trata de volver de GetColor: Por lo tanto, no hay necesidad de comprobar si hay posibles errores aqu. Tenga en cuenta que yo hago el color de fondo blanco de forma predeterminada. Esto no es, sin duda necesario, y ms a menudo que no me gusta tener un color de fondo carbn o gris. Elijo blanco aqu, porque a veces es ms fcil de visualizar los resultados que va a parecer cuando hago un archivo PostScript desde este programa. Recuerde que usted puede tener cualquier color de fondo que le guste en PostScript, por mientras es de color blanco. (Este problema se discute en "Problema: Los dispositivos PostScript uso de fondo y Trazado de colores de forma diferente "en la pgina 189.) Lo ms importante es que necesito alguna manera de cambiar los colores de los dibujos, porque es casi seguro que tengo que cambiarlos al enviar el resultado a un Impresor de PostScript. Al hacer que los colores por defecto adecuados para la impresin en un archivo impresin PostScript, ahora no tendr que preocuparse acerca de cmo restablecer los colores. Voy a llamar al programa HistoImage para dibujar los grficos en sus colores por defecto cuando quiero hacer un archivo Postscript. Si el usuario no proporciona un nmero de ndice de la tabla de colores, elijo tabla de colores 4.
IF N_Elements(colortab1e) EQ 0 THEN colortable = 4 colortable = 0> colortable <40
Tenga en cuenta que slo hay 41 tablas de colores suministrados con IDL (aunque los usuarios podran modificar este nmero, por cierto). Aqu puede ver un poco de la comprobacin para forzar la tabla de colores valores entre un nmero entre 0 y 40.
En IDL el operadores mayor que y menor que se utilizan para forzar el rango correcto de los nmeros. (En otras palabras, 0 es comparado con tabla de colores y el valor ms grande es el de retorno. Entonces que valor se compara con 40 y el ms pequeo de los dos valores es devuelto en la variable de la tabla de colores.) Este tipo de comprobacin de errores proactivo puede evitar problemas ms adelante. A continuacin, le ofreceremos la palabra clave ImageColors con un valor. Tenga en cuenta que voy a usar tres colores de dibujo en este programa. Prefiero cargar mis colores dibujo en la parte superior de la tabla de colores, aunque otras personas prefieren para cargarlos en la parte inferior de la tabla de colores. No importa mucho donde se los carga, siempre y cuando usted sabe lo que est haciendo al manipular la tabla de colores. Pero si bien me gusta cargar colores de dibujo en la parte superior de la tabla de colores, no me gusta utilizar el nmero de ndice de la parte superior de la tabla de colores. La razn por la que no lo es que muy a menudo este ndice, se utiliza para la Variable del sistema !P.Color. Y muchos programas estn escritos asumiendo este color que va a ser blanco o negro. No me gusta romper estos programas, si puedo evitarlo. As que dejo este ndice solo. Cmo cargo mis tres colores de dibujo y el cuarto ndice de la parte superior. Esto significa que los ndices de color que tengo para los rangos de visualizacin de imgenes son desde 0 hasta el quinto ndice a partir de la parte superior de la tabla de colores. Esto es -4 colores en total !D.Table_Size . Esto es lo que Asigno la palabra clave ImageColors como valor en el programa.
imagecolors =!D.Table_Size -4
Tenga en cuenta que no tengo que comprobar la palabra clave output. Si el usuario desea que el valor de l o ella puede ser recuperado con palabras claves. Si ellos no quieren que el valor, bueno. Esto no le cuesta mucho para asignarlo a una variable. (Y yo necesito el valor ms adelante en el programa de todos modos) No hay necesidad de usar algo como Arg_Present en este caso:
IF Arg_Present(imageco1ors) THEN $ imagecolors =!D.Table_Size -4
Esto es un exceso y los resultados en la variable imagecolors slo estn definiendo si el usuario aprueba en una referencia de variables con la palabra clave. La construccin ms simple es mucho ms fcil de escribir y creo que hace que el programa sea ms fcil de leer, tambin. Recuerde que la variable imagecolors est diseado para ayudar a alguien fuera del programa de control de los colores de la imagen. No tengo ninguna necesidad en este momento, pero puedo usarlo ms tarde y quiero estar preparado para la eventualidad.
Las variables BackColor, dataColor, y axisColor ahora contienen el correcto nmero de ndice de color para la carga del color apropiados (si el dispositivo de descomposicin est apagado o si este es un dispositivo de 8 bits), o un valor de 24 bits que se pueden descomponer en el color
adecuados (Si este dispositivo de descomposicin est encendido). En cualquier caso, no tiene que preocuparse en absoluto sobre el estado actual de descomposicin del color de los grficos con estos colores. Los colores correctos van a aparecer de forma casi automtica. A continuacin se carga los colores para los datos de la imagen. Yo slo hago esto si la variable de la palabra clave NoLoadCT no se ha establecido.
IF NOT Keyword_Set(noloadct) THEN $ LoadCT, colortable, NColors=imagecolors, /Silent
Ntese que uso la palabra clave Silent al comando LondCT. Realmente no me gusta el mensaje informativo LondCT que imprime en la ventana de registro de comandos cada vez que se carga una tabla de colores. Esta palabra clave suprime el mensaje. Tenga en cuenta, tambin, que puedo restringir, con la palabra clave NColors, el nmero de colores cargados en los ndices utilizados por la imagen. Quiero tener cuidado de no sobre grabar los colores de dibujo que acabo de cargar. Slo los ndices de la tabla de colores cargados por este comando !D.Table_Size pueden ser de 0 a -5.
hasta el momento, es expresar el tamao de los caracteres en unidades normalizadas. Por desgracia, esto es imposible en IDL. El tamao del carcter es siempre expresado en unidades de carcter. Pero aun as ... debe haber una manera! En realidad. Resulta que con el comando XYOutS puede obtener el width de una cadena de texto en unidades normalizadas. Y si utiliza un valor negative con la palabra clave CharSize, entonces XYOutS no ser realmente escrita como cadena para mostrase en la ventana, slo se calcula el ancho de la cadena. Por ejemplo, suponga que desea conocer el ancho de la cadena de texto "Una cadena de ejemplo". Usted puede escribir lo siguiente:
IDL> thisSize = -1 IDL> XYOutS, 0.5, 0.5, 'Una muestra cadena', /Normal, $
Width=thisWidth, Charsize=thisSize
Ahora, supongamos que compar el valor de thisWidth con cierta anchura de objetivo. Digamos, por ejemplo, que la anchura objetivo era 0,25. Otra forma de decir esto es que la cadena debe ser lo suficientemente amplia como para extenderse a travs de 25 por ciento de la ventana de visualizacin. Si el ancho del objetivo era mayor que el valor de thisWidth puede aumentar el tamao de la fuente en una pequea cantidad, y probar de nuevo, y as sucesivamente hasta que el tamao de la fuente sea adecuado para darle el ancho de texto que queras. El cdigo podra tener este aspecto:
IDL> IF thiswidth LT 0.25 THEN thissize = thissize + 0.01 IDL> XYOutS, 0,5, 0,5,'a simple string', /Normal, $
Finalmente, thisWidth pueda ser dentro de un pequeo valor delta de la anchura del objetivo. El algoritmo similar se puede emplear si thiswidth es mayor que la anchura del objeto. Este tipo de algoritmo ha sido desarrollado para que la forma del programa Str-Size descargado con los archivos de programa para utilizalo en este libro. El parmetros Str-Size son una cadena y un ancho de objetivo, en coordenadas normalizadas. Se encontro que la cadena "Una cadena de ejemplo" y un ancho blanco de 0,20 produce muy bien caracteres de tamao en la mayora de las parcelas en las ventanas de grficos que suelen utilizar.
IDL> ThisSize = Str_Size ('Una muestra String', 0.20)
Este es un tamao de carcter de aproximadamente 1,4 para una ventana de tamao normal en una mquina Windows, por ejemplo. En este programa, voy a escribir el tamao de la fuente del cdigo de seleccin de la siguiente manera:
ThisCharSize = Str_Size('Una muestra String', 0.20)
Note que puse las palabras clave Min y Max explcitamente para la funcin Histogram a valor mnimo y mximo de la imagen. La documentacin IDL afirma que esto es la funcin Histogram por defecto, pero no he encontrado que este sea el caso. Ms bien, me parece que toma el valor mnimo de 0 y un valor mximo de 255 para imgenes bytes, independientemente de los valores de datos reales en la imagen.
Dibujar el histograma
IDL me da varias opciones para dibujar el histograma, pero me parece que no me gustan las dos ms obvias. Voy a explicar lo que quiero decir con un ejemplo sencillo para que pueda escribir en la lnea de comandos de IDL. Supongamos que tengo cinco contenedores de datos, cada bin en 5 unidades de tamao, y un vector que me dice cuntos "objetos" son en cada bin. Los datos y los vectores bins se podran crear como esto:
IDL> data = [4, 6, 3, 8, 2] IDL> bins = , [0, 5, 10, 15, 20]
El mtodo ms obvio es simplemente representar los datos con el comando Plot, de esta manera:
IDL> plot,bins,data,YRange=[0,10]
El resultado, que no se parece mucho a la definicin del comando plot "histograma", es ilustrado en la Figura 95.
Figura 95: Una trama muy simple de un funcion histograma. Teniendo en cuenta que no se ve igual que un histograma. El segundo enfoque es obvio para establecer la palabra clave PSym a 10, lo que resultar el tipo "escaln" de la trama que se espera de un histograma. Puedo probar esto:
IDL> Plot,bins,data,YRange=[0,10],PSym=10
Los resultados se ven mejor, como se muestra en la Figura 96, pero que todava no estn bien. En particular, los bins estn representados incorrectamente. La primera bandeja va de 0 a 5, el segundo bin desde 5 a 10, y as sucesivamente. Pero en la ilustracin, la primera bandeja parece ir de 0 a 2,5, y el segundo bin parece que van desde los 2,5 a 7,5, y as sucesivamente. Parece como si cada bin fuese medio tamao.
Figura 96: Esta parcela se parece ms a una parcela histograma, pero todava no est bien. Notar que los contenedores parecen ser de un tamao medio fuera de bin. Podra tratar de solucionar el problema mediante la adicin de un tamao medio bin a cada uno de los contenedores, as:
IDL> Plot,bins+2.5,data,YRange=[0,10],PSym=10
Ver los resultados en la Figura 97. De nuevo, est cerca de ser correcta, pero tengo problemas en cada extremo de la trama, donde las lneas deben extenderse hasta el final de la ventana grfica. Para dibujar realmente esta trama correctamente, debera duplicar los valores del primero y ltimo, de los datos del histograma y los valores de bin.
Figura 97: Esta parcela ha tenido la mitad de un tamao de bin aadido a los valores de ubicacin. Es preciso, pero las lneas de la trama no se extienden a los extremos de la ventana de dibujo
Por ltimo, tengo el tipo de histograma que espero, como se ilustra en la Figura 98.
Figura 98:. El histograma que esperaba conseguir Sera fcil y suficiente aadir lneas verticales con el comando PlotS para crear cajas de histograma para cada bin. Este es exactamente el tipo de enfoque que voy a tener en el programa HistoImage. El cdigo para esquivar los bins y el vectore histodata para tener un trazado correcto de esta manera:
npts = N_Elements(histdata) halfbinsize = binsize / 2.0 bins = Findgen(N_Elements(histdata)) * binsize + Min(image) binsToPlot = [bins[0] , bins + halfbinsize, $ bins [npts-1] + binsize] histdataToPlot = [histdata[0] , histdata, histdata [npts-1]] xrange = [Min(binsToPlot ) , Max(binsToPlot)]
El cdigo para trazar el diagrama de histograma en el color de eje, seguido de los datos del histograma dibujado en el color de los datos se ver as:
Plot, binsToPlot, histdataToPlot, $ Background=backColor, $ Charsize=thisCharsize, $ Color=axiscolor, $ Max_Value=max_value, $ NoData=1, $ Position=histoPos, $ Title='Irnage Histogram', $ XRange=xrange, $ XStyle=1, $ XTickformat= '(I6)' , $ XTitle='Image Value', $ YMinor=1, $ YRange= [0, max_value], $
YStyle=1, $ YTickformat= '(I6)', $ YTitle='Pixel Density', $ _Extra=extra OPlot, binsToPlot, histdataToPlot, PSym=10, Color=dataColor FOR j =1L,N_Elements(bins)-2 DO BEGIN Plots, Color=dataColor, [bins[j] , bins [j]] , $ [!Y.CRange[0], histdata[j] < max_value] ENDFOR
Tenga en cuenta que yo uso el comando PlotS para dibujar lneas verticales en cada lmite bin. Esto da el histograma en una caja que me guste ms asi que slo usar el histograma trazado con smbolo (Psym = 10) con el comando Plot. Me parece que al poner las palabras clave en orden alfabtico cuando yo uso un comando que requiere el establecimiento de un nmero de palabras clave de un estilo de utilidad. Esto hace que sea mucho ms fcil de ver las palabras claves que he fijado explcitamente. Esto ahorra tiempo y esfuerzo si tengo que aadir o eliminar una palabra clave ms adelante en el desarrollo del programa.
Observe que la barra de color se limita al mismo nmero de colores de la imagen, y que la gama de colores que se toma de la variable binsToPlot . Al establecer la palabra clave XTickLen a un valor negativo, produce hacia afuera marcas de graduacin. Ajuste la palabra clave Divisions a 0, permite que el programa para elija divisiones de anotacin de la misma manera que el comando plot. Esto har que el Colorbar sea una anotacin idntica a las anotaciones del histograma directamente por encima de ella y reforzar el propsito de las anotaciones.
Charsize=thisCharsize, $ Color=axisColor, $ NoData=1, $ NoErase=1, $ Position=imagePos, $ XStyle=1, $ XTicklen=-0.025, $ YStyle=1, $ YTicklen=-0.025, $ _Extra=extra END
Tenga en cuenta que yo escalo los datos de la imagen en el nmero de colores de la imagen y que la posicin tanto la imagen y los ejes sobre la imagen con la variable imagePos.
El trabajo en torno a este error, lo que har que el cdigo completo del dispositivo independiente, es simplemente llegar y volver a cargar los vectores de la tabla de colores despus de que el ltimo color solo se carga en la tabla de colores. En el cdigo HistoImage , busque esta lnea:
IF NOT Keyword_Set(noloadct) THEN $ LoadCT, colortable, NColors=imagecolors, /Silent
Esto har que los colores correctos se cargen cuando el programa se enva al dispositivo de impresin(printer).
Si el programa no compila, o si tiene errores cuando se ejecuta, elimine el programa desde la pantalla con el ratn, tipee RETALL en la lnea de comandos de IDL, y corregir los errores. No se olvide de volver a compilar el programa antes de ejecutarlo de nuevo. Intente ejecutar el programa con una imagen diferente:
Figura 99: Un error de dispositivo de impresin que se traduce en todos los pxeles con valor 0 aparecer el ltimo de un solo color cargado en la tabla de colores (el color background, en este caso). La solucin alternativa es llegar y volver a cargar los vectores de la tabla de colores cargando un solo color.
image = LoadData(5) HistoImage, image
Pruebe establecer algunas de las palabras claves. Por ejemplo, pruebe algunas de las palabras clave de color:
IDL> HistoImage, image, $
AxisColorName='beige', $ BackColorName='gray', $
ColorTable=33, $ DataColorName='yellow'
Qu pasa con el establecimiento de palabras clave que no estn definidos para Histolmage, sino que se recoge por el mecanismo de herencia de palabras clave? Pruebe, por ejemplo, el establecimiento de la palabra clave Keep_Aspect_Ratio del comando TVIrnage y la palabra clave Divisions del comando Colorbar as:
IDL> HistoImage, /Keep_Aspect_Ratio, Divisions=8
Este programa nos permitir cambiar la tabla de colores asociada a HistoImage y ver los efectos inmediatamente. (Esto slo ser necesaria en las pantallas de 24 bits, recordar. En pantallas de 8 bits, los colores se actualizan automticamente.) Tenga en cuenta que la palabra clave NoLondCT se establece. Esto es necesario, para una entidad externa para controlar los colores. Si no se establece esta palabra clave, HistoImage siempre cargaba su propia tabla de colores en lugar de utilizar los colores de la tabla de colores actual. En primer lugar, llame al programa normalmente y averiguar cuntos colores de imagen hay. La palabra clave de salida ImageColors se utiliza para este propsito.
IDL> image = LoadData(13) IDL> HistoImage, image, ColorTable=33, ImageColors=ncolors
A continuacin, llame a XColors para cargar diferentes tablas de colores. (XColors es un programa que se ha descargado para su uso con este libro. Utilizo exclusivamente en su lugar XLondCT, que es suministrado por IDL, por razones que usted aprender acerca de las
siguientes secciones de este captulo. Tiene muchas ventajas para XLoadCT, uno de los cuales es que yo creo que tiene un mayor sintaxis natural para la actualizacin automtica de pantallas grficas en un dispositivo de 24 bits.)
IDL> XColors, NColors=ncolors, Image=image, $
NotifyPro='HistoImage_Redisplay'
Si usted tiene ambos XColors y su ventana grfica abierta en la pantalla, para que pueda ver a los dos, te dars cuenta de que, al seleccionar las tablas de colores de la lista de tablas colores en XColors, los colores se actualizan automticamente en la ventana de visualizacin. Tenga en cuenta que si est ejecutando IDL en un dispositivo de 8 bits, slo necesita llamar a XColors como esto:
IDL> XColors, NColors = ncolors
Ahora, cierra su ventana XColors si an est en la pantalla. El programa XColors trabajar con el programa HistoImage_Redisplay no importa las palabras clave que se utilizan con HistoImage. Por ejemplo, puede escribir lo siguiente:
HistoImage, image, BackColorName='gray', $ AxisColorName='yellow', ImageColors=ncolors XColors, Image=image, NColors=ncolors, $ BackColorName='gray', AxisColorName='yellow', $ NotifyPro='HistoImage_Redisplay'
Recordemos que puse el color de fondo blanco de forma predeterminada slo con el propsito de ser capaz de enviar la salida grfica a una impresora o al dispositivo PostScript. Si no lo est blanco en la pantalla, se debe cambiar a blanco antes de enviarlo a la impresora o crear un archivo PostScript. Las palabras claves de colores hacen que sea fcil de hacer este interruptor cuando estn utilizando este tipo de dispositivos de salida grfica.
Lo que hace el programa HistoImage independiente del dispositivo es la ausencia de comandos que slo funcionan en un dispositivo en particular. Por ejemplo, usted no ve ningn comando Window en este programa, ya que un comando Window slo es apropiado en los dispositivos de visualizacin y no, por ejemplo, en el dispositivo PostScript. Los grficos se han escrito para entrar en cualquier ventana que pasa a ser abierto. Si el dispositivo de grficos es un dispositivo de visualizacin (es decir, WIN, MAC o X), y una ventana no est actualmente abierta, una ventana por defecto ser abierto cuando se ejecuta el primer comando de grficos. Si quera tener un comando Window en el programa (y casi nunca lo hago, sobre todo si tengo planes para usar el programa en un programa Widget), entonces usted debe asegrese de que el dispositivo es compatible con Windows. Esto se puede hacer con flags del sistema variable !D . El campo flags es un mapa de bits y queremos ver si el bit corresponde a el valor 256 se establece (ventanas son compatibles con este dispositivo) o no (Las ventanas no son compatibles con este dispositivo). El cdigo se ver as para una posible Ventana de comandos:
IF (!D.Flags AND 256) NE 0 THEN Window
Otra orden comn que no se ve en este programa es un dispositivo, comando Decomposed =0. Normalmente se requiere este comando para mostrar imgenes 2D en color. Nosotros no tienen que incluirlo porque los comandos Colorbar y TVIrnage han sido escrito con esta inteligencia integrada en ellos. Sin embargo, tendramos que utilizar un comando como este si bamos a usar el comando TV para mostrar la barra de color y la imagen. De hecho, probablemente tenga que usar varios comandos para comprobar la profundidad visual, el tipo de dispositivo, etc Para ms detalles, examinar el cdigo, ya sea en los programas TVImage o Colorbar. En el programa Colorbar de 12 lneas de cdigo presedidos por el comando TV y otras 12 lneas que siguen, slo para la trabajar con el comando TV correctamente en todos los dispositivos!
Usted ve un ejemplo del programa FSC_windows de la figura 100. Observe los controles bajo el archivo de la barra de men. Usted puede tomar el borde de la ventana con el ratn y cambiar el tamao de la ventana. El contenido de la ventana cambia de tamao para adaptarse a ellos. Usted puede tener tantos programas FSC_windows funcionando como usted lo desea. Por ejemplo, vamos a mostrar una imagen en un programa FSC_windows, pero tambin vamos a establecer la capacidad de los programas para cargar las tablas de colores diferentes. Escriba lo siguiente:
image = BytScl(LoadData(7) , Top=!D.Table_Size-l) FSC_Window, 'TVImage', image, /WColors
Observe que ahora hay un men de elemento de Colores en el archivo y un botn en la barra de mens. Haciendo clic en este botn para acceder al XColors herramienta para cambiar de color. XColors es un programa que fue descargado para su uso con este libro. Una de sus grandes ventajas es que no utiliza bloques comunes para almacenar sus tablas de colores. Lo que significa que no puede haber mltiples programas XCo1ors en la pantalla a la vez. Algo que es imposible con XLondCT, y el IDLsupplied , herramienta del cambio de la tabla de color. Por ejemplo, vamos a obtener el programa HistoImage en la pantalla tambin. Recurdese, sin embargo, que usted no desea utilizar todos los colores en la tabla de colores. Reservamos los cuatro primeros colores para otras cosas. Y recuerdan que si queremos que los colores sean manipuladas externamente, tenemos que estar seguro de no cargar la tabla de colores en HistoImage. Esto se logra estableciendo la palabra clave NoLondCT . Escriba lo siguiente:
IDL> image = BytScl(LoadData(5),Top=!D.Table_Size-1) IDL> FSC_Window,'HistoImage',image,/NoLoadCT, $
wcolors= !D.Table_Size-4
Ahora usted puede conseguir la herramienta de tabla de colores de ambos programas en la pantalla al mismo tiempo. Si est ejecutando IDL en una pantalla de 8 bits, las cosas se ven un poco catico, sin duda, ya que cada vez que se cambia la tabla de colores, los grficos de salida cambian automticamente.
Figura 100: El programa FSC_Window de la ventana grafica redimensionable con el comando Shade_Surf. Note que el men pull-dowiz le permitir imprimir y guardas los contenidos de una variedad de formatos de archivos.
En una pantalla de 24-bit, por supuesto, todo esto sucede de forma independiente. Lo que se nota en pantallas de 8 bits, sin embargo, es que el color ser correcto para la ventana que tiene el foco del teclado actual. En otras palabras, cada ventana "sabe", que colores deben ser cargados y los carga cuando tiene el foco. Tenga en cuenta que en una pantalla 8 bit, el programa FSC_Window no puede tener un botn Print y el archivo PostScript como se muestra en la Figura 100. Cuando el dispositivo de visualizacin no tiene tantos colores como los dispositivos PostScript o una impresora, es imposible obtener siempre los colores correctos para PostScript y la salida de la impresora. Demasiados factores estn involucrados y depende mucho de cmo se escribe el smbolo grfico que se ejecuta. Por ejemplo, no es posible obtener una salida PostScript correcto de nuestro programa HistoImage cuando se ejecuta en una pantalla de 8 bits con la tabla de colores carga apagado, al igual que el caso actualmente. Usted aprender ms acerca de cmo solucionar este tipo de problemas en los captulos que siguen, pero por ahora usted debe saber que usted puede conseguir tanto un boton print y un botn de Archivo PostScript del programa FSC_windowl en una pantalla de 8 bits, pero usted tiene que fijar explcitamente. Por ejemplo, usted puede hacer esto:
IDL> FSC_Window, TVImage , LoadData(7) , /WColors, $ /WPostS0cript,/WPrint
Pero incluso este comando no se imprimir correctamente o hacer un archivo PostScript correcto en una pantalla de 8 bits. Para hacer que la salida sea correcta, los datos de imagen tendrn que ser escalados correctamente tanto para la pantalla y para los dispositivos Postscript y la impresora. La nica manera de hacer esto es lograr que para llevar a cabo el escalado justo en el comando TVImage, como esto:
IDL> image = LoadData(7) IDL> FSC_Window , 'TVImage ' , $