Sie sind auf Seite 1von 109

UNIVERSIDAD AUTNOMA METROPOLITANA UNIDAD IZTAPALAPA

Casa abierta al tiempo

DIVISIN DE CIENCIAS BSICAS E INGENIERA DEPARTAMENTO DE INGENIERA ELCTRICA


LICENCIATURA EN INGENIERA BIOMDICA

SEMINARIO DE PROYECTOS I Y II

TARJETA DIGITALIZADORA DE VIDEO


ALFONSO RUZ HERNNDEZ EZEQUIEL BAUTISTA MARTNEZ

ASESORES:

ING. DPL. ENRIQUE HERNNDEZ MATOS


ING. DONACIANO JIMNEZ VZQUEZ

Mxico, D. F.

Noviembre, 1996.

Introduccin

CONTENIDO
Introduccin

PRIMERA PARTE:

LA TARJETA

Captulo 1. Adquisicin de Imgenes Captulo 2. La seal de Vdeo Capitulo 3. La Digitalizacin del Vdeo Captulo 4. El Circuito

SEGUNDA PARTE:

LA PROGRAMACIN DE LA TARJETA

Captulo 5. Modos de Vdeo Captulo 6. Formatos Grficos Captulo 7. El Procesamiento Captulo 8. El programa

Conclusiones

Bibliografa

Apndice 1. Listados del Programa

Introduccin

INTRODUCCIN.

La digitalizacin de imgenes es un proceso importante en muchas


disciplinas hoy en da. Esto se debe principalmente a que las imgenes digitalizadas pueden ser almacenadas, recuperadas y trasmitidas con un alto grado de fidelidad; es decir, sin prdida de informacin. Adems, con ayuda de una computadora, una imagen digitalizada puede ser sometida a un gran nmero de manipulaciones. Estas manipulaciones permiten mejorar la imagen y/u obtener mayor informacin de la misma. Lo anterior da lugar a toda una disciplina conocida como "Procesamiento Digital de Imgenes".

Para ste propsito; existen sistemas dedicados a la adquisicin y digitalizacin de imgenes, los cuales, segn la aplicacin, pueden variar desde una simple tarjeta digitalizadora para PC hasta estaciones de trabajo completas. De acuerdo a una investigacin de mercado realizada (en un apndice se anexa una cotizacin de una estacin aplicada a Microscopa Electrnica), encontramos, como era de esperarse, que la complejidad del sistema es proporcional a su costo, siendo ste ltimo excesivamente alto.

Por ello encontramos, viable e interesante el desarrollar un sistema sencillo para la digitalizacin de imgenes de vdeo, que sea de bajo costo, verstil y de fcil instalacin en una computadora personal compatible con el estndar IBM.

Introduccin

Se busc que el sistema tuviera las funciones esenciales (adquisicin, despliegue, almacenamiento, procesamiento bsico), que permitan su aplicacin en alguna rea de inters. No obstante, dichas funciones pueden mejorarse y/o ampliarse de acuerdo al campo especfico en que se aplique, como pueden ser Imagenologa Mdica, Microscopa, Astronoma, etc...

El desarrollo del sistema, as como el presente trabajo, const esencialmente de dos secciones:

a) La tarjeta; que abarca la construccin del circuito para digitalizar la seal de, vdeo y su interfase hacia la computadora personal.

b) La programacin de la tarjeta; que involucra el control de la tarjeta, manejo de los datos provenientes de la tarjeta (los cuales conforman la imagen) para su despliegue y almacenamiento; as como su posterior recuperacin y procesamiento.

A su vez, cada una de stas secciones consta de diversos captulos con el propsito de desglosar la informacin, y de sta forma facilitar la comprensin sobre la operacin completa del sistema, as como justificar el porqu se desarroll de dicha forma el mismo.

Los autores.

Captulo 1 : Adquisicin de Imgenes

ADQUISICIN
DE IMGENES

A diferencia de otros seres vivientes, los seres humanos somos criaturas que dependemos primordialmente de nuestro sentido de la vista, ya que la
mayor parte de la informacin que recibimos de nuestro entorno es captada a travs de nuestros ojos. Nuestro cerebro utiliza sta informacin para adaptarse y/o modificar ese entorno de acuerdo a sus necesidades. Es por esto, que el ser humano ha ideado sistemas que le permiten y/o facilitan la percepcin de informacin visual de los fenmenos que le rodean, como son los sistemas de procesamiento de imgenes. Estos sistemas de procesamiento de imgenes necesitan, al igual que el cerebro humano, obtener la informacin visual para su almacenamiento y posterior anlisis. sta tarea es realizada por sensores que emulan de manera eficiente al ojo humano en su funcin de extraer la informacin visual del medio. Por ello, el primer paso en el desarrollo de un sistema para el procesamiento de imgenes consiste en analizar de manera general los sensores o sistemas por medio de los cuales se adquieren las imgenes. El dispositivo de adquisicin ms comn es la cmara de vdeo estndar, de la cual existen principalmente dos variaciones de acuerdo al tipo de detector que utilizan: de estado slido (CCD o CID) o de tubo al vaco (Vidicon). Expliquemos brevemente cada una de ellas. Las cmaras basadas en un detector de estado slido emplean un circuito integrado que consta de un arreglo de sensores individuales de elementos de imagen (pixeles). Al incidir un fotn, se produce un flujo aislado de electrones, entonces, cada detector funciona como un contador de fotones. La seal leda de cada lnea de detectores produce una seal analgica de voltaje. La Figura 1-1 muestra el diagrama esquemtico de
Pgina 1- 1

Captulo 1: Adquisicin de Imgenes

uno de stos dispositivos. Como se aprecia en sta figura, el reloj temporizador vertical selecciona la lnea de detectores de elementos de imagen (pixel) en turno. Entonces, el reloj horizontal enva el contenido de cada detector al siguiente, ocasionando la lectura secuencial de la lnea hacia el registro y amplificador de salida, el cual produce un voltaje como una funcin del tiempo.

Para leer el contenido de los detectores se emplean diferentes tipos de circuitos, dando lugar a dos tipos de dispositivos: CCD (Charge-Coupled Device) y CID (Charge-Injection Device). La diferencia primordial entre ambos circuitos es que unos permiten diseos de cmaras con la capacidad de acumular en el circuito integrado imgenes tenues por perodos prolongados de tiempo, as como su posterior lectura no destructiva; mientras que otros funcionan solamente mediante un rastreo continuo y no permiten acumulacin de la imagen dentro del circuito integrado. Las cmaras del primer tipo son usadas en astronoma, microscopa de fluorescencia y algunos equipos de imagenologa de Rayos X, debido a que las imgenes de sta ndole son de muy baja intensidad; sin embargo, ste tipo de dispositivos requiere un sistema de enfriamiento con el fin de reducir el ruido electrnico. La Figura 1-2 es un diagrama esquemtico de un circuito integrado de una cmara de estado slido.

Pgina 1 - 2

Captulo 1 : Adquisicin de Imgenes

El otro tipo de cmaras, generalmente ms antiguo, utiliza un tubo al vaco. La luz pasa a travs del tubo para incidir en una capa de un material cuya conductividad es alterada por los fotones. Entonces, un haz de electrones realiza un barrido sobre esta capa de material, convirtiendo as los cambios de conductividad a una seal elctrica que contiene la informacin de la imagen. Existen muchas variedades de estos tubos, segn el tipo de material que emplean para su capa sensible. El de Vidicon (mostrado en la Figura 1-3) es el menos costoso y el ms comn; y para nuestros fines servir como un prototipo de comparacin con las cmaras de estado slido.

Pgina 1- 3

Captulo 1: Adquisicin de Imgenes

En algunos aspectos, las cmaras electrnicas son similares a las pelculas fotosensibles. La pelcula fotosensible es caracterizada por su respuesta a la exposicin a la luz, lo cual se representa mediante una curva de "densidad vs exposicin" como la mostrada en la Figura 1-4.

Pgina 1 - 4

Captulo 1 : Adquisicin de Imgenes

La parte baja de la curva representa el nivel de niebla, es decir, la densidad que presenta la pelcula fotosensible antes de ser expuesta a la luz. La parte superior de la curva representa el mximo nivel de densidad en la pelcula (basado en la densidad mxima de las partculas de plata), es decir, la saturacin. En la parte central de la curva encontramos una zona lineal, cuya pendiente representa el contraste de la pelcula (Gamma). Una pendiente pronunciada indica una pelcula con un alto contraste, es decir, existen grandes cambios en la densidad de la pelcula con pequeos cambios en la exposicin. Contrariamente, una pelcula de bajo contraste tiene asociada una curva "aplastada" (de pendiente pequea), con la finalidad de registrar escenas con un amplio rango de brillantez. Tanto las cmaras de estado slido como las de tubo son caracterizadas por su contraste y pueden tener valores de Gamma diferentes a la unidad. Un valor de Gamma mayor o menor a la unidad indica que la curva es no lineal, provocando una compresin de la parte oscura o brillante del rango, como se indica en la Figura 1-5. En ocasiones, algunos circuitos electrnicos especiales son utilizados para variar el valor de Gamma intencionalmente.

Pgina 1- 5

Captulo 1: Adquisicin de Imgenes

Las cmaras de estado slido son inherentemente lineales. Algunas cmaras de tubo tambin son lineales, pero las ms comunes, las de Vidicon, son ligeramente no lineales cuando el nivel promedio de iluminacin es bajo, y vara a lineal para escenas brillantes. La Figura 16 muestra la respuesta lineal de un CCD as como los cambios en la respuesta del Vidicon de acuerdo al nivel total de brillantez. Esta variabilidad introduce algunos problemas para el procesamiento de imgenes.

Las cmaras de estado slido, comparadas con las de tubo, presentan ms ventajas que desventajas; las cuales analizamos a continuacin. Las cmaras de tubo pueden sufrir del efecto "Blooming", en el cual un punto luminoso es aumentado debido a la dispersin de los electrones sobre la capa de Vidicon. La disipacin dentro de la capa tambin hace imprctica la integracin de imgenes borrosas, mientras que el tiempo de respuesta del Vidicon causa "colas de cometa" detrs de los puntos luminosos en movimiento. Estas cmaras tambin pueden exhibir distorsin en el proceso de barrido, produciendo cualquiera de las distorsiones que se observan en la Figura 1-7.

Pgina 1 - 6

Captulo 1 : Adquisicin de Imgenes

El desafocamiento del haz de electrones en las esquinas de la cara del tubo puede provocar que las esquinas y orillas de la imagen se deformen; mientras que la luz absorbida cerca de las orillas, cuando sta pasa a travs del vidrio frontal del tubo, provoca que las esquinas y orillas se tornen borrosas. Adems, las cmaras de tubo se degradan con el tiempo cuando son instaladas en una orientacin vertical (como cuando se montan en un microscopio), debido a que contaminantes internos se depositan sobre la capa de Vidicon. Otra desventaja es que fsicamente son ms grandes y pesadas que las de estado slido. Por su parte, las cmaras de estado slido requieren que cada uno de los 300,000 o ms sensores sean idnticos; lo cual es muy difcil no obstante las modernas tcnicas de fabricacin de circuitos integrados. Las variaciones de un sensor a otro se manifiestan como ruido en la imagen. Adems, los circuitos integrados de las cmaras son ms sensibles a longitudes de ondas ms cercanas al rojo dentro del espectro visible. Muchas tambin son sensibles a la luz infrarroja, la cual, sino es iluminada en el sistema ptico de la cmara, puede producir un efecto de niebla debido a que no es posible realizar un afocamiento adecuado. Para algunas aplicaciones astronmicas en las cuales la sensibilidad a la luz infrarroja es deseada, la respuesta espectral de los CCD se puede extender an ms. Una forma de hacer esto es adelgazando el sustrato e iluminando el circuito integrado desde atrs, de tal forma que la luz pueda alcanzar la regin activa con menor ndice de absorcin en la capa superior o contactos del circuito. Podemos obtener una perspectiva del nivel de desempeo de una cmara respecto al ojo humano. Mientras una cmara de vdeo estndar tiene alrededor de 300,000 sensores, as como una de alta resolucin puede llegar a tener algunos millones, el ojo humano cuenta con alrededor de 1.5x10E8 sensores. stos estn muy juntos, particularmente en la zona llamada fovea, que es la parte central donde concentramos nuestra atencin. Mientras que es verdad que slo algunas docenas de niveles de brillantez pueden ser distinguidos en un slo campo, el ojo se ajusta automticamente a los niveles de brillantez totales, cubriendo nueve ordenes de magnitud, para seleccionar el rango adecuado (an cuando la sensibilidad al color se pierde en la parte oscura de ste rango). No obstante, la tendencia actual es hacia las cmaras de estado slido, las cuales
Pgina 1- 7

Captulo 1: Adquisicin de Imgenes

son continuamente mejoradas en su resolucin (incrementando el nmero de sensores individuales), uniformidad y costo. Para el propsito de nuestro sistema, se emple una cmara de vdeo Handycam de Sony; modelo CCD-TR50. Finalmente, dada la diversidad de tipos y fuentes de imgenes, existen algunos criterios generales que podemos prescribir para aquellas imgenes que sern sometidas a un anlisis y procesamiento por computadora. Uno de ellos es la necesidad de una uniformidad global, es decir, que una determinada caracterstica de la imagen debe observarse siempre igual en cualquier parte de la imagen donde aparezca. Esto implica que los valores de brillantez y color deben ser los mismos y, consecuentemente, que la iluminacin sea uniforme y estable para imgenes adquiridas en tiempos diferentes. Cuando las superficies son no planares, tales como la tierra vista desde un satlite o una ruptura en una superficie vista mediante un microscopio; correcciones para los cambios de orientacin local pueden ser posibles, pero esto usualmente requiere clculos extensos y/o conocimiento previo de la superficie y fuente de iluminacin.

Pgina 1 - 8

Captulo 2 : La Seal de Vdeo

LA SEAL
DE VIDEO

La seal de vdeo compuesto es la forma ms comn en la que se encuentra modulada una imagen: las cmaras de vdeo, ya sean
de estado slido o de Vidicon; as como las VTRs y algunos equipos mdicos, producen seales de esta ndole (usualmente en salidas tipo RCA o BNC). Esta seal, en un receptor de televisin, es la que se separa en la etapa final de preamplificacin de vdeo y que se utiliza para formar la imagen. Para poder digitalizar y despus almacenar una imagen, primero se tiene que obtener de la seal de vdeo compuesto la informacin correspondiente a la imagen. Al decir vdeo compuesto se entiende que la seal de vdeo incluye diversas partes. Bsicamente stas son: 1) La seal de luminicencia o brillantez, correspondiente a la informacin que se desea obtener y digitalizar. 2) Pulsos de sincronizacin, que contienen la forma de cmo es explorada y 3)Pulsos de borrado, que son seales que sirven para la reproduccin de las imgenes. 4)La seal de crominancia, que es la que contiene la informacin de color, y se MHz. Para comprender mejor el significado e importancia de cada una de las partes de la seal de vdeo compuesto, a continuacin explicamos brevemente el proceso de rastreo que realiza un televisor para formar una imagen.
Captulo 2 - 1

reproducida una imagen.

encuentra sobrepuesta en una portadora de 3.58

Captulo 2 : La Seal de Vdeo

SISTEMA DE RASTREO DE UN T.V. El proceso mediante el cual un televisor forma una imagen es el siguiente: una imagen o cuadro se constituye de muchas lneas (el nmero depende del formato comercial empleado) llamadas lneas de barrido horizontal, que estn formadas por muchos puntos luminosos o elementos de imagen (pixeles). Colocando stas lneas lo suficientemente juntas se provoca que, a determinada distancia, no se aprecie su separacin. Dichas lneas son trazadas por el haz de electrones del TRC (Tubo de Rayos Catdicos) o cinescopio. En el T.V. a color existen tres haces de electrones juntos, uno para cada color primario; cuya intensidad esta modulada por la informacin de la seal de color. Por su parte, un T.V. monocromtico (blanco y negro) slo cuenta con un haz, el cual es modulado por la seal de luminicencia. Con el fin de facilitar la explicacin consideraremos ste ltimo caso. La exploracin se realiza en un cuadro rectangular con proporcin ancho:alto de 4:3. En cada lnea, la intensidad del haz est modulada por la seal de vdeo, o mejor dicho, por la informacin de brillantez (o color, en su caso) contenida en la seal; lo que da a cada pixel su nivel de brillantez adecuado para formar la imagen. La exploracin o barrido que realiza el haz ("raster-scanner") es de izquierda a derecha y de arriba hacia abajo. Entonces, el haz comienza a trazar una lnea por su extremo izquierdo, y , cuando llega a su extremo derecho, regresa a el lado izquierdo de la pantalla, al mismo tiempo que se mueve hacia abajo para trazar otra lnea (ver Figura 2-1). ste proceso continua hasta que se llega al extremo inferior de la pantalla, entonces, el haz regresa a la parte superior de la pantalla. De sta forma se construye un campo de la imagen.

Pgina 2 - 2

Captulo 2 : La Seal de Vdeo

Debido a la persistencia del ojo, exhibiendo cuadros a una gran velocidad (que depende del formato comercial empleado) se obtiene una imagen continua en movimiento. Para reducir el parpadeo de la imagen, as como el ancho de banda de la seal de vdeo, se opt por formar cada cuadro mediante dos campos entrelazados: el campo par y el campo impar. En la exploracin se entrelazan stos campos realizando dos barridos lineales: el primero en posiciones de lneas impares, saltndose las lneas pares; mientras que el segundo recorre las lneas pares, saltndose en sta ocasin las lneas impares (ver Figura 2-2a y 2-2b). En la Figura 2-2b se muestran las seales diente de sierra que controlan la deflexin del haz, una para la deflexin horizontal y otra para la deflexin vertical. Ambas seales tienen una rampa descendente llamada regreso, pues coincide, segn sea el caso, con el regreso de cada lnea de barrido horizontal (regreso horizontal), o con el regreso del haz hacia la parte superior de la pantalla (regreso vertical). Durante los regresos, la brillantez del haz debe ser completamente inhibida para evitar su inscripcin en la pantalla. Es por ello que en la seal de vdeo compuesto existen pulsos de borrado coincidentes con los regresos horizontales y verticales, ver Figura 2-3.

Captulo 2 - 3

Captulo 2 : La Seal de Vdeo

Pgina 2 - 4

Captulo 2 : La Seal de Vdeo

FORMATOS DE RASTREO COMERCIALES En la televisin comercial existen principalmente dos tipos de formatos de rastreo, cada uno de los cuales emplea seales de vdeo compuesto ligeramente diferentes. En el formato EIA o estndar RS170 (usado en EUA y Japn), la amplitud de la seal de vdeo compuesto es de 1 Volt. De sta, 0.7 Volts corresponden a la seal de luminicencia o brillantez y los restantes 0.3 Volts se utilizan para los impulsos de sincronismo. De la seccin correspondiente a la brillantez, las amplitudes ms altas corresponden a las partes ms blancas, mientras que las amplitudes ms bajas corresponden a las ms obscuras (ver Figura 2-3a).

Captulo 2 - 5

Captulo 2 : La Seal de Vdeo

El barrido es nominalmente de 525 lneas por cuadro, con dos campos interlazados con una duracin de 1/60 de segundo cada uno; los cuales se combinan para formar una imagen completa. Slo 480 de las lneas de barrido son realmente aprovechables, puesto que el resto se pierde durante el regreso vertical. En una imagen tpica de televisin comercial, la mayora de stas lneas se pierden debido al sobrerrastreo ("overscanning"), dejando menos de 400 lneas para el rea visual real. La Figura 2-3b muestra en detalle la parte de la lnea de barrido horizontal que contiene las seales de sincronismo. Como se puede observar, cada lnea contiene un pulso de sincrona horizontal para asegurar una correcta temporizacin; tambin existe la rfaga de color ("color burst"), la cual es una referencia de fase para la seal de color de 3.8 MHz que se sobrepone a los valores de brillantez. El tiempo de duracin de cada lnea de barrido es de 62.5 microsegundos, parte del cual es usado para el retorno horizontal. Esto deja 52 microsegundos para la informacin de la imagen, los cuales deben ser subdivididos entre el nmero de pixeles discernibles horizontalmente. En el otro formato, el CCIR o norma PAL (usado en Europa), los valores anteriores son ligeramente diferentes, ya que el formato se encuentra basado en cuadros de 1/25 de segundo de duracin, as como en ms lneas de barrido; pero la resolucin final no es muy diferente a la obtenida bajo el formato EIA. No abundamos ms en este formato pues no tiene mucha importancia paro nosotros, ya que en Mxico se emplea el formato EIA (tambin referido como sistema NTSC). OTRAS CONSIDERACIONES A las emisoras de televisin se les asigna nicamente un ancho de banda de 4 MHz para sus seales, las cuales deben contener la informacin de color y sonido, as como la seal de luminicencia mencionada anteriormente. Esto limita el nmero de niveles de voltaje que se puede distinguir a lo largo de cada lnea de barrido, que es de aproximadamente 330 niveles. An ms, el valor anterior se reduce si la seal es degradada por la electrnica o al grabarla usando videocaseteras (VTR).

Pgina 2 - 6

Captulo 2 : La Seal de Vdeo

La mayora de las VTRs comerciales reducen ste valor a 200 puntos por lnea. Al congelar una imagen, las VTRs despliegan uno de los dos campos, entonces slo 240 lneas son distinguibles verticalmente. Por ello, usar dichos equipos como parte de un sistema de anlisis de imgenes hace que el escoger una cmara o un digitalizador sea algo irrelevante, pues la resolucin estara limitada por la propia VTR. An el desempeo del mejor sistema puede ser disminuido por factores tan simples como son los cables, conectores, o terminaciones incorrectas de impedancia. Otra precaucin prctica en el uso de cmaras de vdeo estndar es evitar aquellas con circuitos de ganancia automtica o compensacin de brillantez. stos circuitos pueden cambiar el contraste o la linealidad de la imagen en respuesta a regiones oscuras o brillantes que no estn dentro de la porcin digitalizada de la imagen, y pueden incrementar la ganancia y el ruido para una seal borrosa.

Captulo 2 - 7

Captulo 3 : La Digitalizacin del Vdeo

LA DIGITALIZACIN

DEL VIDEO

La seal de vdeo compuesto contiene toda la informacin necesaria para formar una imagen; pero existe un inconveniente y es el de
que la seal de vdeo es una seal analgica, la cual no puede ser manipulada directamente por una computadora. Por lo tanto, es necesario el cuantificar o discretizar a la seal de vdeo para que la computadora pueda operar en ella. Este proceso de cuantificacin es a lo que llamamos digitalizacin de la seal de vdeo. La digitalizacin de la seal de vdeo implica bsicamente dos consideraciones importantes: 1) El dispositivo o circuito que realiza la digitalizacin. 2) El esquema de digitalizacin que se emplear.

Pgina 3 - 1

Captulo 3 : La Digitalizacin del Vdeo

EL DISPOSITIVO El proceso de digitalizacin es generalmente llevado a cabo mediante un convertidor analgico-digital (ADC) tipo "flash". ste es un circuito integrado conformado por comparadores conectados en paralelo, lo que permite muestrear y cuantificar niveles de voltaje rpidamente (son tpicos los tiempos menores a 100 nanosegundos). El nmero de comparadores depende del nmero de bits del convertidor, a una razn de N=2n , donde N es el nmero de comparadores y n el nmero de bits (por ejemplo, en un convertidor de 8 bits existen 256 comparadores). En este tipo de convertidores, la seal de voltaje a ser digitalizada se aplica simultneamente a una de las entradas de cada uno de los comparadores internos; mientras que las otras entradas de los comparadores se conectan a N voltajes, igualmente espaciados, que son derivados de una red resistiva de referencia, compuesta de resistores de igual valor, y cuyos extremos son conectados a los voltajes de referencia inferior y superior del convertidor. La diferencia de voltaje entre las entradas de dos comparadores adyacentes; corresponden a 1 LSB del rango de entrada. La diferencia entre los voltajes de referencia es conocida como "arco" ("span"), un valor bajo del "arco" (menor a 1V) hace que los niveles de offset as como la no-linealidad lleguen a ser muy significativos, mientras que un valor alto de "arco" hace evidente las limitaciones en potencia de la red resistiva de referencia. Despus del muestreo y cuantificacin, el ADC genera un nmero binario cuyo rango depender del nmero de bits que maneje el ADC; por ejemplo, para un convertidor de 8 bits el valor resultante de la digitalizacin estar entre 0 y 255. ste valor representa un nivel de brillantez y es almacenado inmediatamente en memoria, entonces otra lectura es realizada, de tal forma que se obtienen una serie de valores de brillantez a lo largo de cada lnea de barrido horizontal. La Figura 3-1 muestra la digitalizacin de una seal en intervalos iguales en tiempo y voltaje.

Pgina 3 - 2

Captulo 3 : La Digitalizacin del Vdeo

EL ESQUEMA Cuando hablamos de un esquema de digitalizacin nos referimos a la forma en la cual se va a digitalizar la seal de vdeo compuesto, para lo cual es necesario hacerse los siguientes cuestionamientos: - Las imgenes digitalizadas sern monocromticas o a color? - Se digitalizar completa la seal de video o slo una parte de sta? - De que tamao sern las imgenes? La respuesta a stas interrogantes conformar la implementacin del sistema digitalizador. Con respecto a la primera pregunta, si quisiramos obtener imgenes en color tendramos que digitalizar la seal de crominancia que est sobrepuesta en la seal de vdeo compuesto. Lo anterior implicara un proceso ms complicado comparado con el necesario para digitalizar imgenes monocromticas (ver Conclusiones). En particular, nuestro sistema fue ideado para ser aplicado como un auxiliar en equipos de ultrasonido, los cuales generan imgenes monocromticas en escala de grises. Por ello, y con el fin de simplificar el diseo, se opt por desarrollar un sistema para la obtencin de imgenes monocromticas; para lo cual solamente es necesario digitalizar la seal de luminicencia o brillantez, ignorando la seal de crominancia. Pasando a la segunda pregunta, si digitalizramos toda la seal de vdeo compuesto el diseo del sistema se simplificara an ms, puesto que evitaramos implementar la circuitera lgica necesaria para temporizar el ADC. Sin embargo, con ste diseo el ADC generara un
Pgina 3 - 3

Captulo 3 : La Digitalizacin del Vdeo

mayor nmero de datos para digitalizar un cuadro entero, los cuales tienen que ser almacenados, por lo que el requerimiento de memoria sera mayor; adems de que el ADC trabajara ms tiempo. Adicionalmente, an tendramos que separar o discriminar por medio de software la informacin de la imagen presente en la seal digitalizada. La otra alternativa es digitalizar nicamente la parte de la seal de vdeo compuesto que contiene la informacin de la imagen, en nuestro caso la seal de luminicencia o brillantez. De sta forma slo almacenaramos, la informacin de la imagen, por lo que su interpretacin sera directa. El inconveniente en ste caso es que se necesita circuitera adicional para activar el ADC en los momentos que aparece la seal de luminicencia. En nuestro diseo se opt por sta ltima alternativa. Finalmente, respondiendo a la tercera pregunta, el tamao de las imgenes est en funcin del nmero de datos obtenidos, es decir, del nmero de muestras tomadas por el ADC. Si bien es verdad que a mayor nmero de muestras mayor ser la resolucin de la imagen, tambin es cierto que mayor ser el requerimiento de memoria y de tiempo necesario para realizar la transferencia y despliegue de la informacin de la imagen. En el captulo 2 mencionamos que la seal de vdeo compuesto est organizada en campos pares e impares, cada campo forma una imagen con un grado de definicin menor, pero contiene una exploracin de la pantalla completa. Como una primera opcin podramos, digitalizar ambos campos, pero esto generara un nmero considerable de datos que sera difcil de almacenar y manipular. Por lo tanto, decidimos digitalizar un slo campo de la imagen, obteniendo un cuadro de menor calidad a la imagen original pero lo suficientemente ntido para poder apreciarlo visualmente sobre un monitor. Debido a que el primer campo que se inscribe en la pantalla es el impar, elegimos que ste sera el campo a digitalizar. Ahora, para el caso del formato EIA o RS170, cada campo consta de 262.5 lneas de rastreo horizontal; lo cual nos llev a seleccionar para el nmero de lneas de la imagen la potencia de dos ms cercana a ste nmero, es decir, el 256. Entonces, las imgenes tendrn una altura de 256 pixeles. El ancho de las imgenes es funcin del nmero de muestras que se toman por cada lnea horizontal. Para nuestro sistema, el nmero que result de ciertas consideraciones, que se vern en el siguiente captulo, fue el 256. Por lo tanto, las imgenes digitalizadas son matrices de 256x256 pixeles. OTRAS CONSIDERACIONES. Una caracterstica deseable en la digitalizacin es que el tamao del pixel sea el mismo tanto en la direccin horizontal como en la vertical (es decir, pixeles cuadrados), ya que esto simplifica muchas operaciones de medicin y procesamiento. Para ello se requiere de un reloj bien ajustado para controlar la adquisicin. Puesto que una imagen de vdeo estndar no es cuadrada, ya que guarda una relacin ancho-alto de 4:3, la imagen digitalizada puede representar nicamente una porcin del campo visual completo. Tarjetas digitalizadoras, tambin conocidas como grabadores de imagen, fueron originalmente diseados para grabar arreglos cuadrados de valores (256x256, 512x512 elementos) puesto que las
Pgina 3 - 4

Captulo 3 : La Digitalizacin del Vdeo

dimensiones en potencias de dos simplifican el diseo y direccionamiento en memoria. Muchas de las nuevas tarjetas adquieren arreglos de 640 elementos de ancho por 480 de alto, lo cual satisface las proporciones de una imagen comercial, adems de que proporcionan pixeles cuadrados. Adems de definir el nmero de puntos muestreados a lo largo de cada lnea de rastreo horizontal, y con ello la resolucin de la imagen, el diseo de la tarjeta convertidora tambin involucra la precisin de cada medicin. Convertidores ADC comerciales de bajo costo generalmente miden cada lectura de voltaje para producir un nmero de 8 bits, de 0 a 255. Este rango puede no ser enteramente usado por una imagen, puesto que sta no vara completamente del blanco al negro. Adems, la calidad de la mayora de las cmaras y electrnica asociada rara vez produce voltajes que estn lo suficientemente libres del ruido electrnico como para justificar una digitalizacin de 8 bits completa. Sin embargo, 8 bits corresponden a la organizacin, en bytes, ms comn en memorias, de tal forma que un byte almacenado puede contener el valor de la brillantez de un pixel en la imagen. Otro aspecto de consideracin, es que la exactitud de la conversin est directamente relacionada con la calidad de las referencias del ADC; por lo que es primordial que los valores de stas sean exactas y estables en extremo. Las fuentes de alimentacin de voltaje usadas para circuitera digital (5V) deben preferentemente no ser usadas como fuentes para la generacin de las referencias, debido a la presencia de "picos" de ruido (50-400 mV) en sus lneas de alimentacin y tierra. Generalmente, alimentaciones de +/- 12V +/- 15V son disponibles para circuitos analgicos y estn, usualmente, "limpias" en comparacin con la alimentacin empleada en la circuitera digital; aunque un "rizo" puede estar presente en diferentes formas. Sin embargo, el "rizo" es ms fcil de filtrar que los "picos", por lo que es preferible usar stas fuentes para stos fines. El adquirir imgenes de una cmara de vdeo es en ocasiones referido como "adquisicin de imgenes en tiempo real", pero ste trmino debe propiamente reservarse para aquella razn de adquisicin de imgenes que permita revelar cambios temporales en una aplicacin especfica (generalmente a una velocidad de 16 a 30 cuadros por segundo). Para algunas situaciones en fotografa, se puede requerir que un slo cuadro sea tomado en periodos de varios minutos; pero para otras, exposiciones muy cortas y altas tasas de adquisicin son necesarias.

Pgina 3 - 5

Captulo 4 : El Circuito

EL CIRCUITO

Una vez conocidas las caractersticas de la seal de vdeo y el proceso para digitalizarla, podemos describir el elemento
esencial del sistema de adquisicin de imgenes el cual es una tarjeta digitalizadora. La tarjeta se instala en uno de los puertos de expansin de una PC compatible con el estndar IBM; acepta una seal de vdeo compuesto norma RS-170 a travs de un conector hembra tipo RCA; digitaliza slo los campos impares de la imagen, produciendo matrices de 256x256 elementos (los cuales se almacenan temporalmente en un banco de memorias). La operacin del sistema consiste en un proceso de adquisicin y despliegue continuo de las imgenes digitalizadas. La idea original era realizar un despliegue en tiempo real, pero para simplificar el sistema y la interfase se opt por un esquema de transferencia de datos que limita la velocidad de despliegue de las imgenes, por lo cual slo logramos observarlas a una velocidad de 4 cuadros por segundo (esto, empleando la tarjeta en una PC con procesador 486SX a 25 MHz). Este proceso es controlado por el programa que corre en la PC; el cual se describe en la segunda parte de ste reporte. El circuito de la tarjeta est separado en dos partes: 1) La parte analgica, encargada de la amplificacin, filtrado y separacin de informacin de brillantez y de las seales de control a partir de la seal de vdeo compuesto; y 2) La parte digital, encargada

Pgina 4 - 1

Captulo 4 : El Circuito

de controlar la captura y almacenamiento de la informacin de la imagen obtenida de la seal de vdeo compuesto, as como de proporcionar la interfase hacia la PC. A continuacin se describen detalladamente cada una de estas partes. PARTE ANALGICA La funcin de la parte analgica es tomar como entrada una seal de vdeo compuesto, generada por cualquier fuente de vdeo (con norma RS-170) en su salida tipo RCA, para acondicionarla y obtener la informacin que la tarjeta necesita en el proceso de digitalizacin. La parte analgica est subdividida en 4 partes: 1) Etapa de acople de impedancia, primera amplificacin y filtrado; 2) Separador de pulsos de sincrona de la seal de vdeo compuesto; 3) Muestreo y retencin de la seal de vdeo; y 4) Fijacin de nivel y amplificacin final de la seal de vdeo (eliminacin del offset correspondiente a los pulsos de sincronizacin que acompaan a la seal de vdeo compuesto). La descripcin detallada de cada parte es la siguiente. 1) Etapa de acople de impedancia, primera amplificacin y filtrado El diagrama de esta parte del circuito as como los valores de los elementos utilizados estn indicados en la Figura 4-1. Para acoplar la impedancia de la fuente de la seal de vdeo compuesto (la impedancia puede ser de 75 o 500 Ohms) se tiene un conjunto de resistencias e interruptore. Los interruptores 1 y 2 determinarn la impedancia soportada (segn su posicin en abierto o cerrado), que depender de la fuente de seal de vdeo compuesto (videograbadora, cmaras de vdeo, reproductoras, etc..). Regularmente los interruptores se encuentran cerrados. La seal de vdeo compuesto se amplifica y filtra del ruido por medio de un amplificador operacional. Se utiliza un LF353 que tiene las caractersticas de bajo consumo de energa, un ancho de banda de 4MHz (suficiente para cubrir el margen de la seal de vdeo compuesto, y desechar las seales de alta frecuencia de la informacin de color); y soporte de offset de seal (generalmente contenida en la seal de vdeo compuesto). A la salida se obtiene una seal con la mayor parte del offset eliminado, y con una amplitud de salida menor o igual a 2 Vpp. Los interruptores 3 y 4 son para hacer modificaciones al ancho de banda del filtrado y se encuentran regularmente abiertos. A parte de realizar ajustes en el lmite del filtro para que las seales de color no afecten, en lo general no tienen efectos trascendentes. Ntese que la seal de vdeo compuesto es introducida de tal manera en el circuito que los niveles de blanco quedan en la parte superior de la seal y los niveles obscuros se encuentran en la parte inferior.

Pgina 4 - 2

Captulo 4 : El Circuito

2) Separador de pulsos de sincronizacin de la seal de vdeo compuesto Esta etapa se implement con un separador de sincrona de vdeo: el circuito integrado LM1881 "Vdeo Sync Separator". Este circuito fue diseado especialmente para la separacin de los pulsos de sincrona en los diferentes formatos de seales de vdeo como son el NTSC, PAL, SECAM y otros formatos no estndar. El circuito recibe por entrada una seal de vdeo compuesto con una amplitud de 0.5 V a 2 Vpp. El circuito entrega las siguientes seales por separado: sincrona compuesta, sincrona vertical, salida par-impar de imagen y salida Burst. Gracias a la flexibilidad en el voltaje de alimentacin (de 5 a 12 Volts) se puede polarizar con el mnimo y as obtener salidas tipo TTL, que sern utilizadas en la parte digital. Las seales que se emplean en el circuito son la Par-Impar y la de Burst. La primera de ellas mantiene un nivel alto durante el campo par del cuadro, as como un nivel bajo mientras dura el campo impar; resultando una onda cuadrada simtrica como la mostrada en la Figura 4-2a. La segunda seal indica el inicio de la rfaga de color (Color Burst), la cual est presente casi inmediatamente despus del pulso de borrado horizontal (ver Figura 2-4), razn por la cual sta seal se utilizar como un indicativo del inicio de la lnea de rastreo horizontal. La morfologa de esta seal puede apreciarse en la Figura 4-2b.

La forma en que se utiliza el circuito es igual al del diagrama de conexin bsico (que puede encontrarse en el manual de dispositivos lineales de National Semiconductor) y que puede apreciarse en la Figura 4-3. La seal de entrada del separador de sincrona se toma de la primera etapa y se divide su amplitud a menos de la mitad con un divisor de voltaje, para evitar sobrecarga en el circuito. Como ya se mencion, las salidas que se utilizan son: la salida Par-Impar de imagen para indicar el inicio de la captura de una imagen; y la salida
Pgina 4 - 3

Captulo 4 : El Circuito

Burst, que habilitar el reloj digital de muestreo con el comienzo de cada lnea de barrido horizontal. sta salida, en forma negada o invertida, tambin activa el amplificador muestreador/retenedor de nivel. 3) Muestreo y retencin de la seal de vdeo El muestreo y retencin de la seal es, realizado mediante el circuito integrado LF398, que es un amplificador muestreadorretenedor ("Sample-Hold Amplifier"). Este circuito muestrea y retiene la seal de vdeo compuesto en cada inicio de lnea horizontal, lo que ocurre con cada pulso de Burst. Como el circuito es activado con flancos de subida, la seal de Burst es invertida. Como resultado, a su salida se genera un nivel de voltaje igual al valor mas bajo de la seal de brillantez, es decir, el negro. Como ste nivel es igual a la altura de los pulsos de borrado (ver Figura 2-3), ser utilizado para eliminar a los mismos de la seal de vdeo en la ltima etapa de amplificacin en la parte analgica, antes de introducirla al convertidor A/D. La conexin del integrado, incluyendo sus valores, se indica en la Figura 4-4. La seal de entrada es tomada de la primera etapa de amplificacin; el muestreo y retencin de la seal es, activado a travs de la compuerta de disparo (pin 8), generando la captura de una muestra de la seal de vdeo, la cual se retiene hasta que se genere otro disparo. A la salida se le adiciona un seguidor de voltaje, construido con el integrado LF353, con el fin de que no existan prdidas por el acoplamiento con la siguiente etapa (ver Figura 4-4). 4) Fijacin de nivel y amplificacin final de la seal de vdeo Esta ltima etapa de la parte analgica entrega la seal de vdeo con las caractersticas necesarias para ser acoplada al convertidor analgico-digital. La Figura 4-5 muestra el diagrama de sta etapa. Un amplificador diferencial, construido con el LF353, se utiliza para obtener la diferencia entre la seal amplificada y filtrada en la primera etapa y la salida del amplificador muestreador-retenedor obtenida en la tercera etapa. Como salida final, slo queda la parte que contiene la informacin de brillantez de la imagen, teniendo los limites de nivel de voltaje que soporta el convertidor. Adems, se utiliza un diodo rectificador y un seguidor de voltaje para evitar la cada de la seal y que no existan saturaciones. Como se observa en la Figura 4-5, esta etapa contiene dos resistores variables, Ra y Rb, que determinan la amplificacin de cada seal de entrada al amplificador diferencial. El resistor Ra controla la amplitud de la seal de salida, para que sta sea menor o igual al nivel requerido por el convertidor (en este caso se busca un voltaje menor o igual a 2Vpp); mientras que con el resistor Rb se puede fijar el nivel inferior de voltaje (en el circuito se busca un nivel igual a 0 V). Regularmente slo es necesario modificar el nivel superior, en este caso con Ra.

Pgina 4 - 4

Captulo 4 : El Circuito

PARTE DIGITAL La parte digital controla la digitalizacin de la imagen, almacena los datos provenientes del convertidor analgico-digital en una memoria temporal, y comunica la tarjeta con la PC para realizar la transferencia de datos y seales de control. En base a, stas funciones, la parte digital se puede subdividir en cinco sistemas interactivos: 1) Generador de pulsos de reloj, 2) Control principal de la tarjeta, 3) Convertidor Analgico-Digital, 4) Sistema de memoria y generador de direcciones, y 5) Puertos de entrada-salida. Estos sistemas son descritos a continuacin. 1) Generador de pulsos de reloj El reloj de la tarjeta esta formado por un cristal, dos compuertas NAND 74LS00 y por un conjunto de resistencias y capacitores que funcionan como estabilizadores de frecuencia; como se aprecia en la Figura 4-6. La onda generada tiene una frecuencia de 20 MHz. El reloj es habilitado por el flip-flop de habilitacin de reloj (74LS74) o "F-F CE". Este ltimo se encarga de que una vez que se ha muestreado 256 veces una lnea, el reloj se detiene y no vuelve a ser habilitado sino hasta la siguiente lnea, cuando la seal de Burst dispara al F-F CE. El reloj genera una onda con frecuencia de 20 MHz, por lo que, si muestrearamos 256 veces a sta frecuencia slo digitalizariamos 12.8 microsegundos de la lnea de barrido horizontal (cuya duracin total es de 63.5 microsegundos), lo que representa nicamente la cuarta parte de informacin contenida en la lnea (ver Figura 4-7a). Por ello es necesario disminuir la frecuencia del reloj a un valor que nos permita abarcar los 52 microsegundos de imagen. Considerando 256 muestras por lnea, con una tasa de muestreo de 5MHz cubrimos 51.2 microsegundos de la lnea, lo que prcticamente comprende en su totalidad la parte correspondiente a la informacin de imagen (ver Figura 4-7b). Para ello se emplea un divisor de frecuencia conformado por dos flip-flops tipo "D" 74LS74 conectados en cascada, cada uno de los cuales divide a la mitad la frecuencia de su seal de entrada, resultando a la salida del divisor una onda con una frecuencia de 5MHz.

Pgina 4 - 5

Captulo 4 : El Circuito

2) Control principal de la tarjeta La Figura 4-8 corresponde a esta etapa, que se compone de dos compuertas NAND 74LS00 denominadas como NAND-1 y NAND-2, dos multivibradores monoestables 74LS123 referidos como MM-1 y MM-2, y dos flip-flops tipo "D" 74LS74 que llamaremos el flip-flop de habilitacin de reloj (F-F CE) y el flip-flop de fin de digitalizacin (F-F EOD). Adems, se tienen cuatro seales de control para la tarjeta, dos de stas controlan a F-F CE y a F-F EOD, una a NAND-2, y otra al generador de direcciones. Las seales de control provienen de la PC y son introducidas por medio del puerto de entrada de la tarjeta (implementado con un 74LS373). Dichas seales y su significado de acuerdo a su estado lgico se enumeran en la Tabla 4-1.

Pgina 4 - 6

Captulo 4 : El Circuito

Seal de Control Estado Lgico de la seal = 1

Significado de la seal Estado Lgico de la seal = 0

MasterClock_Enable

Habilita el reloj general de la tarjeta

Deshabilita el reloj general de la tarjeta

5MHz_Enable / ManualClock

Permite el paso de la seal de reloj (a 5Mhz) hacia los contadores

Impide el paso de la seal de reloj hacia los contadores

Durante el proceso de despliegue, genera, va software, los pulsos de reloj

ADC_Enable

Habilita al ADC e impide la lectura de las memorias

Deshabilita al ADC y permite la lectura de las memorias

Address_Reset

Reestablece la cuenta del generador de direcciones a 0000H

Mantiene la cuenta del generador de direcciones

TABLA 4-1.- Seales de control de la tarjeta.

A continuacin explicamos como interactan los dispositivos y seales anteriores para efectuar las funciones de control de la tarjeta. El F-F CE (de habilitacin de reloj) se encarga de0 detener al reloj de la tarjeta; esto ocurre cada vez que se ha muestreado 256 veces una lnea, habilitndolo nuevamente hasta la lnea siguiente. ste flip-flop es disparado por la seal de Burst (principio de lnea) proveniente del separador de sincrona LM1881; el valor de su entrada es la seal de control MasterClock_Enable, que proviene directamente del puerto de entrada (latch 74LS373); y su salida est siendo restablecida cada vez que los contadores del generador de direcciones alcanzan el valor de 100H (256 decimal), es decir, cuando se activa la seal de fin de cuenta del segundo contador (pin 12). Debido a que sta seal de fin de cuenta es muy corta, necesita ser prolongada un poco, lo cual se realiza por medio de un multivibrador monoestable 74LS123 (MM-1), ya que de otra forma el flip-flop no la detectara. De esta forma, si la seal MasterClock_Enable est habilitada (en un estado lgico "alto") la salida del F-F CE ser puesta en "alto" con los flancos de subida de la seal Burst; permaneciendo en este estado mientras no se alcance la cuenta de 256 en el generador de
Pgina 4 - 7

Captulo 4 : El Circuito

direcciones; momento en el cual se dispara el multivibrador monoestable MM-1, que genera el pulso "CLR" del F-F CE y que cambia el estado lgico de su salida a un nivel "bajo". Por otro lado, la salida del reloj (a 5 MHz) no est conectada directamente a los subsistemas que requieren el pulso del reloj; sino que antes llega a unas compuertas NAND que funcionan como habilitadoras de reloj para el sistema, es decir, stas compuertas tienen la funcin de dejar pasar la seal de reloj dadas ciertas condiciones. Como se puede ver en la Figura 4-8, la primera compuerta o NAND-1 toma sus entradas del reloj y del flip-flop de fin de digitalizacin "F-F EOD". Este flip-flop habilita a la compuerta NAND-1 slo cuando la seal Par-Impar sea impar, asegurando as la digitalizacin de un solo campo. La salida de la compuerta NAND-1 va directamente a la entrada de reloj del convertidor analgico-digital y a la terminal de escritura de las memorias. As, las memorias y el ADC estn funcionando cuando se est llevando un barrido de campo (en este caso, el impar). El flip-flop de fin de digitalizacin F-F EOD se encarga de que solamente durante el campo impar el ADC y la compuerta NAND-1 estn habilitados, y que las memorias RAM no puedan ser ledas. El F-F EOD es disparado por la seal Par-Impar invertida; su entrada es la seal de control ADC_Enable que proviene del puerto de entrada (siendo el programador el responsable de generar dicha seal); y su restablecimiento lo realiza un multivibrador monoestable 74LS123 (MM-2), el cual es disparado cuando el generador de direcciones alcanza la cuenta mxima, indicando que la digitalizacin est lista y la memoria llena. En realidad la funcin del MM-2 es la misma que la del MM-1, es decir, prolongar un poco la seal de fin de cuenta del ultimo contador para que el flip-flop pueda detectarla. Suponiendo que la seal ADC_Enable est habilitada, el F-F EOD ser activado (puesto en "alto") cuando la seal ParImpar cambie su estado lgico de "bajo" a "alto" (ya que entre el LM1881 y el F-F EOD existe un negador, sta seal llega invertida al flip-flop). La salida del F-F EOD permanecer en "alto" hasta que el generador de direcciones alcance su cuenta mxima (FFFF H) y dispare al multivibrador MM-2, generando ste el pulso "CLR" del flip-flop y cambiando la salida a un estado lgico "bajo". La segunda compuerta o NAND-2 toma sus entradas de la compuerta NAND-1 y de la seal de control 5MHz_Enable/ManualClock proveniente del puerto de entrada. Su salida esta conectada a la terminal "UP" del primer contador 74LS193; as que aunque la compuerta NAND-1 est habilitando el reloj para el ADC y la terminal de escritura de las memorias, los contadores del generador de direcciones no sern alimentados por el reloj de la tarjeta hasta que la seal de control 5MHz_Enable/ManualClock sea puesta en un nivel "alto", habilitando as a la compuerta NAND-2 . Adems, una vez terminada la digitalizacin, es a travs de la compuerta NAND-2 y por medio de la seal de control 5MHz_Enable/ManualClock que generamos los pulsos de reloj para los contadores y as realizar la lectura de las memorias desde la PC. Por ello, la compuerta NAND-2 cumple con dos

Pgina 4 - 8

Captulo 4 : El Circuito

funciones, la de habilitar el reloj para los contadores durante la digitalizacin y posteriormente la de generar los pulsos para la lectura de las memorias.

3) Sistema de Memoria y generador de direcciones El generador de direcciones para las memorias est conformado por un grupo de cuatro contadores 74LS193 conectados en cascada, lo que les permite contar desde 0000H hasta FFFFH (65536 eventos) como se puede ver en la Figura 4-9. La cuenta se incrementa con cada pulso de reloj que llega a la terminal "UP" del primer contador, que durante el proceso de digitalizacin coincide con la adquisicin de un nuevo dato. La entrada de restablecimiento de los contadores est conectada a la seal de control Address_Reset, que cuando es activada pone a los contadores en su valor inicial (0000H), listos para empezar a incrementar la direccin de memoria en que se desea escribir o leer un dato. El banco de memoria de la tarjeta esta formado por dos memorias RAM HM62256, que tienen una capacidad individual de 32 KB, dando un total de 64 KBytes. El bus de direcciones de las memorias est conectado a los contadores y para generar la ltima lnea de direccin se utiliza la terminal habilitadora del circuito ("chip enable") y un negador 74LS04 (ver Figura 4-9). La terminal de habilitacin de salida ("output enable") de las memorias est conectada a la salida del flip-flop de fin de digitalizacin "F-F EOD", as como la seal de habilitacin para escritura ("write enable") proviene de la salida de la compuerta NAND-1; por lo que cuando el sistema est digitalizando, las memorias estarn habilitadas para recibir los datos provenientes del ADC conforme se van adquiriendo; y cuando se acabe de digitalizar las memorias estarn listas para ser ledas. 4) Convertidor Analgico-Digital El convertidor utilizado en este proyecto es el MC10319 que es un convertidor analgico-digital tipo flash, de 8-bits; velocidad de muestreo de hasta 25MHz; y rango de la seal de entrada de 1 a 2Vpp, entre +/- 2V, por lo que puede operar en modo unipolar o bipolar. El convertidor analgico-digital es habilitado por el flip-flop de fin de digitalizacin "F-F EOD"; el cual permite que el ADC est activo al momento de llevarse la digitalizacin, es decir, mientras la salida del flip-flop est en "alto" (lo cual se da con las siguientes condiciones: la seal ADC_Enable est habilitada, se est explorando el campo impar y no se han llenado las memorias). Al terminar el ciclo de digitalizacin, la salida del F-F EOD cambia su estado de "alto" a "bajo", originando as que las salidas del ADC se pongan en tercer estado; permitiendo as la lectura de las memorias sin que haya contingencia en el bus. La seal de reloj del convertidor (pin 18) proviene de la salida de la compuerta NAND-1, que opera a una frecuencia de 5 MHz (ver Figura 4-10). La salida de sobrerrango ("overrange")

Pgina 4 - 9

Captulo 4 : El Circuito

se activa (cambia su estado a "alto") cuando la seal de entrada es mas positiva que VRT- (1/2)LSB, y no tiene capacidad de alta impedancia. La seal de entrada del convertidor proviene de la parte analgica de la tarjeta, tiene una amplitud menor o igual a 2Vpp, en un rango de 0V a 2V; por lo que se polariza al ADC para operar en ste rango. Puesto que la exactitud de la conversin est directamente relacionada con la precisin de los voltajes de referencia, es imperativo que los voltajes en las entradas VRT y VRB sean exactos y estables. Debido a que en la fuente usada para los circuitos digitales de la computadora (5 V) es comn la presencia de "picos" de ruido, es preferible usar la fuente empleada por la parte analgica (+/- 12 V) para generar los voltajes de referencia, en este caso VRB=0V y VRT=2V. Para ello se emple el regulador ajustable LM723, cuya configuracin se aprecia en la Figura 4-10, obteniendo un voltaje de salida de 2V; el cual se aplica a un zener ajustable LM431 para garantizar su estabilidad. De este mismo circuito obtenemos el voltaje para la entrada VRM, que es de 1V; mientras que la otra terminal de referencia, VRB, se conecta a tierra. Los resistores variables R2 (6.5 KW) y R4 (1 KW) se encargan de realizar el ajuste fino en los valores de los voltajes VRT y VRM, respectivamente. 5) Puertos de Entrada-Salida La tarjeta est planeada para conectarse en una PC, y , puesto que la mayora de los dispositivos utilizados por una PC son controlados y monitoreados usando los puertos de entrada/salida (I/O), para realizar la comunicacin entre ambos dispositivos se implementaron tres puertos en la tarjeta: el puerto de entrada o de control, el puerto de salida o de estado, y el puerto de datos; los dos primeros de 4 bits y el ltimo de ocho, todos unidireccionales: el primero es de escritura y los dos ltimos de lectura. stos puertos son direccionados accesando el espacio de direcciones asignado a los puertos de E/S con el que cuentan los microprocesadores de la familia 8086. Los datos son enviados a estos puertos usando la instruccin OUT del microprocesador. Los datos son ledos de estos puertos usando la instruccin IN. La arquitectura de los microprocesadores basados en un 8086 soporta un espacio de direcciones para puertos de I/O que consta de 65,536 direcciones nicas. El diseo de la PC no usa todo el espacio de direcciones; por lo que solamente los 10 bits menos significativos ( bits del 0 al 9) del bus de direcciones son usados para decodificar los puertos. Como se observa en la Figura 4-11, los puertos de salida del sistema, tanto el de datos como el de estado, consisten de buffers de tres estados (74LS244 y 74LS125 respectivamente); mientras que el de entrada est basado en un latch tambin de tres estados (74LS373). Los puertos tienen que ser decodificados, es decir, hay que encontrar un bloque libre en el espacio de direcciones asignado a los puertos de E/S para asignrselo a los puertos, y , entonces, disear un circuito para habilitar los puertos desde la PC cuando se requiera un acceso a ellos.
Pgina 4 - 10

Captulo 4 : El Circuito

Para esto se emple una tcnica de decodificacin de direcciones en la cual es posible decodificar un bloque de ocho puertos, y, adems, se puede mover dicho bloque sobre el espacio de direcciones mediante el uso de interruptores. En la Figura 4-11 se muestra el circuito decodificador, el cual emplea un circuito comparador octal 74LS688, dos decodificadores de 3 a 8 lneas 74LS138 y un grupo de interruptores (DIP switches). Para seleccionar el bloque de memoria, en las entradas del comparador se introducen, por un lado, un valor binario que depende del grupo de interruptores; mientras que por el otro, los bits A3 al A9 del bus de direcciones de la PC y la seal AEN (address enable). Esta ltima seal es necesaria para evitar una decodificacin invlida durante un ciclo DMA. Cuando el valor en el grupo de interruptores es igual al del bus de direcciones, la seal de igualdad del comparador se activa; esta seal habilita a los dos decodificadores 74LS138. Uno de los dos 74LS138 se activar dependiendo de si se trata de una operacin de lectura o de escritura, ya que las otras terminales de habilitacin de los decodificadores estn conectadas a las seales IOR (I/O read) e IOW (I/O write) del bus de la PC. Entonces, una de las ocho salidas de los 74LS138 se activar dependiendo del valor de los bits del A0 al A3 del bus de direcciones, seleccionando as uno de los ocho puertos dentro del bloque de memoria elegido. Las direcciones asociadas a cada puerto sern discutidas cuando se hable del programa que controla a la tarjeta (segunda parte del reporte). El bit 9 del bus de direcciones (A9) tiene un significado especial en la PC. Cuando ste bit es inactivo (estado lgico bajo), no se pueden leer datos de los puertos de expansin, sino solamente de direcciones del sistema. Cuando est activado (estado lgico alto), se habilita la lectura de los puertos. Entonces, para los puertos de entrada, las 1024 direcciones soportadas por la PC se dividen en 512 direcciones para el sistema y 512 direcciones para los puertos de expansin. Esta restriccin no se aplica a los puertos de salida, donde cualquiera de las 1024 direcciones pueden ser usadas como puertos de salida Para la operacin de la tarjeta, como se mencion con anterioridad, se cuentan con cuatro bits de entrada para el control y cuatro bits de salida para monitorear el estado de la tarjeta. Las seales de control fueron descritas en la seccin del control principal de la tarjeta; por lo que solamente nos resta por describir las seales de estado, lo cual realizamos a continuacin.

Pgina 4 - 11

Captulo 4 : El Circuito

Las seales de estado proporcionadas por la tarjeta, a travs del buffer 74LS125, son: - EOD (End Of Digitalization).- sta seal proviene del F-F EOD, y nos indica, mediante la variacin de su estado, cundo se ha acabado de digitalizar una imagen. - Overrange .- La seal de sobrerrango es originada por el ADC, e indica que su seal analgica de entrada est sobrepasando el valor del voltaje de referencia superior; requiriendo un ajuste, ya sea en el regulador del voltaje de referencia o parte analgica. - Burst .- La seal de rfaga de color es tomada del separador de sincrona LM1881, y su presencia nos indica que existe vdeo; esto mediante el sensado en las variaciones de estado lgico en la seal. Odd/Even.- sta seal corresponde a la seal Par-Impar, se utiliza con el fin de que nos indique si existe vdeo y si ste se encuentra en pausa o est corriendo; lo que se deduce si se presentan cambios de estado en la seal. bien en la etapa final de ganancia de la

La correspondencia de las seales de control, de estado y los datos de la tarjeta con los bits del bus de datos de la PC es la siguiente: Para los bits de entrada o de control: D0: 5MHz_Enable/ManualClock D1: ADC_Enable D2: MasterClock_Enable D3: Address_Reset Para los bits de salida o de estado: D0: EOD (End Of Digitalization) D1: Overrange D2: Burst
Pgina 4 - 12

Captulo 4 : El Circuito

D3: Odd/Even Para los bits de datos: D0 - D8: D0 - D8 Entonces, las operaciones que se puede realizar mediante las seales de control y estado son: inicializacin del circuito, captura de una nueva imagen, lectura de memoria (lectura de una imagen almacenada). Estas tres operaciones bsicas son usadas por el programa para lograr la captura y despliegue de una imagen. El diagrama completo del circuito de la tarjeta digitalizadora se muestra a continuacin de manera compacta, pero se aade un diagrama de mayores dimensiones en un apndice al final del trabajo.

Pgina 4 - 13

Captulo 5: Modos de Vdeo

5
DE VDEO

MODOS

Una imagen es una formacin ordenada de reas pequeas obscuras y luminosas. Cada rea pequea de luz o sombra es un
elemento de imagen o un detalle de imagen (pxel). Todos los elementos en conjunto contienen la informacin visual de la imagen. Similarmente, en el monitor de una computadora una imagen es formada punto por punto y el conjunto total conforma la imagen desplegada. Entonces, para desplegar una imagen en el monitor de la PC hay que trabajar en modo grfico, modalidad en la cual es posible especificar independientemente cada pxel. Por ello, en este captulo expondremos los modos de vdeo de la PC y su evolucin, con especial nfasis en los modos grficos. EVOLUCIN DE LOS MODOS DE VDEO Los recursos grficos de la PC, bajo el estndar IBM, dependen en gran medida de un circuito llamado adaptador de vdeo o tarjeta de vdeo. La evolucin de este circuito es lo que permiti a los modos grficos de la PC mejorar; pero tambin propici que se volvieran ms complejos y confusos en su funcionamiento. En un principio existi el adaptador MDA ( Monochrome Display Adapter) que permita desplegar solamente caracteres, soportando pantallas de 80x25 caracteres, y donde la nica forma de poder crear grficos era usando el conjunto de caracteres grficos del modo texto (identificados por los cdigos ASCII del B0h al DFh), los cuales se empleaban para formar cuadros, tablas y grficas de barras; y , por supuesto, todo esto sin color. La interfase utilizada con el monitor era directa.

Pgina 5 - 1

Captulo 5: Modos de Vdeo

Ms tarde el color estuvo disponible, aunque en forma limitada, con el adaptador CGA (Color Graphics Adapter), pero a costa de un modo texto deficiente. El barrido del monitor tenia menos lneas y el monitor de pantalla de fsforo no estaba diseado para observarlo de cerca. El adaptador CGA proporciona una resolucin de 640x200 pixeles y 2 colores de una paleta de 16. Este adaptador utiliz una interfase digital RGB (Reed Green Blue) directa o una interfase de vdeo compuesta, ambas a una frecuencia de rastreo igual a la del T.V. estndar. El siguiente adaptador en ser introducido fue el adaptador EGA (Enhanced Graphics Adapter). Este adaptador soporta una resolucin de 640x350 pixeles, con 16 colores de una paleta de 64. El adaptador EGA pudieron emular los modos texto y grfico de los adaptadores MDA y CGA, e incorpor una nueva frecuencia de rastreo y refresco para as poder soportar su capacidad de alta resolucin; por lo que fue necesario introducir al mercado el monitor EGA. Con el anuncio de la familia PS/2, surgieron dos nuevos tipos de adaptadores, los cuales soportan interfases analgicas RGB a color. El primero de ellos, el adaptador MCGA (Multi Color Graphics Adapter), soporta todos los modos del antiguo CGA, adems de adicionar los modos de 640x480 pixeles a 2 colores y de 320x200 pixeles a 256 colores. El otro adaptador fue el VGA (Vdeo Graphics Array), el cual soporta todos los modos texto y grfico del viejo EGA, los nuevos modos del MCGA y un nuevo modo: 640x480 pixeles a 16 colores. Para poder emplear este adaptador, un nuevo monitor VGA fue requerido. Los fabricantes de monitores respondieron a las diferentes frecuencias de rastreo y refresco, diferentes esquemas de codificacin de color, y a los tipos de interfases directas y analgicas; proporcionando un nuevo tipo de monitor. Los monitores "Multisync" pueden aceptar seales a diferentes frecuencias y son configurados para diferentes tipos de interfases de los adaptadores. Por incorporar stas caractersticas, el costo de stos monitores es significativamente superior al de los monitores compatibles nicamente con adaptadores EGA o VGA. En base a lo anterior, el monitor VGA y su adaptador probablemente dan el mejor desempeo y resolucin en base a su precio, ya que soporta todos los modos de una PC y su precio es muy inferior al de un "Multisync". A continuacin se muestra la Tabla 5-1, la cual resume los modos de vdeo soportados por cada adaptador de vdeo de PC. La Tabla 5-2 indica los tipos de interfase requeridos por cada adaptador.

Pgina 5 - 2

Captulo 5: Modos de Vdeo

Modo de Vdeo Modo texto 40x25 Modo texto 80x25 Modo texto 80x25 Modo grfico 720x350 Modo grfico 320x200 Modo grfico 640x200 Modo grfico 320x200 Modo grfico 640x200 Modo grfico 320x200 Modo grfico 640x350 Modo grfico 640x350 Modo grfico 640x480 Modo grfico 640x480

Escala de Color/Grises 16 16 Monocromtico Monocromtico 4 2 16 16 256 Monocromtico 16 2 16

Tipo de adaptador de Vdeo CGA, EGA, MCGA, VGA CGA, EGA, MCGA, VGA CGA, EGA, MCGA, VGA, HMDA HMDA (no en BIOS) CGA, EGA, MCGA, VGA CGA, EGA, MCGA, VGA EGA, VGA EGA, VGA MCGA, VGA EGA, VGA EGA, VGA MCGA, VGA VGA

Tabla 5-1. Modos de vdeo soportados por los adaptadores de vdeo de las PC. Adaptador de vdeo CGA MDA / HMDA EGA MCGA VGA Tipo de interfase RGB digital directa vdeo compuesta Directa RGB digital directa RGB analgica RGB analgica Tabla 5-2. Interfases de vdeo soportadas por los adaptadores de vdeo. Otros modos pueden ser posibles por medio de la programacin del adaptador de vdeo, modificando su modo de operacin. Adems, los adaptadores anteriormente mencionados, en muchas instancias, ofrecen modos superiores llamados "SuperEGA" o "SuperVGA", proporcionando una mejor resolucin as como un nmero de colores adicionales; disponibles generalmente en una forma compatible con los modos de vdeo estndar. FUNCIONAMIENTO DEL MODO GRFICO En modo grfico cada pxel se almacena y direcciona individualmente (bit-mapped), es decir, a cada bit o conjunto de bits en memoria les corresponde un pixel en la pantalla del monitor (ver Figura 5-1), lo cual requiere una cantidad considerable de memoria. An en el caso ms simple, que es cuando se utiliza un solo bit para especificar cada pixel, el requerimiento de memoria es mucho mayor que en el modo texto. Esto se debe a que en el modo texto no se manejan pixeles individuales sino caracteres, los cuales se guardan como
Pgina 5 - 3

Frecuencia de sincrona horizontal. 15.75 KHz 18 KHz 21.8, 18, 15.75 KHz 31.5 KHz 31.5 Khz

Captulo 5: Modos de Vdeo

cdigo ASCII; por lo que un carcter siempre ocupar un byte de memoria. El nmero de caracteres desplegables, en modo texto, generalmente es de 40x25 o de 80x25 (columnas x renglon), mientras que el nmero de pixeles desplegables en modo grfico es de hasta 640x480. Entonces, es vital comprimir la informacin; no slo para ahorrar memoria, sino tambin para hacer posible una lectura rpida de la memoria de vdeo, lo suficiente para sincronizarse con el barrido del monitor.

LOS COLORES EN LA PC Los colores en un monitor de computadora, al igual que en un T.V. de color, se forman con el uso de tres caones de color. Cada can corresponde a un color primario aditivo: rojo, verde y azul; y se representan por sus nombres en ingls: Red, Gren y Blue (RGB). Como sabemos, de la teora del color, podemos obtener cualquier color variando la intensidad de cada uno de los colores primarios y sumndolos. El valor que puede tomar la intensidad de cada can para formar un color, se conoce como atributo o descriptor. En algunos modos de vdeo, los descriptores de un grupo de colores se colocan en una tabla llamada "paleta" (en realidad, en algunas tarjetas de vdeo la paleta es un circuito); entonces, para desplegar un pxel se lee de la memoria el valor que describe al pxel (su color), y ste se usa para seleccionar una de las entradas de la paleta. El contenido de sta entrada se usa para generar la seal de vdeo, pues contiene los atributos RGB para los caones de color.

Pgina 5 - 4

Captulo 5: Modos de Vdeo

De acuerdo al nmero de colores que se quieran obtener depender el nmero de bits con el cual se representar a un pxel. Por ejemplo, con un bit por pxel cada pxel puede tomar los valores 1 0, los cuales pueden representar dos colores; con dos bits se tendran cuatro colores, y con un byte se podrn especificar hasta 256 colores. En consecuencia, a mayor nmero de colores mayor nmero de bits sern necesarios para representar un pixel, y por consecuencia un mayor requerimiento de memoria. Esto es evidente en la Tabla 5-1, donde se observa que a mayor nmero de colores menor es la resolucin, es decir, el nmero de pixeles. Esto es lgico, ya que, por su tamao, menor nmero de pixeles pueden ser almacenados sin tener que incrementar la memoria. Como resultado de esto tenemos que en el adaptador CGA existen 16 colores posibles, debido a que en ese adaptador cada atributo RGB solo consta de un bit. Adems de los tres bits asociados a cada descriptor, existe un bit para especificar el nivel total de brillantez o intensidad. Entonces, tenemos cuatro bits en total, y por lo tanto 16 combinaciones (colores) posibles. En el EGA, a cada atributo se le asignan dos bits, por lo que tenemos seis bits en total; lo que corresponde a 64 combinaciones o colores. De los 64 colores, slo 16 son cargados en la paleta. Las tarjetas VGA y MCGA utilizan un convertidor digital-analgico (DAC) para generar el vdeo. Cada atributo se especifica con seis bits (64 diferentes valores por atributo); entonces, en total hay 18 bits, los cuales pueden generar 262,144 posibles colores. Sin embargo, el DAC cuenta con solo 256 registros, por lo tanto slo hay 256 colores disponibles. An mas, en el modo VGA slo es posible accesar paletas de 16 colores (de manera semejante al EGA); esto debido a la forma de organizar la memoria, que a su vez es consecuencia de la cantidad de memoria requerida. Para manejar 256 colores, cada pxel requiere de un byte para su representacin en memoria; por lo que si quisiramos tener ms colores el requerimiento de memoria sera muy grande, sta es la razn principal para usar solo 256 de los 262,144 colores posibles.

Pgina 5 - 5

Captulo 5: Modos de Vdeo

LA MEMORIA DE VIDEO Mencionemos ahora un poco sobre la forma en que se organiza la memoria en los diferentes modos de vdeo. En la Tabla 5-1, podemos observar que para VGA y EGA existen los modos 640x480x16 y 640x350x16 (columnas x renglones x colores) respectivamente; los cuales requieren 150 y 110 KBytes de memoria. sta cantidad de memoria tiene que ser leda 60 veces por segundo. Para lograr esto, la memoria de vdeo o buffer de vdeo se organiza de una forma muy particular, la cual se conoce como "memoria traslapada" (interleaved memory) y se ilustra en la Figura 5-2. sta forma de organizacin consiste en dividir a la memoria en cuatro pginas de 64 KBytes, las cuales ocupan el mismo espacio de memoria y son accesadas en paralelo.

El espacio de memoria mencionado comienza en la direccin A000:0000H y es conoce como memoria de vdeo (memory buffer). Las pginas se enumeran como 0, 1, 2 y 3. Entonces, si leemos el bit 7 del primer byte de cada una de las pginas (en el orden 3,2,1,0) obtendremos un nmero de cuatro bits, que especifica una de las 16 entradas de la paleta, que a su vez especificar el color del pxel de la esquina superior izquierda (ver Figura 5-2). Como las cuatro pginas tienen la misma direccin, para tener acceso a ellas el CPU requiere de cuatro flip-flops tipo seguro ("latches") intermediarios; que realizan funciones de registros. Para leer o escribir a la memoria de vdeo traslapada se tiene que usar un procedimiento un poco complicado. En los artculos citados en la bibliografa (The PC graphics maze y Programming the enhanced graphics adapter), dicho procedimiento se describe y ejemplifica a nivel del lenguaje ensamblador.

Pgina 5 - 6

Captulo 5: Modos de Vdeo

Para todos los modos grficos del controlador CGA, la memoria de vdeo empieza en la direccin B800:0000H. Cada byte se lee de izquierda a derecha. Las lneas horizontales pares y las impares ocupan dos bloques separados en la memoria de vdeo. Todos los dems modos de vdeo usan la memoria de vdeo como un arreglo lineal que empieza en A000:0000H; es decir, el primer elemento del arreglo sera el pxel de la esquina superior izquierda, el segundo sera el segundo pixel del primer rengln, y as sucesivamente (ver Figura 5-3).

Para programar en modo grfico, se pueden usar las rutinas de biblioteca con las cuales cuentan los lenguajes de alto nivel como: C, Pascal, Basic, etc., Sin embargo, los programas tambin pueden hacer uso directo de las rutinas y subrutinas de servicio del BIOS, por lo que es conveniente familiarizarse un poco con stas. RUTINAS DEL BIOS Los programas que emplean las rutinas del BIOS tienen varias ventajas: mayor tiempo de vida til, mayor velocidad y ms libertad para disear, sobre todo cuando hay que escribir los pixeles en la memoria de vdeo. Todas las rutinas de servicio del BIOS estn agrupadas en la interrupcin 10 (INT 10H); para invocarlas, hay que colocar el nmero de la rutina de servicio requerida en el registro AH y el de la subrutina usualmente en el registro AL. Por ejemplo, para invocar los modos de vdeo, los valores a enviar son los siguientes: AH=0 y AL=nmero del modo. La Tabla 5-3 contiene los diferentes modos de vdeo (y sus caractersticas) que se pueden invocar desde el BIOS de acuerdo al valor enviado en AL.

Pgina 5 - 7

Captulo 5: Modos de Vdeo

Valor en AL 00H y 01H

Tipo de adap- Texto (carac- teres tador por rengln) CGA EGA MCGA VGA 40x25

Display (pixeles por lneas) 320x200 320x350 320x400 360x400

Matriz de un Nmero de colores caracter (ancho manejapor alto) dos 8x8 8x14 8x16 9x16 8x8 8x14 8x16 9x16 16 de 16 16 de 64 16 de 262144 16 de 262144 16 de 16 16 de 64 16 de 262144 16 de 262144

Direccin de inicio de la memoria de vdeo B800:0000H

Memoria requerida (bytes por pgina) 2000

# de pgi nas 8 8 8 8

02H y 03H

CGA EGA MCGA VGA

80x25

640x200 640x350 640x400 720x400

B800:0000H

4000

4 8 8 8

Tabla 5.3.- Invocacin de los modos de vdeo desde el BIOS.

Pgina 5 - 8

Captulo 5: Modos de Vdeo

Valor en AL Tipo de adap- Texto (carac- teres tador por rengln)


04H y 05H CGA EGA MCGA y VGA 06H CGA EGA MCGA y VGA 07H MDA y EGA VGA 0DH EGA VGA 0EH EGA VGA 0FH 10H EGA y VGA EGA VGA 11H 12H 13H MCGA y VGA VGA MCGA y VGA 80x25

Display (pixeles por lineas)

Matriz de un Nmero de colores Direccin de inicio de la memoria Memoria requerida # de caracter (ancho manejade video (bytes por pgina) pgi nas por alto) dos
4 de 16

320x200

4 de 64 4 de 262144 2 de 16

B800:0000H

16000

640x200

2 de 64 2 de 262144

B800:0000H

16000

720x350 720x400 320x200

9x14 9x16

monocro-mtico monocro-mtico 16 de 64 16 de 262144

B800:0000H

4000

1 8

A000:0000H

32000 32000

8 8 4 4 2 2 2

640x200

16 de 64 16 de 262144

A000:0000H

64000 64000

640x350 640x350

monocro-mtico 16 de 64 16 de 262144

A000:0000H A000:0000H

28000 112000

640x480 640x480 320x200

2 de 262144 16 de 262144 256 de 262144

A000:0000H A000:0000H A000:0000H

38400 153600 64000

1 1 1

Tabla 5.3.- Invocacin de los modos de vdeo desde el BIOS (continuacin).

Otro servicio disponible y que es de gran inters para nosotros es el referente al manejo del color, ya que el sistema requerir modificar los valores de las paletas para desplegar las imgenes en diferentes tonalidades de grises y pseudocolores. Para ello es necesario usar las llamadas disponibles en el BIOS, invocando nuevamente la INT! 0H, con los valores de AH=10H y AL, BH, y BL que se indican en la Tabla

Pgina 5 - 9

Captulo 5: Modos de Vdeo

5-4. De acuerdo a estos valores se obtendr un servicio en particular, como puede ser el cargar un nuevo valor en la paleta o en los registros de los DACs.

Servicio
Carga un registro de una paleta Lee un registro de una paleta Carga un registro de una paleta Lee un registro de una paleta Carga un registro de un DAC de vdeo Lee un registro de un DAC de vdeo Carga un registro de un DAC de vdeo Lee un registro de un DAC de vdeo Cambia una pgina de DACs de vdeo

Adaptador
EGA y VGA VGA

Valor de AL
00H

Valor de BH
Valor del nuevo descriptor

Valor de BL
Nmero del registro de la paleta

Comentarios

07H

El valor del descriptor de color se devuelve en BH Una tabla de 17 bytes es especificada en ES:DX, donde el byte 17 es el color de frontera

EGA y VGA VGA MCGA y VGA MCGA y VGA MCGA y VGA MCGA y VGA VGA

02H 09H 10H 15H 12H 17H 13H BX = nmero de registro BX = nmero de registro BX = Nmero del primer registro en el bloque CX = El nmero de registros 00H 01H Nmero de pgina 00H 01H 01H

Los datos son enviados o retornados en cantidades de 6 bits: DH=rojo, CH=verde y CL=azul

La direccin es:DX y pertenece a una tabla de valores de 3 bytes para los colores rojo, verde y azul

Utiliza pginas de 64 registros Utiliza pginas de 16 registros Selecciona el nmero de pgina

Tabla 5.4.- Manejo de los colores por medio de llamadas a rutinas del BIOS. Cada nueva versin del ROM BIOS tiene ms rutinas de servicio que la anterior. En la bibliografa consultada hacen referencia a 23 rutinas de servicio con 64 subrutinas, que, a su vez, cuentan con 10 subrutinas. Por ello, el querer describir (aunque sea superficialmente) las restantes rutinas de servicio es muy ambicioso y no es el propsito del reporte. Si se desea informacin mas detallada conocimiento de otras rutinas se recomienda consultar la bibliografa citada al final del reporte (The New Peter Norton Programmers... y Programmers Guide to PC ...).

Pgina 5 - 10

Captulo 6: Formatos Grficos

FORMATOS
GRFICOS

El propsito de digitalizar una imagen es poder almacenarla, transmitirla y recuperarla con gran fidelidad, as como someterla a una serie de manipulaciones que nos permitan extraer de ella la mayor cantidad de informacin posible. En muchas ocasiones, para facilitar la visualizacin y procesamiento de la imagen, es conveniente emplear programas (software) dedicados a ello; en otras, para reportar resultados de un evento o comparar diagnsticos es necesaria la transferencia de la imagen fuera de su "entorno" (sistema de adquisicin) para su posterior interpretacin en otra terminal. Por lo tanto, el almacenamiento de la imagen debe realizarse preferentemente en archivos que puedan ser interpretados no slo por el sistema que los gener, sino tambin por programas ajenos a ste; es decir, que el archivo que contenga a la imagen debe estar organizado bajo un formato que permita su interpretacin por parte de ambientes externos, y, de esta forma, buscar que sea universal. Esto ltimo considerando que en la actualidad existen muchos sistemas de computo que permanecen "grficamente aislados" debido a que sus tcnicas de almacenamiento y transferencia grfica no son aceptadas de manera uniforme. De esta forma, el presente captulo aborda de manera breve el origen y organizacin de algunos de los formatos grficos ms comunes, analizando de modo ms detallado el formato TIFF ("Tag Image File Format"), que fue el elegido por nosotros para ser empleado en el programa del sistema.

Pgina 6 - 1

Captulo 6: Formatos Grficos

LOS ANTECEDENTES La implantacin de un modo de transferencia uniforme ha sido un anhelo ampliamente perseguido y que hasta el momento no ha sido totalmente satisfecho, ya que aunque se reconoce la necesidad de un formato grfico universal (que permitira ahorro de tiempo y dinero) existen diversos puntos que impiden la posibilidad e implantacin del mismo. Muchos formatos comerciales surgieron con el gran nmero de programas de pintura y diseo, as como de computadoras en el mercado. Debido a que stos formatos son tpicos de una computadora especfica, utilizan los mecanismos de almacenamiento ms eficientes disponibles en sus terminales. Sin embargo, esto origina problemas cuando las imgenes deben ser transferidas hacia computadoras diferentes. Muchos programas "traductores" han aparecido en aos recientes, pero la introduccin de un paso adicional en el proceso de transferencia de imgenes no ha sido bien recibido. Para algunos programas de aplicacin, la alternativa a la "traduccin" es el reconocer los formatos "extraos" y realizar su propia traduccin. Sin embargo, el nmero de formatos grficos que ordinariamente necesitaran ser soportados hace a sta opcin prohibitiva. No obstante, todos los formatos grficos existentes tienen algunos elementos en comn, ya que el archivo de una imagen debe contener la informacin suficiente para que el programa que uno utilize para visualizarla pueda decodificar el archivo. En forma mnima, sta informacin consiste no slo de los datos que conforman en s a la imagen, sino tambin de la informacin sobre la forma en que los datos deben ser interpretados. Dicha informacin es frecuentemente almacenada en o como "cabeceras" (header) de archivo. Para muchos formatos especficos de cmputo, la cabecera contiene solamente el modo grfico y tamao de la imagen; mientras que en otros formatos, la cabecera puede tambin contener informacin sobre alguna paleta usada, relacin de aspecto, datos sobre la creacin de la imagen, interpretacin fotomtrica, si existe compresin o no, etc... La mayora de los formatos originados a partir de un "hardware" especfico hacen uso de una estructura "de posicin". En ste esquema, la ubicacin del dato en el archivo determina el significado del mismo. Por ejemplo, la "cabecera" para un archivo "PC Paint" consta de 17 bytes de longitud; comenzando con un "marcador" de 2 bytes, seguido del tamao del archivo y su offset, el nmero de bits por pixel, y as sucesivamente. Si uno desea conocer el modo de vdeo que debe ser empleado para desplegar la imagen, uno debe "mirar" en el byte 13 del archivo. Aunque sta estructura es muy eficiente, tambin es resistente al cambio; los cuales son inevitables en un programa "durable" o continuamente actualizado. Supongamos que deseamos agregar una nueva caracterstica de la imagen al archivo (un nuevo campo de datos). A menos que stos datos puedan ser colocados en donde no ocasionen disturbios a las anteriores versiones del programa, lo ms conveniente que podemos realizar es asignar un nuevo nmero de versin, prohibiendo de ese modo su lectura a las versiones anteriores del "software". Una aproximacin para solucionar este problema es el colocar una "etiqueta" (tag) al comienzo de cada "campo de datos". Esta etiqueta le indica al programa "lector" qu es el dato siguiente. De esta forma, fcilmente se pueden agregar nuevos campos as como eliminar algunos antiguos. Las versiones anteriores del programa pueden simplemente ignorar aquellos campos que no entiendan. Aunque sta aproximacin
Pgina 6 - 2

Captulo 6: Formatos Grficos

no elimina todos los problemas, auxilia considerablemente en la creacin de un formato flexible que pueda fcilmente ser expandido para incorporar nuevas caractersticas. Entre los formatos grficos comerciales ms comunes se encuentran: GIF, TIFF, PCX, JPEG, TGA; sobre los cuales se puede encontrar informacin completa en las fuentes citadas en la bibliografa (Bit-Mapped Graphics y Graphics Formats). A continuacin se explica un poco en detalle el formato TIFF; que es el que utiliza nuestro sistema, como una de sus opciones, para almacenar imgenes. EL FORMATO TIFF El formato TIFF (Tag Image File Format) fue desarrollado conjuntamente por Aldus y Microsoft Corporation como un formato comn entre los proveedores de "scanners" y los programas publicitarios. Desde su introduccin, TIFF ha sobrepasado las expectativas de crecimiento de sus diseadores. TIFF est basado totalmente en el concepto de implementar "campos etiquetas", por lo que su estructura organizacional es algo compleja (aunque su nivel de programacin no lo sea); aspecto que se ve compensado con la flexibilidad con que permite almacenar imgenes. Otros aspectos poderosos que caracterizan a este tipo de archivos son los siguientes: soportan imgenes de cualquier tamao, las imgenes pueden ser monocromticas o hasta de 16 millones de colores (24 bits de color), pueden "correr" fcilmente en diferentes arquitecturas de hardware (lo que significa que pueden ser transferidos sin perturbaciones, por ejemplo, de una IBM-PC a una Macintosh), cuentan con caractersticas para escalas de gris, soporta esquemas de compresin as como funciones especiales para el control de la imagen (relacin de aspecto, interpretacin fotomtrica,...), y, debido a que el formato no surgi como una "pieza" especfica de un programa, son manejados o interpretados por una amplia variedad de aplicaciones. La estructura del formato Una vez mencionadas algunas de las propiedades de los archivos guardados bajo este formato, procedamos a explicar brevemente como se encuentra conformado propiamente ste, es decir, la estructura del formato. Un archivo TIFF consiste de una cabecera ("header") seguida de cualquier nmero de "campos etiquetas" ("tagged fields"), los cuales pueden contener cualquier caracterstica de la imagen. La Figura 6-1 esquematiza la estructura que presenta un archivo TIFF. Estos archivos no tienen un orden en el cual los datos deben aparecer, mas que para los iniciales 8 bytes de la "cabecera".

Pgina 6 - 3

Captulo 6: Formatos Grficos

La estructura de la cabecera es extremadamente simple. En ella, los primeros dos bytes definen la estructura y forma de interpretacin para los datos restantes del archivo. De acuerdo a su contenido, que puede ser "II" o "MM" ( la "I" colocada por Intel y la "M" por Motorola), se especifica el orden en que deben ser ledos e interpretados las palabras o datos cuya longitud sea mayor a un byte; organizndolos, de acuerdo a su orden de aparicin, del menos al ms significativo (caso Intel), o bien, del mas al menos significativo (caso Motorola).

Pgina 6 - 4

Captulo 6: Formatos Grficos

Los siguientes dos bytes del archivo representan la versin TIFF estndar bajo la cual la imagen fue creada. Para el caso de la versin 4.0 (que es la que se emple en el sistema), ste valor corresponde a un "42" decimal; el cual es almacenado como una variable "entera". De acuerdo al orden en que los bytes deben ser interpretados (MM o II), el nmero de la versin se encontrar en el tercer o cuarto byte. Los cuatro ltimos bytes de la cabecera representan una variable entera larga ("long integer"), en la cual se especifica en que parte del archivo comienza el primer directorio de imagen del archivo "IFD" ("image file directory"); es decir, stos 4 bytes contienen el offset, respecto al origen del archivo, hacia el inicio del primer IFD (valor X en la Figura 6-1). Es frecuente que el valor del offset sea 8L, lo que significara que el primer IFD comenzara justo al terminar la cabecera del archivo. Un directorio de imagen del archivo o IFD es una lista de los campos etiquetas ("tags") que definen todos los parmetros de la imagen en el archivo. En teora, puede haber mas de un IFD dentro de un archivo, pero lo mas comn es emplear slo uno. Un IFD comienza con un valor entero (2 bytes) que especifca cuantos campos etiquetas estn en el directorio. Posterior a estos dos bytes, en el IFD se encuentran propiamente los campos etiqueta. Cada campo tiene una longitud fija de 12 bytes. El estndar TIFF acomoda los campos etiquetas en forma ascendente dentro del IFD, de acuerdo al valor de sus "numeros etiqueta". Los campos etiqueta ocupan un espacio de "Ax12" bytes, donde "A" es el nmero de campos. Al final de los campos, se encuentra el offset al siguiente IFD (en caso de que exista) o bien un valor nulo (0000H) que indique que es el nico IFD dentro del archivo. La estructura de un campo etiqueta es la siguiente. La primera palabra del campo es un entero (2 bytes) que es propiamente la etiqueta ("tag"), la cual nos dice el significado y forma de interpretar los datos del campo. La siguiente palabra, tambin entera, es el tipo de dato ("data type") y define la naturaleza de los datos en el resto del campo. Existen cinco tipos de dato que pueden ser transmitidos en un campo, cuya interpretacin esta de acuerdo al valor contenido en este elemento del campo. Si el valor de sta palabra es tres (03), las restantes dos palabras son consideradas como enteras (de 2 bytes) y no como enteras largas (de 4 bytes), que es su tamao real; por lo que son ignorados los dos bytes superiores en cada palabra siguiente del campo.

Pgina 6 - 5

Captulo 6: Formatos Grficos

Si el valor de la palabra es cuatro (04), las siguientes palabras se consideran enteras largas. En otro caso, si el valor de la palabra es cinco (05) el elemento offset apunta a un byte del archivo donde se almacena un nmero racional, conformado por dos enteros largos (8 bytes). Las siguientes dos palabras del campo son, como se dijo, enteras largas (de 4 bytes). La primera de ellas corresponde a la longitud del dato ("length of data") y define la longitud de los datos asociados con aquellos campos etiqueta donde sta informacin tiene significado. La otra palabra, comnmente denominada como "offset", se relaciona con el valor existente o portado en el campo etiquetado. La denominacin de ste elemento del campo como offset frecuentemente es un error, debido a que no siempre contiene una direccin del archivo, sino que en ocasiones contiene en s el valor del dato. Si la informacin de inters puede expresarse como un nmero de 32 bits (4 bytes), sta es almacenada o escrita directamente en el elemento del campo denominado offset; en caso contrario, ste nmero contiene el offset o numero de byte en el archivo donde est almacenada la informacin portada en el campo. Para el caso particular del campo denominado tipo de subarchivo (tag=255), que es el que indica la direccin en que inicia propiamente los datos de la imagen, el elemento offset contiene el valor de sta direccin (valor Z en la Figura 6-1). El contenido y significado de los elementos de un campo para cada una de las etiquetas manejadas en la versin 4.0 de TIFF se puede consultar en el apndice correspondiente al final de este reporte, o bien, en las fuentes citadas en la bibliografa.

Pgina 6 - 6

Captulo 7: El Procesamiento

7
EL PROCESAMIENTO

El procesamiento digital de imgenes es utilizado principalmente para dos diferentes propsitos:


a) Mejorar la apariencia visual de las imgenes para una inspeccin humana. b) Preparar las imgenes para la medicin de los rasgos y estructuras presentes en ellas. Las tcnicas que son apropiadas para cada una de estas tareas no siempre son las mismas, pero existen bastantes semejanzas entre algunas de ellas. La clase de operaciones para procesamiento de imgenes consideradas en ste captulo son aquellas aplicadas en la correccin de algunos defectos de las imgenes provenientes por la forma en que se adquirieron las mismas, como son la iluminacin y el ruido presente; as como la introduccin de pseudocolores modificacin de la escala de grises para facilitar la apreciacin de los detalles de la imagen o simplemente mejorar el aspecto de la misma.

Pgina 7 - 1

Captulo 7: El Procesamiento

En el caso de los defectos de imagen, stos pueden ser originados por detectores imperfectos, iluminacin inadecuada o no uniforme, o por una perspectiva no deseada; mientras que la introduccin de pseudocolores o nuevas escalas de grises es necesario para imgenes con un rango de brillo muy pequeo o cuyas estructuras presentes son muy similares y presentan contrastes semejantes. Debe enfatizarse que dichos procesos son aplicados despus de que la imagen ha sido digitalizada y almacenada, por lo que (en la mayora de los casos) es posible obtener resultados de calidad superior a los que pueden ser logrados por la optimizacin del proceso de adquisicin en una primera instancia. A continuacin se describen stas cuatro operaciones bsicas en el procesamiento de imgenes, mencionando las tcnicas mas comnmente empleadas en cada caso y, en ocasiones, ejemplificando con imgenes sometidas a stos procesos con la ayuda del paquete Photostyler 2.0 de Aldus. SUPRESIN DE RUIDO EN LAS IMGENES La fuente de ruido ms comn se halla en el conteo estadstico realizado en el detector de imagen, causado por las partculas incidentes (fotones, electrones, etc...) y que se hace presente como variaciones de intensidad aleatorias; mejor conocido como ruido "Gaussiano". El nombre se deriva del patrn que presenta su distribucin en el tiempo. Por otro lado, tambin pueden originarse imgenes ruidosas por la inestabilidad de la fuente de luz o del detector durante el tiempo requerido para rastrear o digitalizar una imagen. El modelo o patrn presentado por ste ruido puede ser del todo distinto al del ruido Gaussiano, y se presenta como variaciones en la brillantez en una regin uniforme de la escena. Cuando el ruido presenta caractersticas que no son aleatorias en el tiempo y que no exhiben un comportamiento estadstico normal, es ms difcil colocar descriptores numricos de la cantidad de ruido. Sin embargo, muchas de las mismas tcnicas de reduccin pueden ser empleadas, aunque generalmente con menor eficiencia.

La consideracin principal en todos los mtodos de supresin de ruido es que los pixeles en una imagen son mucho ms pequeos que cualquiera de los detalles importantes, y que la mayora de los pixeles cercanos entre s representan en conjunto a la misma estructura. Esto permite la aplicacin de diversos mtodos de promediacin y comparacin. Asumiendo que la lectura de un pixel en diferentes tiempos representa la misma estructura en la escena observada, se justifica la promediacin o integracin de las lecturas de pixeles sobre un lapso de tiempo para reducir el ruido aleatorio o Gaussiano. Cuando la seal vara en alguna de las otras formas anteriormente mencionadas, otros mtodos, como el de filtrado medio ("median filtering"), pueden ser empleados en forma anloga a los mtodos de comparacin espacial; excepto en el hecho de que se utiliza el tiempo en la secuencia de mediciones en cada sitio. 1) Promediacin del entorno (Neighborhood Averaging) La forma ms sencilla de promediacin espacial consiste simplemente en sumar los valores de brillantez de los pixeles de cada regin pequea de la imagen, y dividirlos entre el nmero de pixeles en la regin o vecindad; utilizando el valor resultante para construir una nueva imagen. ste mtodo esencialmente produce una imagen con un menor nmero de pixeles; donde la calidad de la imagen (o, mejor dicho, la relacin seal-ruido) se ve incrementada en un factor que es igual a la raz cuadrada del nmero de pixeles en la vecindad. Sin embargo, la resolucin lateral de la imagen es gravemente alterada, resultando en que las pequeas estructuras de la imagen no puedan ser fcilmente identificadas en forma individual.
Pgina 7 - 2

Captulo 7: El Procesamiento

Una forma ms comn (y ms eficiente) para efectuar una promediacin del entorno consiste en reemplazar cada pixel con el valor promedio de s mismo y de su entorno. Esto es frecuentemente descrito como una operacin "Kernel", puesto que su implementacin puede ser generalizada como la suma de los valores de los pixeles en la regin multiplicados por un conjunto de coeficientes ("weights") enteros, es decir: +m

Si,j= -m ( Wi,j * Px+i,y+j )


P*x,y = ----------+m------------------------

Si,j= -m Wi,j

Pgina 7 - 3

Captulo 7: El Procesamiento

La ecuacin anterior muestra el clculo desarrollado sobre una regin cuadrada, de dimensiones "2m+1", la cual es impar. Entonces, el tamao de la vecindad abarca rangos de 3x3, 5x5, 7x7, etc. Tambin es posible, aunque no comn, emplear regiones que no sean cuadradas. Para una promediacin simple de una vecindad, el arreglo de coeficientes W contiene nicamente 1s, y, para una regin de 3x3 elementos, debe ser escrita como: 1 1 1 1 1 1 1 1 1

La convencin indica que stos coeficientes se multiplican por los pixeles que rodean al pixel central, y la suma normalizada se divide entre la suma de los coeficientes; entonces, el valor resultante se escribe en la localidad correspondiente al pixel central para formar una nueva imagen. Operaciones en una vecindad que emplean multiplicacin Kernel son usualmente aplicados simtricamente alrededor de cada pixel. Esto origina un problema para pixeles ms cercanos a los bordes de la imagen que a la mitad de la vecindad. Varias aproximaciones son empleadas para tratar con esto, incluyendo diseo de Kernels asimtricos o implementacin de "reglas" a lo largo de los bordes o en las esquinas. La reduccin de ruido es mucho mayor cuando se emplean regiones grandes, pero a cambio se obtiene un "empaamiento" o desvanecimiento ("blurring") de los bordes o rasgos sobresalientes (detalles de imagen). Utilizando coeficientes cuyos valores sean diferentes de uno, la cantidad de "nubosidades" o empaamiento puede ser reducida, y se puede ejercer mas control sobre el procedimiento de promediacin del entorno. Por ejemplo, los valores:

1 2 1

2 4 2

1 2 1

tienen algunas caractersticas atractivas. Primero, el coeficiente central "4", que multiplica el contenido del pixel original, es el factor ms grande; lo que ocasiona que el pixel central domine en el promedio y de esta forma se reduzca el empaamiento. Segundo, los valores de 2 para los vecinos ortogonales y de 1 para los vecinos diagonales reconoce el hecho de que los pixeles vecinos diagonales en realidad estn mas lejos del centro de la vecindad que los ortogonales; exactamente por un factor de raz cuadrada de dos (1.4142). Tercero, la suma de los pesos da un valor de 16, el cual es una potencia de dos y consecuentemente hace muy fcil y rpida la divisin del procedimiento de promediacin en una implemetacin computarizada. Conjuntos de arreglos similares (respecto a las caractersticas de los valores de los coeficientes) pueden ser ideados en diversos tamaos. La razn de utilizar valores enteros para los coeficientes es la de acelerar su implementacin, adems de que con ello los

Pgina 7 - 4

Captulo 7: El Procesamiento

requerimientos para su almacenamiento son modestos. En el contexto del procesamiento de imgenes en el espacio en frecuencia, stos Kernels pueden ser analizados muy eficientemente en ese dominio para entender sus propiedades de alisamiento (smoothing). De este anlisis resulta que una de las curvas o formas mas empleadas para Kernels con coeficientes es la de una Gaussiana. Dicho arreglo es un conjunto de enteros que aproximan el perfil de una funcin Gaussiana a lo largo de cualquier rengln, columna o diagonal a travs del centro del Kernel. El arreglo es caracterizado por su desviacin estndar, expresada en trminos de dimensiones de pixel. El tamao de ste Kernel tiende a ser lo suficientemente grande tal que el adicionar un nuevo rengln de trminos introduzca nmeros muy pequeos despreciables al arreglo (ceros en el caso ideal). De esta forma, algunos valores de cero (o los valores ms pequeos) se hacen presentes en las esquinas del arreglo, debido a que stos elementos son los ms alejados del pixel central.

La eleccin de los coeficientes enteros reales requiere algo de destreza, al menos para Kernels grandes. El objetivo es aproximar la curva analtica de alisamiento (smooth analytical curve) a una Gaussiana, manteniendo el total de los coeficientes o pesos por debajo de los limites prcticos para facilitar la aritmtica en el computo. A continuacin se muestran algunos Kernels Gaussianos con diferentes desviaciones estndar. El valor de estas desviaciones se expresa en proporciones geomtricas, que van desde fracciones de pixel hasta varios pixeles.

Pgina 7 - 5

Captulo 7: El Procesamiento

= 0.391 pixels
1 4 1 4 12 4 1 4 1 1 2 3 2 1 2 7 11 7 2

= 0.625 pixels
3 11 17 11 3 2 7 11 7 2 1 2 3 2 1

a) Kernel de 3x3 elementos

b) Kernel de 5x5 elementos

= 1.0 pixels
0 0 1 1 1 1 1 0 0 0 1 2 3 3 3 2 1 0 1 2 3 6 7 6 3 2 1 1 3 6 9 11 9 6 3 1 1 3 7 11 12 11 7 3 1 1 3 6 9 11 9 6 3 1 1 2 3 6 7 6 3 2 1 0 1 2 3 3 3 2 1 0 0 0 1 1 1 1 1 0 0

c) Kernel de 9x9 elementos

La desviacin estndar para estos Kernels es el radio (en pixeles) que contiene el 68% de la magnitud integrada de los coeficientes, o el volumen bajo la superficie si el Kernel es dibujado como un trazo tridimensional de los valores enteros. Este valor es una generalizacin de la definicin usual de desviacin estndar; ya que para una distribucin Gaussiana unidimensional el 68% del rea bajo la curva yace o se encuentra dentro de un rango de +/- una desviacin estndar. Como se aprecia en los anteriores Kernels, el tamao de ste se incrementa conforme aumenta el de la desviacin estndar. Sin embargo, la aplicacin repetida de un pequeo Kernel o la aplicacin secuencial de dos o ms Kernels es equivalente a la aplicacin simple de un Kernel de dimensiones mayores; el cual se construye como la convolucin de los dos Kernels pequeos (aplicando los coeficientes de un arreglo en el otro, como si se tratara de valores de pixels, para entonces sumarlos para generar un nuevo y ms grande arreglo). Para finalizar, la Figura 7-1 mostrada a continuacin permite observar los resultados obtenidos por la aplicacin de este mtodo de promediacin a una imagen adicionada con ruido (el cual tiene distribucin normal y varianza = 350), empleando Kernels de 3x3 y 5x5 elementos.

Pgina 7 - 6

Captulo 7: El Procesamiento

a) Imagen Original (sin ruido).

b) Imagen 7-1a adicionada de ruido con distribucin normal y varianza=350.

c) Aplicacin del mtodo de promediacin a la imagen 7-1b usando un Kernel de 3x3.

d) Aplicacin del mtodo de promediacin a la imagen 7-1b usando un Kernel de 5x5 .

Figura 7-1.- Aplicacin del mtodo de promediacin

2) Jerarquizacin del entorno (Neighborhood Ranking) o Median Filter Como ya se mencion, el uso de Kernels para promediar los pixeles cercanos en una vecindad es una operacin de convolucin, la cual tiene una contraparte directa en el procesamiento de imgenes en el dominio de la frecuencia, adems de que es un procedimiento lineal en el cual no hay prdida de informacin de la imagen original; lo cual hace a este mtodo uno de los ms eficientes y comnmente empleado. No obstante, existen otros mtodos de procesamiento que pueden ser realizados en el dominio espacial para eliminar o disminuir el ruido. Sin embargo stos no son lineales y no utilizan o preservan todos los datos originales. El ms usado de stos mtodos adicionales se basa en la jerarquizacin de los pixeles en una vecindad de acuerdo con su nivel de brillantez. Entonces, por ejemplo, el valor medio en la lista ordenada puede ser usado como el valor de brillantez para el pixel central. Como en el caso de las operaciones con Kernels, ste valor es usado para producir una nueva imagen. Unicamente los valores de los pixeles originales son utilizados en la jerarquizacin del entorno de cada pixel.

Pgina 7 - 7

Captulo 7: El Procesamiento

Este mtodo, tambin llamado Filtro Medio (Median Filter), es un excelente supresor de ciertos tipos de ruido, como es el caso del Ruido de Disparo ("Shot" Noise), en el cual algunos pixeles individuales de la imagen son modificados o extraviados. Si el valor de un pixel accidentalmente cambia a un valor extremo, entonces ser eliminado de la imagen y reemplazado por un valor razonable (el valor medio de la vecindad). El Filtro Medio tiene la habilidad de remover el ruido y reemplazar los pixeles malos con valores razonables causando degradaciones o distorsiones mnimas a la imagen. A diferencia del mtodo de promediacin, el filtrado medio no solo emplea arreglos o vecindades cuadradas, sino que introduce patrones de regiones octagonales a partir de los cuales se obtiene el nuevo valor del pixel (ver Figura 7-2). Por supuesto, la complejidad en el computo se ve ampliamente incrementada con el nmero de valores a clasificar y ordenar. El Filtro Medio tambin puede ser utilizado para reducir el tipo de ruido aleatorio mencionado anteriormente en el contexto del mtodo de promediacin, presentando incluso dos ventajas principales el filtrado medio comparado con el de multiplicacin por coeficientes. La primera de ellas es que el filtrado medio no reduce la diferencia de brillo o contraste, debido a que el nuevo valor saldr nicamente de los valores disponibles o presentes en la regin vecina y no de un promedio de estos.

La segunda ventaja consiste en que a diferencia de la promediacin, el Filtro Medio no crea una dependencia en las fronteras de la magnitud relativa de los valores presentes en la vecindad; por lo que no existe casi degradacin en los bordes o rasgos de la imagen. La habilidad para sobrellevar stos problemas hace que ste mtodo sea preferible tanto para examinacin visual como para mediciones en las imgenes. Para apreciar el efecto o resultados obtenidos por la aplicacin de este mtodo, la Figura 7-3 muestra la misma imagen original de la Figura 7-1 pero con la aplicacin del filtrado medio en regiones cuadradas de 3x3 y 5x5 elementos. La degradacin mnima que se produce en los bordes mediante el filtrado medio permite al mtodo ser aplicado repetidamente, ya que aunque los detalles finos son borrados durante este proceso as como las regiones grandes toman valores iguales de brillo, los bordes o perfiles permanecen en su lugar y muy bien definidos. Este tipo de nivelacin o igualacin de brillo en la imagen (originado por la aplicacin repetida del filtrado medio) es en ocasiones descrito como resalte del contorno o Posterizacin de la imagen, y se traduce en una reduccin del nmero de niveles de gris en la imagen. La Figura 7-4 ilustra este efecto. Otro efecto relacionado o derivado del filtrado medio es el
Pgina 7 - 8

Captulo 7: El Procesamiento

Filtro Extremo (extremum filter), el cual sustituye el valor del pixel con el valor mnimo o mximo de la regin, dependiendo de cual sea ms cercano al valor medio. Por ltimo, hay que sealar que partir de los dos mtodos anteriores han surgido una gran variedad de otros mtodos de reduccin de ruido (como el filtro "Olmpico"), con combinaciones de operaciones ms complicadas y que son empleados en imgenes con un tipo de ruido muy especfico; pero que en esencia son modificaciones de los ya mencionados o derivados de los conceptos manejados en ellos.

Pgina 7 - 9

Captulo 7: El Procesamiento

a) Imagen Original (sin ruido).

b) Imagen 7-3a adicionada de ruido con distribucin normal y varianza=350.

c) Aplicacin del mtodo de jerarquizacin a la imagen 7-3b empleando una regin cuadrada de 3x3 elementos.

d) Aplicacin del mtodo de jerarquizacin a la imagen 7-3b empleando una regin cuadrada de 5x5 elementos.

Figura 7-3.- Aplicacin del mtodo de jerarquizacin o Filtro Medio

a) Imagen original.

b) Aplicacin del efecto de Posterizacin a la imagen 7-4a, reduciendola a 4 niveles de gris.

Figura 7-4.- Aplicacin del efecto de Posterizacin a una imagen

Pgina 7 - 10

Captulo 7: El Procesamiento

ILUMINACIN NO UNIFORME La estrategia ms directa para el anlisis de imgenes utiliza el brillo que presentan determinadas regiones en la imagen como un medio de identificacin, asumiendo que un mismo tipo de caracterstica debe tener el mismo brillo (o color, en una imagen a color) en cualquier parte del campo observado donde aparezca. Si el brillo es diferente del de otras facciones, entonces ste puede utilizado para discriminar la caracterstica para su conteo, medicin, etc. En el caso de que existan otros tipos de objetos que no pueden ser distinguidos slo en la base del brillo o color, mediciones subsecuentes pueden bastar para seleccionar aquellos que son de inters. Puesto que la separacin del brillo en umbrales ("brightness thresholding") es por mucho el mtodo ms simple y rpido para aislar detalles o facciones en una imagen (cuando ste puede ser empleado), es importante considerar los problemas de sombras en la imagen. Cuando se analizan superficies irregulares, la cantidad de luz dispersndose de cada regin hacia el observador o cmara, es una funcin de la orientacin de la superficie con respecto a la fuente de luz y al observador; aun si la superficie del material y su textura son uniformes. En efecto, ste principio puede ser utilizado para estimar la orientacin de la superficie, usando una tcnica conocida como "forma de la sombra" ("shape-of-shading"). La mayora de las imgenes que normalmente se desean procesar son esencialmente bidimensionales. En el caso de imgenes provenientes de satlites y microscopios de luz o electrnicos, existe una variacin en la elevacin de la superficie. Dicha elevacin generalmente es pequea comparada con las dimensiones laterales de la imagen, originando que frecuentemente se mencionen como imgenes en "dos y media" dimensiones. Tales problemas se tratan como excepciones a la regla general, requiriendo un procesamiento mas elaborado del necesario. La mayora de stos defectos pueden ser minimizados estableciendo cuidadosamente las condiciones en el momento de adquirir la imagen. An si los defectos no pueden ser eliminados totalmente, se puede asumir que son constantes en un periodo de tiempo. Esto permite la correccin por medio del procesamiento de la imagen. La mayora de las ocasiones, es posible obtener una imagen de fondo; en la cual una superficie o especimen de referencia uniforme se coloca en lugar de la muestra real observada, y la intensidad de la luz se registra. Entonces, esta imagen puede ser empleada para nivelar las imgenes subsecuentes. Este proceso se conoce como substraccin del fondo, pero en muchos casos ste nombre no es el mas adecuado. Si el dispositivo de adquisicin es logartmico con un valor de gama de 1.0, entonces el fondo de la imagen se sustrae punto por punto de la imagen adquirida. Si la cmara o sensor es lineal, entonces el proceso de correccin es dividir la imagen adquirida entre el fondo. Para las funciones de respuesta de otros sensores, no hay un mtodo aritmtico simple y correcto; por lo que debe determinarse primero la respuesta calibrada y aplicarla para convertir la seal medida a un espacio lineal. Ntese que en el proceso de substraccin (o divisin) de una imagen por otra, algo del rango dinmico de los datos originales se perder. Entre ms grande sea la variacin en el brillo del fondo, disminuye el nmero de variaciones que pueden ser grabadas en la imagen a ese nivel y que permanecern despus del proceso de igualacin. Estos factores, junto con el inevitable incremento del ruido esttico que resulta de sustraer una seal de otra, sugieren que todas las medidas posibles deben ser tomadas para obtener una iluminacin uniforme durante el proceso de adquisicin de imgenes, antes de recurrir a mtodos de procesamiento.

Pgina 7 - 11

Captulo 7: El Procesamiento

El proceso de igualacin en el cual la funcin de iluminacin puede ser adquirida separadamente, es comnmente realizada retirando el especimen de la ruta de luz y almacenando esta imagen, que representa la variacin. sta imagen entonces puede ser usada para el proceso de igualacin. Sin embargo, en muchos casos no es posible retirar el especimen, o su presencia contribuye a las variaciones de brillo. Esto incluye situaciones en las cuales el espesor o grosor del especimen vara, afectando la absorcin de luz total. Otro caso es cuando la superficie que esta siendo analizada no es perfectamente plana, causando imgenes que muestren variaciones en el fondo. Afortunadamente, en muchos de los casos las variaciones del brillo de fondo son funciones de la localidad, sencillas y bien definidas tal que pueden ser aproximadas por funciones simples como son algunos polinomios. De acuerdo a esto, tenemos que existen dos formas generales de procesar imgenes con iluminacin no uniforme y que brevemente mencionaremos. La primera de ellas se conoce como Construccin de una funcin de fondo, donde a partir de seleccionar un nmero de puntos en la imagen una lista de valores de brillo puede ser adquirida. Esta lista es empleada para obtener, mediante mnimos cuadrados, una funcin B(x,y) que aproxime al fondo y pueda ser sustrado (o dividido) como si se tratase de una imagen de fondo fsicamente adquirida. En ste mtodo es muy importante seleccionar localidades o regiones donde todas tengan el mismo brillo y que estn bien distribuidas a travs de la imagen. Si se seleccionan muchos puntos en una regin pequea y pocos o ninguno en otras partes de la imagen se requiere realizar una extrapolacin polinomial y esto puede introducir errores muy significantes. La otra aproximacin o mtodo comnmente empleado para este tipo de imgenes es el denominado Nivelacin de Rangos (Rank leveling), el cual se usa cuando la variacin del fondo es tan irregular que no pueda ser representada como una simple funcin, como es el caso que se presenta cuando las superficies son irregulares. Este mtodo supone que las caractersticas y rasgos de inters estn limitados en tamao y son ms pequeas que la escala de variaciones del fondo, as como que el fondo es en todas partes ms oscuro o ms brillante que dichas caractersticas; dando la casualidad de que ambos requerimientos son frecuentemente encontrados en situaciones prcticas. La idea bsica es comparar cada pixel con su alrededor o combinar los valores del pixel en alguna regin pequea (8 pixeles mnimo). La comparacin de la vecindad se realiza de la siguiente forma: se examinan los pixeles de una regin pequea (3x3 por ejemplo) y, en el caso de que el fondo sea ms oscuro que las estructuras de la imagen, se encuentra el pixel ms oscuro en cada vecindad y se sustituye el valor del pixel original con el del ms oscuro valor de brillo. Para el caso de un fondo mas claro que las estructuras de la imagen, el pixel ms brillante en la vecindad, es el que se emplea. El resultado de aplicar esta operacin a la imagen entera es que las estructuras u objetos presentes se encogen y el valor local del fondo se extiende hacia el rea previamente cubierta por las estructuras. La aplicacin repetida de esta operacin hace que finalmente obtengamos nicamente el fondo de la imagen. De esta forma, ya sea por uno u otro mtodo, es posible obtener una imagen de fondo; la cual, al ser sustrada de la imagen original, soluciona el defecto de una iluminacin no uniforme y deja a la imagen lista para ser sometida a otro tipo de operaciones.

Pgina 7 - 12

Captulo 7: El Procesamiento

EXPANSIN DEL CONTRASTE La adquisicin de una imagen libre de ruido y sin defectos de iluminacin, o el procesamiento de una para suprimir stos inconvenientes, no asegura que la imagen resultante pueda ser observada o interpretada adecuadamente por un observador o por un programa. Si el rango de brillo dentro de la imagen es muy pequeo, no existe el suficiente contraste como para asegurar la visibilidad. Digitalizadores tpicos convierten el rango de voltaje analgico de la cmara u otro sensor a nmeros del 0 al 255 (para un convertidor de 8 bits). Para una videocamara ordinaria, esto corresponde a un rango de voltaje de 0.7 volts y a una variacin en el nivel de brillo que cubre algunos ordenes de magnitud en el nmero de fotones incidentes. Si el rango de variacin del brillo inherente en la imagen es mucho ms pequeo que el rango dinmico de la imagen, de la electrnica subsecuente, y del digitalizador; entonces, el rango real de los nmeros resultantes de la conversin debe ser mucho menor que el rango completo (de 0 hasta 255). Esto se traduce en que, si se realiza un histograma que indique el nmero de pixeles en cada uno de los 256 posibles niveles de brillo, existir una regin estrecha ( un pico) que contendr la mayora de los pixeles; indicando que nicamente unos pocos de los niveles son representados. El resultado es una imagen con un contraste total muy pequeo. La Figura 7-5a es un claro ejemplo de esto, concentrando la mayor parte de los valores de los pixeles en la zona oscura del rango de brillo; lo que en un histograma se observara como un pico estrecho cercano al valor negro extremo (valores inferiores de brillo). La visibilidad de las estructuras presentes puede ser incrementada ampliando el contraste, tal que los valores de los pixeles son reasignados para cubrir enteramente el rango disponible. El mapeo es lineal y uno-a-uno. Esto significa que los pixeles ms oscuros en la imagen original son asignados al negro, los ms claros de la imagen se asignan al blanco, y los valores grises intermedios en la imagen original dan nuevos valores, los cuales son linealmente interpolados entre el blanco y el negro. Todos los pixeles de la imagen original que tenan un valor particular de gris, deben conservar el mismo matiz gris relativo en la imagen resultante, pero con un valor diferente. La aplicacin de la expansin de contraste a la Figura 7-5a se aprecia en la Figura 7-5b.

a) Imagen con un bajo contraste inicial.

b) Imagen resultante por la expansin lineal del rango de brillo.

Figura 7-5.- Ejemplificacin de la expansin de contraste

Pgina 7 - 13

Captulo 7: El Procesamiento

Este proceso de reasignacin lineal en ocasiones tambin se refiere como Equalizacin de la imagen. Si se dibujara un nuevo histograma para la Figura 7-5b, en ste se apreciara que los valores de gris que antes quedaban fuera de o que no correspondan a la antigua escala de brillo ahora son resignados a los pixeles de tal forma que se cubre el rango completo. Sin embargo, hasta este punto an es posible que la mayora de los valores de gris no correspondan con pixeles; es decir, que no sean utilizados en la imagen. La reasignacin de los valores de gris incrementa el contraste visual para los pixeles presentes, pero no incrementa la habilidad de discriminar variaciones sutiles en la escala de gris que no fueron grabadas en la imagen original. El reasignamiento tambin magnifica la diferencia de brillo asociado con ruido en la imagen original. Para solucionar este inconveniente, lo que se hace es promediar el mismo cuadro o imagen muchas veces (es decir, sumar la imagen a s misma en repetidas ocasiones). La imagen resultante ser muy similar a la obtenida despus de la expansin lineal del rango de contraste, slo que en sta se podrn distinguir y medir pequeas variaciones en la densidad del especimen u objeto que contenga la imagen. Sin embargo, incrementar demasiado el rango de brillo puede originar que pixeles cuyos valores estn en los lmites del rango puedan exceder la capacidad de digitalizacin y almacenamiento, y sean recortados al valor lmite; lo que puede ocasionar prdida de informacin. Consecuentemente, es comn adquirir imgenes que no cubran completamente el rango de brillo disponible. Por lo tanto, si las imgenes cuentan con niveles de gris lo suficientemente diferentes para revelar los rasgos o detalles ms importantes del especimen, entonces la expansin lineal del contraste se convierte en un mtodo muy til, suficiente y aceptable para incrementar la discriminacin visual del examinador. An ms importante, ste puede hacer posible una comparacin ms directa de las imgenes adquiridas con rangos de brillo ligeramente diferentes, ajustando todas ellas a la misma escala de contraste expandida. Por supuesto, esto es factible nicamente si los tipos de caractersticas ms brillantes as como las ms oscuras estn presentes en todos las imgenes y campos bajo anlisis. Se pueden realizar otras manipulaciones sobre los valores de brillantez de los pixeles. Operaciones que son "uno a uno" no tienen que ser lineales (todos los pixeles que tenan un valor en la escala de grises se les asigna un nuevo valor). Un ejemplo sera convertir la brillantez a densidad, lo cual implica una relacin logartmica. Para imgenes en color, puede usarse una funcin de transferencia para corregir las distorsiones de color causadas por fuentes de luz, dispersin atmosfrica, absorcin, etc. Estas funciones pueden ser implementadas usando funciones matemticas o una tabla de conversin (LUT). Para las imgenes de color es ms fcil la implementacin de la funcin cuando la imagen es representada como valores de tinte (hue), saturacin (saturation), e intensidad (intensity) para cada pixel, en lugar de su representacin RGB. IMPLEMENTACIN DE PSEUDOCOLORES Debido a que la mayora de las imgenes en el mundo real obviamente no son monocromticas sino a color, muchas tcnicas hacen uso del color para la identificacin de estructuras o localizacin de cierta actividad en las imgenes observadas. Por supuesto, el uso del color hace posible una codificacin rica en informacin multidimensional del objeto analizado; adems de que hacen a la imagen ms fcil de analizar por el ojo humano, debido a la capacidad de ste de poder discriminar cientos de diferentes colores. Sin embargo, como se
Pgina 7 - 14

Captulo 7: El Procesamiento

mencion con anterioridad, la adquisicin de imgenes a color verdadero es mucho ms complicada que la de imgenes monocromticas, respecto al hardware y calibracin necesarias en el sistema de adquisicin y digitalizacin. Incluso, el uso del color no garantiza que los colores obtenidos de la imagen sean fotomtricamente exactos o iguales a los de la escena u objeto original, ya que estos pueden verse afectados por las caractersticas del sensor y condiciones presentes en el momento de su adquisicin (iluminacin, perspectiva, etc..). Es por esto que, el adicionar colores falsos a una imagen monocromtica se convierte en una herramienta til y comnmente usada, puesto que nos permite rescatar algunas de las ventajas del color pero empleando un sistema de adquisicin de imgenes simple. Este proceso de implementar Pseudocolores consiste en asignar una tripleta de valores rojo, verde y azul a cada uno de los valores anteriormente representados en escala de grises. Dicho de otra forma, el pseudocolor sustituye el valor de brillo almacenado para un pixel por uno nuevo, originado o extrado de una tabla precalculada que contiene valores para cada uno de los componentes bsicos del color: rojo, verde y azul. Por ello, el pseudocolor disminuye las limitantes en nuestra habilidad visual para distinguir diferencias sutiles de brillo; ya que aunque somos capaces de distinguir algunas decenas de niveles de gris en una imagen, tenemos la habilidad de distinguir cientos de diferentes colores. Adems, es ms fcil identificar y describir una estructura de inters en particular como una azul oscuro que como una medianamente gris. El uso de escalas de color como un sustituto de valores de brillo nos permite mostrar y ver pequeos cambios locales e identificar globalmente el mismo valor de brillo en una imagen; lo que es de gran ayuda ya que ste es uno de los objetivos primordiales del procesamiento de imgenes. El peligro con el uso de pseudocolores es que stos pueden ocultar u obscurecer el contenido verdadero de una imagen; ya que los colores nos obligan a concentrarnos en los detalles de la imagen olvidando un poco el contenido o informacin global de la misma. La mayora de los sistemas de imgenes fcilmente realizan la sustitucin en LUTs de color de los valores de brillo de la imagen almacenada, seleccionando valores particulares de brillo o intensidad para cada uno de los componentes rojo, verde y azul; los cuales se traducen en valores de voltaje enviados al TRC o medio de despliegue empleado, conformando as la imagen a color falso. De acuerdo al valor seleccionado para cada componente RGB (Red-Green-Blue o Rojo-Verde-Azul) el color desplegado ser el resultante de la suma de stos. La Figura 7-6 muestra el espacio definido por las seales RGB, el cual es un cubo debido a que las seales del rojo, verde y azul son independientes y pueden ser adicionadas para producir cualquier color dentro del cubo (siguiendo los principios de adicin del color).

Pgina 7 - 15

Captulo 7: El Procesamiento

Como se observa en la figura, combinando nicamente rojo y verde obtenemos amarillo, as como verde ms azul produce cyan y azul ms rojo resulta en magenta. La escala de grises yace a lo largo de la diagonal del cubo (iguales valores para el rojo, verde y azul) e ilustra claramente la progresin aditiva del negro al blanco; aunque es una de muchas formas de llegar a ambos valores extremos (el negro se obtiene de la adicin de los valores mnimos de intensidad de los tres colores fundamentales, mientras que el blanco se deriva de la adicin de los valores de intensidad mximos). De esta forma, para el caso de un sistema que representaba una imagen con 28 o 256 niveles de gris, ahora, considerando el mismo nmero de tonalidades para cada componente RGB, tenemos que se pueden reproducir o emplear un total de 2(8x3) = 224 o 16 millones de diferentes colores, suficientes para poder extraer todo el contenido o informacin de la imagen. Entonces, con la implementacin de pseudocolores, la representacin de la imagen queda limitada nicamente por el medio y modo de despliegue (si es capaz o no de reproducir toda la gama de color). Entre las escalas de pseudocolor ms comnmente empleadas se encuentran: el espectro completo o arcoiris (referido a veces simplemente como pseudocolor), en el cual se realiza una exploracin a travs de las aristas del cubo hasta cubrirlo completamente (ver Figura 7-7b); la escala de calor, en la cual se hace una progresin caf-rojo-amarillo-blanco-azul; y la denominada luz y fuego (Firelight), que recorre el camino negro-rojo-amarillo (ver Figura 7-7c). Sin embargo, queda claro que una gran variedad de paletas pueden ser implementadas siguiendo las reglas de adicin de colores representadas por el cubo de color RGB de la Figura 7-6 y considerando el tipo de despliegue a utilizar.

Pgina 7 - 16

Captulo 7: El Procesamiento

a) Imagen original en escala de grises.

b) Imagen 7-7a en escala Arcoiris.

c) Imagen 7-7a en escala Firelight.

Figura 7-7.- Aplicacin de pseudocolores a una imagen monocromtica

Para terminar ste captulo, nuevamente recordamos que las herramientas de procesamiento brevemente desarrolladas lneas arriba son las ms bsicas de una gama inmensa de operaciones en espacio y frecuencia para imgenes en dos y tres dimensiones y que comnmente se encuentran en programas y software especializados o creados para ste uso (como son Photoshop, Illustrator, PageMaker, Photostyler, etc...). Describir aplicaciones y procesos ms elaborados y complejos (como segmantacin, reconstruccin, esqueletonizacin, y algunos tipos de mediciones) es algo que sobrepasa las expectativas de este reporte y para lo cual slo se citan las fuentes de consulta en la bibliografa.

Pgina 7 - 17

Captulo 8: El programa

8
EL
PROGRAMA

En este captulo se describir el programa o software desarrollado para operar nuestro pequeo sistema prototipo, y que se ejecuta en la PC donde se instala la tarjeta digitalizadora. Entre otras cosas, el programa est diseado para correr en cualquier tipo de PC compatible con el estndar IBM (como ya se ha mencionado) y requiere que dicha PC cuente con una tarjeta de vdeo VGA (para poder soportar los dos modos de despliegue disponibles). El programa se hizo en lenguaje C++ bajo el paradigma de la programacin orientada a objetos (POO), utilizando el compilador Borland C++ 3.1. En un principio, tambin se emplearon rutinas en lenguaje ensamblador, con el fin de ganar velocidad en la adquisicin y despliegue de datos; utilizando para ste caso el compilador TASM. Sin embargo, al realizar una evaluacin sobre el desempeo y resultados obtenidos con dichas rutinas y comparndolos con los alcanzados por medio de la implementacin con funciones grficas de C++ y llamadas al BIOS, observamos que no exista gran diferencia en la velocidad de despliegue entre ambos casos (ligeramente superior con rutinas en ensamblador); por lo que se decidi realizar todo el programa en C++, evitando tambin as el manejar diferentes mdulos y realizar llamadas externas dentro del programa.

Con respecto a la parte de procesamiento de las imgenes, una vez conocidas algunas de las herramientas comunes y necesarias (as como sus bases tericas), se decidi recurrir a un software dedicado o especializado en ello: Photostyler 2.0 de Aldus, el cual permite realizar todas las operaciones mencionadas en el captulo anterior (y muchas otras ms), requiriendo nicamente que la imagen este almacenada bajo un formato comercial reconocido por l. Por ello, el programa permite almacenar las imgenes en formato TIFF (ya sea en escala de grises o en pseudocolores) adems del formato binario, que es el formato por omisin. Con ello, el programa se simplifica al no elaborar las operaciones para procesamiento ya comentadas y se limita nicamente a exportar las imgenes. De esta forma, el software que utiliza actualmente el prototipo contiene o permite efectuar solamente tres tareas bsicas: Pgina 8 - 1

Captulo 8: El programa a) Digitalizacin de una imagen as como el almacenamiento de la misma. b) Recuperacin de imgenes previamente almacenadas en un formato binario. c) Transformacin de un archivo de imagen en formato binario a uno en formato TIFF. Para realizar la primer tarea, de manera general se realiza lo siguiente: de inicio se detecta la presencia de la tarjeta y su correcta operacin, as como se inicializa el ambiente grfico de trabajo o modo de vdeo; para posteriormente digitalizar y desplegar continuamente cuadros de 256x256 pixeles, a una velocidad que depender del modo de vdeo elegido para el despliegue, permitiendo en un momento dado congelar un cuadro para su observacin. Una vez congelada la imagen, sta puede ser almacenada en disco (ya sea en formato TIFF o binario), o se puede reanudar el despliegue continuo de los cuadros. Para el caso de la recuperacin de una imagen almacenada, el primer proceso consiste en verificar la existencia del archivo, para despus proceder a preparar el modo de vdeo con las caractersticas seleccionadas, y finalmente realizar la transferencia de los datos para desplegarlos en el monitor. En la tercera tarea, para realizar la conversin de formato es necesario crear un nuevo archivo el cual contendr las cabeceras necesarias para su interpretacin como archivo TIFF, los datos que conforman la imagen, y, en su caso, alguna paleta de color en particular. En todos los casos, mediante una interfaz de mens de opciones agradable y fcil de usar, el programa cuestiona al usuario sobre las opciones con que es posible operar el sistema (el modo de vdeo, alguna de las 4 paletas, tipo y datos del archivo, etc.). Por la tanto, los procedimientos implementados en el programa para poder realizar dichas tareas son: 1)Verificacin de la tarjeta, 2)Inicializacin del modo de vdeo (MCGA o VGA), 3)Digitalizacin de un cuadro, 4)Transferencia de datos y despliegue de la imagen, 5)Almacenamiento de la imagen (en formato binario o TIFF), 6)Lectura y despliegue de una imagen previamente almacenada en disco, y 7)Conversin de una imagen de formato binario a formato TIFF. De stos, los procesos 1-5 pertenecen o son empleados en la tarea de digitalizar una imagen, operando directamente sobre la tarjeta; mientras que los procesos 2 y 6 son utilizados para la segunda tarea: la recuperacin de una imagen; as como los procesos 5 y 7 son propios de la conversin de formato. A continuacin slo se describen de forma muy general dichos procedimientos, ya que su implementacin se puede encontrar en los listados del programa contenidos en el Apndice 3; aunque se sugiere hacer referencia a stos conforme se desarrolla la descripcin. Se recomienda adems, para el caso de los procesos 1, 3, 4 y 5 el haber comprendido cabalmente el circuito y operacin de la tarjeta descritos en el Captulo 4 o tener ste a la mano junto con el diagrama del mismo para un mejor entendimiento de los prrafos siguientes. 1) Verificacin de la tarjeta. La primera tarea que hay que realizar, antes de digitalizar un cuadro, es verificar que la tarjeta est instalada en la PC y que funciona adecuadamente; tambin hay que verificar la presencia de la seal de vdeo y que la misma no sobrepase el nivel permitido por el convertidor. Lo anterior se logra mediante la lectura del byte de estado de la tarjeta disponible en el Puerto de Salida o Estado (denominado PTO_OUT en el programa); esto, con el fin de verificar que estn presentes las seales Odd/Even (D2) y Burst (D3), y que la seal de Over_Range (D1) no este activada. Si la seales no estn presentes o si la seal de sobre rango est activada, el programa no proseguir y mandar un mensaje de error al usuario.

Pgina 8 - 2

Captulo 8: El programa 2) Inicializacin del modo de vdeo (MCGA o VGA) Antes de empezar a digitalizar y transferir los datos de una imagen (provenientes ya sea de la tarjeta o de un archivo almacenado), hay que preparar el modo de vdeo en el cual se van a desplegar los cuadros en el monitor de la PC. Esto implica lo siguiente: 1) inicializar el modo grfico adecuado, por medio de las rutinas del BIOS, y 2) generar la paleta de tonos de gris (o, si se desea, de pseudocolores) mediante el acceso a los registros del DAC de la tarjeta de vdeo Los modos de vdeo utilizados en programa son dos, los cuales son invocados por medio de la interrupcin 10H del BIOS, especificando en el registro AL el nmero del modo deseado: 12H para VGA con 640x480 pixeles (denominado como modo 2 en el men del programa) y 13H para MCGA con 320x200 pixeles (denominado como modo 1 en el men del programa). El programa le permite al usuario escoger entre un despliegue de la imagen en tonos de gris o en pseudocolor. Esto se logra modificando el valor de los registros asociados al DAC de la tarjeta. El valor que se guarda en estos registros, como se explico en el captulo 5, son los atributos que modulan la intensidad de los caones de color correspondiente (RGB). Como la longitud de cada atributo es de 6 bits su valor puede ir desde 0 (para una intensidad nula) hasta 63 (que equivale a la intensidad mxima). En el caso de elegir la opcin de tonos de gris, la paleta se elabora haciendo que los tres caones tengan la misma intensidad (de otra forma obtendramos algn color), por lo tanto hay que cargar los tres atributos (R.G.B) con el mismos valor. Como los atributos tienen 64 posibles niveles de intensidad podemos obtener como mximo 64 tonos de gris. En el modo 1 (modo MCGA) tenemos acceso a los 256 registros y por lo tanto a 256 colores; adems los datos provenientes de la tarjeta son de 8 bits, es decir, pueden tomar 256 valores posibles. Pero como mencionamos anteriormente solo es posible obtener un mximo de 64 tonos de gris, por lo tanto hay que remapear los datos. Una forma de hacer esto es dividir los datos por cuatro, para as obtener nicamente valores entre 0 y 64, pero esto hara ms lento el proceso de transferencia y despliegue. Una mejor solucin es agrupar los registros en grupos de cuatro, y a estos cuatro registros programarlos con los mismos valores par los atributos de color, es decir, el mismo tono de gris. Entonces los primeros grupo de cuatro registros contendrn el primer nivel de gris; el segundo grupo de cuatro, el segundo tono de gris; el tercer grupo de cuatro, el tercer tono de gris, y as sucesivamente hasta completar los 256 registros. De esta forma los datos no tienen que ser divididos por cuatro. En el modo 2 (modo VGA) solo se tiene acceso a 16 de los 256 registros del DAC, atraves de la paleta de colores (ver capitulo 5). Por lo tanto ahora el lmite en el nmero de colores o tonos de gris es de 16, entonces, nuevamente hay que remapear los datos. En sta ocasin, la nica solucin posible es dividir a los datos por 8, para obtener valores entre 0 y 16. 3) Digitalizacin de un cuadro. El proceso de digitalizacin consiste de los siguientes pasos: inicializar la tarjeta, arrancar propiamente la digitalizacin del cuadro, detectar el fin de la digitalizacin del cuadro (para entonces detener al sistema), y esperar la lectura de las memorias. Pgina 8 - 2

Captulo 8: El programa

Para inicializar la tarjeta y arrancar la digitalizacin, escribimos, una secuencia de palabras binarias al puerto de control de la tarjeta (denominado como PTO_OUT en el programa), las palabras son: 01H, 0FH y 07H. La primera palabra pone al bit D0 (Reset) igual a uno, lo cual limpia a los contadores, es decir, los ponen en su cuenta inicial (0000H); la segunda palabra pone igual a uno a los dems bits del puerto de control (Clock/Stop, Enable, Clock_Enable), habilitando as al reloj y a la tarjeta misma, pero an no permite que los contadores corran. Finalmente, esperamos el principio de un campo impar, para as asegurar que el flip-flop de fin de digitalizacin (FF EOD) ya haya transferido su valor de entrada (Enable) a su salida; una vez sucedido esto, mandamos la ltima palabra, la cual libera a los contadores, inicindose as la digitalizacin. Ahora, hay que esperar el fin de digitalizacin, es decir, tenemos que monitorear el bit D0 o seal EOD del puerto de estado de la tarjeta; cuando D0 pase al valor cero (EOD es baja activa), se habr terminado de digitalizar un cuadro. Entonces, mandamos la palabra 01H, para limpiar a los contadores y deshabilitar el reloj y la tarjeta; esperando ahora el proceso de lectura de las memorias.

4) Transferencia de datos y despliegue de la imagen. Una vez que se ha detectado la seal de fin de digitalizacin y que se ha preparado la tarjeta para la lectura de las memorias (se han limpiado los contadores y detenido el sistema), se procede a realizar el ciclo de lectura y despliegue, el cual consiste de la repeticin de tres tareas: 1) mandar un pulso de lectura al puerto de control (PTO_OUT), 2) leer el valor del dato que aparece en el puerto de datos (PTO_DAT) y 3) escribir el valor a la memoria de vdeo de la PC, lo cual equivale a desplegar la imagen en monitor de la PC. El pulso de lectura se logra mandando 04H y 00H sucesivamente al puerto PTO_OUT, lo cual equivale a mandar los nmeros 1 y 0 al bit DX (seal de Clock/Stop); esto, como vimos en el capitulo x, nos permite direccionar las memorias. Despus de direccionar una localidad de memoria la tarjeta pone su contenido en el puerto de datos (PTO_DAT) y la lecturua solo consiste en leer ese puerto desde la PC. El proceso de escribir a la memoria de vdeo de la PC depende del modo en el cual se est trabajando. En el modo 1 (MCGA), puesto que la memoria esta organizada como un arreglo lineal que principia en la direccin A000:0000 (ver capitulo 5), hay que usar un puntero que inicialmente apunte a sta direccin. Para direccionar la memoria solo hay que incremtar el puntero y entonces escribir el dato a la direccin que apunta dicho puntero. En cambio en el modo 2 (VGA) el proceso es ms complejo, y por lo tanto ms lento; ya que, como vimos en el Captulo 5, en este modo de vdeo la memoria est organizada en paginas traslapadas (memoria traslapada); entonces, para escribir a la memoria de vdeo nos auxiliamos de las rutinas en lenguaje ensamblador que encontramos en los artculos citados en dicho captulo (ver pgina 50). 5) Almacenamiento de la imagen. En el momento que el usuario considere pertinente interrumpir el proceso de adquisicin-despliegue de imgenes, el usuario tendr la opcin de guardar la imagen desplegada en el monitor. La imagen puede ser guardada como un archivo binario o bajo el formato TIF. El proceso de almacenamiento depender de la eleccin del usuario. En el caso de guardar la imagen como un archivo binario, el proceso es muy similar al de lectura y despliegue, descrito arriba. La diferencia es que ahora en lugar de escribir los datos a la memoria de vdeo, los escribiremos en un flujo dirigido hacia una unidad de Pgina 8 - 1

Captulo 8: El programa disco. Cundo, la imagen se guarda como archivo TIF, el programa, antes de vaciar los datos, construye las cabeceras necesarias para conformar el archivo TIF, ver captulo 6. 6) Lectura de una imagen proveniente de disco. En ocasiones, es necesario 7) Conversin de formato binario a TIFF. En ste ltimo

Pgina 8 - 2

Conclusiones

CONCLUSIONES

Realizando una evaluacin del prototipo de sistema digitalizador expuesto en este reporte, encontramos que el desempeo del mismo
fue aceptable en trminos generales; puesto que aunque podemos considerarlo lento por su razn de despliegue menor a un cuadro por segundo en modo A y hasta cuatro en modo B, la resolucin obtenida en las imgenes fue bastante buena, especialmente en el modo B. Abundando sobre esto ltimo, encontramos que, como se discuti en el Capitulo 5, existe un compromiso entre la resolucin (nmero de pixeles) y rango dinmico (niveles de brillo) de la imagen, debido a la forma en que operan los modos grficos de la PC. Es por esto que, aunque en el modo B es posible desplegar 64 tonos de gris (o 256 pseudocolores), solamente podemos visualizar una fraccin de la imagen (200 lneas de 256 disponibles); mientras que en el modo A es posible desplegar la imagen completa, pero con la desventaja de disponer nicamente de 16 tonos de gris o pseudocolor, con lo que algunos detalles finos de la imagen se pierden o no es posible distinguirlos. En relacin al software que utiliza actualmente el prototipo, este se limita a tres tareas bsicas: control de la operacin de la tarjeta, almacenamiento y recuperacin de imgenes, y transformacin de un archivo binario a uno TIFF; las cuales trabajan en forma ptima y si bien no se efectan operaciones de procesamiento sobre la imagen, es posible agregarlas en un futuro o, como en nuestro caso, seguir exportando las imgenes hacia software externo especializado en el tema. Un aspecto aun ms atractivo que los anteriores es el hecho de que el costo total de la terjeta es muy bajo ($100.00 USD) comparado con el manejado para otras tarjetas similares que se encuentran actualmente en el mercado($000.00). Sin embargo, an existen algunos aspectos sobre los cuales se pueden realizar modificaciones para incrementar el desempeo del sistema y que mencionamos a continuacin. Con el fin de incrementar la tasa de adquisicin y despliegue de imgenes para aproximarse al tiempo real (16 - 30 cuadros por segundo), es necesario modificar la forma de transferencia de datos entre la tarjeta y la memoria de vdeo de la PC (va DMA por ejemplo). Respecto a obtener imgenes en color, la manera de realizar la digitalizacin de la seal de vdeo sera mediante el empleo de
Pgina C - 1

Conclusiones

un circuito separador de las seales de crominancia para as obtener las componentes RGB de la seal, las cuales deben ser digitalizadas de forma independiente. Por ende, esto implica el diseo de un nuevo circuito de digitalizacin, que involucre, entre otras cosas, la decisin entre el empleo de un ADC ms veloz y multiplicarlo, bien usar un ADC para cada atributo de crominancia y emplearlos de manera semejante que en nuestro circuito prototipo. Adems, algunas adaptaciones deben efectuarse en el software, para actualizarlo y de sta forma poder controlar la nueva tarjeta.

Pgina C - 2

Bibliografa

BIBLIOGRAFA

RT-4000 Operator Manual. General Electric. USA, 1992. RT-3600S/4000 Service Manual. General Electric. USA, 1992. Medical Instrumentation. Application and Design. J.G. Webster. Houghton Mifflin. USA, 1979. Scientific Basis of Medical Imaging. P.N.T. Wells. Churchill Livingstone. USA, 1982.

Pgina B - 1

Bibliografa

Success with C++ Kris Jamsa, Ph.D. Jamsa Press USA 1994 The Image Processing Handbook John C. Russ CRC Press USA 1992 Turbo C/C++ Manual de Referencia Herbert Shildt Mc.Graw-Hill Mxico 1992 Interfacing to the IBM Personal Computer Lewis C. Eggebrecht SAMS USA 1990 Linear Databook National Semiconductor USA 1985 Linear Devices, Vol I y II Motorola USA 1992

Pgina B - 2

#include<graphics.h> #include<stdlib.h> #include<stdio.h> #include<conio.h> #include<ctype.h> #include<dos.h> #include<bios.h> #include<string.h> #include"ventanas.h" #include"menuslib.h" //*********************************************************** * //Clase "Ambientes". //*********************************************************** * class Ambientes{ protected: FILE* pArchPaleta; char modoDespliegue; void preparaModoVideo(); void pintaPaleta(); void pintaMarco(int izquierda,int arriba,int derecha,int abajo); public: Ambientes(); void instalate(FILE* pArchPaleta,char modoDespliegue); }; //----------------------------------------------------------Ambientes::Ambientes() { pArchPaleta = NULL; } //----------------------------------------------------------void Ambientes::preparaModoVideo() { int i=0,j=0,k=0; int rojo=0,verde=0,azul=0; char tag[6]; if(modoDespliegue == '1'){ static union REGS In_Regs; static union REGS Out_Regs; In_Regs.h.ah=0; In_Regs.h.al=0x13; int86(0x10,&In_Regs,&Out_Regs); for(i=0;i<256;i++){

} else{ do{ for(j=0;j<8;j++){ fgets(tag,5,pArchPaleta); rojo=(atoi(tag))/4; fgets(tag,5,pArchPaleta); verde=(atoi(tag))/4; fgets(tag,5,pArchPaleta); azul=(atoi(tag))/4; for(k=0;k<45;k++){ fgets(tag,5,pArchPaleta); } outportb(0x03c8,i); outportb(0x03c9,rojo); outportb(0x03c9,verde); outportb(0x03c9,azul); if(i==6){ outportb(0x03c8,20); outportb(0x03c9,rojo); outportb(0x03c9,verde); outportb(0x03c9,azul); } i++; } i+=48; }while(i<63); fclose(pArchPaleta); }

} fclose(pArchPaleta);

fgets(tag,5,pArchPaleta); rojo=(atoi(tag))/4; fgets(tag,5,pArchPaleta); verde=(atoi(tag))/4; fgets(tag,5,pArchPaleta); azul=(atoi(tag))/4; outportb(0x03c8,i); outportb(0x03c9,rojo); outportb(0x03c9,verde); outportb(0x03c9,azul);

//----------------------------------------------------------void Ambientes::pintaPaleta() { static union REGS In_Regs; static union REGS Out_Regs; int x,y,j,i; if(modoDespliegue == '1'){ y = 12; j = i = x = 0;

pintaMarco(0,0,257,199); pintaMarco(272,0,293,150); do{ do{ for(x=273;x<293;x++){ In_Regs.h.ah = 0x0c; In_Regs.h.al = i; In_Regs.x.dx = y; In_Regs.x.cx = x; int86(0x10,&In_Regs,&Out_Regs) ; } j++; y++; }while(j<1); j=0; i+=2; }while(i<256); for(y=140;y<150;y++){ for(x=273;x<293;x++){ In_Regs.h.ah = 0x0c; In_Regs.h.al = 255; In_Regs.x.dx = y; In_Regs.x.cx = x; int86(0x10,&In_Regs,&Out_Regs); } }

else{ i = 0; y = 1; j = 0; cleardevice(); setviewport(0,0,getmaxx(),getmaxy(),0) ; setcolor(WHITE); rectangle(469,0,510,400); do{ do{ for(x = 470;x<510;x++) putpixel(x,y,i); j++; y++; }while(j<25); i++; j = 0; }while(i<16); rectangle(0,0,257,240); setviewport(0,0,257,240,0); }

//-----------------------------------------------------------void Ambientes::pintaMarco(int izquierda,int arriba,int derecha,int abajo) { static union REGS In_Regs; static union REGS Out_Regs; int x,y,j; y = arriba; j = 0; do{ for(x = izquierda;x<(derecha+1);x++){ In_Regs.h.ah= 0x0c; In_Regs.h.al= 255; In_Regs.x.dx= y; In_Regs.x.cx= x; int86(0x10,&In_Regs,&Out_Regs); } j++; y = abajo; }while(j<2); j = 0; x = izquierda; do{ for(y=arriba;y<(abajo+1);y++){ In_Regs.h.ah = 0x0c; In_Regs.h.al = 255; In_Regs.x.dx = y; In_Regs.x.cx = x; int86(0x10,&In_Regs,&Out_Regs); } j++; x=derecha; }while(j<2); } //-----------------------------------------------------------void Ambientes::instalate(FILE* pArchPaleta,char modoDespliegue) { Ambientes::modoDespliegue = modoDespliegue; Ambientes::pArchPaleta = pArchPaleta; cleardevice(); preparaModoVideo(); pintaPaleta(); } //************************************************************ //Clase "SoloAbreArchivos". //************************************************************ class SoloAbreArchivos{ protected: FILE *pArchAbierto; public:

virtual int trabaja(char* nomArch,char* modo,int x,int y); FILE* p_ArchAbierto() {return pArchAbierto;}; }; //-----------------------------------------------------------int SoloAbreArchivos::trabaja(char* nomArch,char* modo,int x,int y) { linea mensaje_error[] = {{"- ERROR !",WHITE,CENTER_TEXT}, {"NO SE ENCONTRO ARCHIVO :",WHITE,}, {strupr(nomArch),YELLOW,CENTER_TEXT}, {"PULSE CUALQUIER TECLA",WHITE,}}; ValidaFlujos f; ventanasMensajeError vE(TRIPLEX_FONT,mensaje_error,4,15,1); if(f.trabaja(nomArch,modo,vE,x,y)){ pArchAbierto = f.p_Flujo(); return 1; } else return 0;

//************************************************************ //Clase "AbreArchivos". //************************************************************ class AbreArchivos{ protected: FILE *pArchAbierto; char* nomArchAbierto; public: AbreArchivos(); virtual int pideNomArch(AbreFlujos &f,int x,int y); FILE* p_ArchAbierto(); char* nom_ArchAbierto() {return nomArchAbierto;}; }; //-----------------------------------------------------------AbreArchivos::AbreArchivos() { } //-----------------------------------------------------------int AbreArchivos::pideNomArch(AbreFlujos &f,int x,int y) { int resultado; int b_archivoAbierto; f.despliegate(x,y); resultado = f.captura_dato(); if(resultado == 0){ pArchAbierto = f.p_Archivo(); nomArchAbierto = f.CadenaDato(); b_archivoAbierto = 1;

} else b_archivoAbierto = 0; f.borrate(); return b_archivoAbierto;

//----------------------------------------------------------FILE* AbreArchivos::p_ArchAbierto() { return pArchAbierto; } /* //*********************************************************** * //Clase "GuardaImagenes". //*********************************************************** * class GuardaImagenes:public AbreArchivos{ protected: void ponMensajeExito(); public: void guardaImagen(); }; //----------------------------------------------------------void GuardaImagenes::guardaImagen() { } */ //*********************************************************** * //Clase "MenuPostDigi". //*********************************************************** * class MenuPostDigi:public MenusRepitenDespliegue{ protected: FILE *pArchDAT; char* nomArchDAT; void realiza_tareas(ventanasTexto &v); int obtenArchDAT(int x,int y); void guardaCuadro(); void ponMensajeExito(); public: MenuPostDigi(char* teclas_opcion); FILE* p_ArchDAT() {return pArchDAT;}; char* nom_ArchDAT() {return nomArchDAT;}; }; //-----------------------------------------------------------MenuPostDigi::MenuPostDigi(char* teclas_opcion) :MenusRepitenDespliegue(teclas_opcion) { }

//-----------------------------------------------------------void MenuPostDigi::guardaCuadro() { const PTO_IN=0x332; //puerto de lectura de seales de control. const PTO_DATA=0x334; //puerto de datos. linea texto_espera[] = {{"-ESPERE UN MOMENTO!",WHITE,CENTER_TEXT}, {" ",WHITE}, {"LA IMAGEN SE ESTA GUARDANDO",WHITE}, {" ",WHITE}}; ventanasTexto mensajeEspera(LIGHTBLUE,INTERLEAVE_FILL,TRIPLEX_FONT, texto_espera,4,15,1); mensajeEspera.despliegate(10,250); outport(PTO_IN,0x1); for(int k=0;k<4352;k++){ outport(PTO_IN,0x4); outport(PTO_IN,0x0); } unsigned int numDatos=0; do{ outport(PTO_IN,0x4); outport(PTO_IN,0x0); putc(inport(PTO_DATA),pArchDAT); numDatos++; }while(numDatos<61184); mensajeEspera.borrate(); ponMensajeExito(); fclose(pArchDAT); } //-----------------------------------------------------------void MenuPostDigi::ponMensajeExito() { linea texto_exito[] = {{"-PROCESO DE GUARDADO EXITOSO!",YELLOW,CENTER_TEXT}, {" ",WHITE}, {"EL ARCHIVO : ",WHITE}, {strupr(nomArchDAT),YELLOW,CENTER_TEXT}, {"HA SIDO CREADO.",WHITE}, {"PULSE CUALQUIER TECLA ",WHITE}, {" ",WHITE}}; ventanasMensaje mensajeExito(LIGHTBLUE,HATCH_FILL,TRIPLEX_FONT, texto_exito,7,15,1); mensajeExito.despliegate(10,230); } //-----------------------------------------------------------int MenuPostDigi::obtenArchDAT(int x,int y) { linea mensaje3[] =

{{"INTRODUCE EL NOMBRE DEL ARCHIVO QUE",YELLOW}, {"GUARDARA LA IMAGEN *.DAT (nombre.TIF).",YELLOW}, {" ",}, {" ",}, {" ",}}; AbreFlujos f(LIGHTGRAY,HATCH_FILL,TRIPLEX_FONT, mensaje3,5,15,1,"wb"); AbreArchivos archivero2; if(archivero2.pideNomArch(f,x,y) == 1){ pArchDAT = archivero2.p_ArchAbierto(); nomArchDAT = archivero2.nom_ArchAbierto(); return 1; } else{ return 0; }

//----------------------------------------------------------void MenuPostDigi::realiza_tareas(ventanasTexto &v) { switch(toupper(respuesta)){ case 27: v.borrate(); bandera_salir = 1; b_repiteDespliegue = 0; resultado = 0; break; case 'T': v.borrate(); bandera_salir = 1; b_repiteDespliegue = 0; resultado = 1; break; case 'S': v.borrate(); if(obtenArchDAT(5,200) == 1){ guardaCuadro(); resultado = 1; } else resultado = 0; b_repiteDespliegue = 1; bandera_salir = 1; break; } } //*********************************************************** * //Clase "ControlTarjeta".

//*********************************************************** * class ControlTarjeta{ protected: char* paletaEscogida; unsigned char far* memoriaVideo; unsigned int PTO_IN ; unsigned int PTO_OUT; unsigned int PTO_DAT; void digiContinuamente(char modoDespliegue); void saltatePixeles(int numPixeles); void digitalizaUnCuadro(); void despliegaUnCuadro(char modoDespliegue); int ponMenuPostDigiM1(); int ponMenuPostDigiM2(); void reInicializaGraficos(); public: ControlTarjeta(); virtual int trabaja(char modoDespliegue,char* paletaEscogida); int verificate(); }; //-----------------------------------------------------------ControlTarjeta::ControlTarjeta() { paletaEscogida = NULL; PTO_IN = 0x332; PTO_OUT= 0x332; PTO_DAT= 0x334; }

//-----------------------------------------------------------void ControlTarjeta::saltatePixeles(int numPixeles) { for(int k=0;k<numPixeles;k++){ outport(PTO_IN,0x4); //pulsos de lectura para las memorias. outport(PTO_IN,0x0); } } //-----------------------------------------------------------void ControlTarjeta::digitalizaUnCuadro() { outport(PTO_IN,0x1); //Reset=1. outport(PTO_IN,0xF); //Reset=0 y los demas bits iguales a 1. while (((inport(PTO_IN)&8) == 0)); outport(PTO_IN,0xE); //Reset=1. while(((inport(PTO_IN)&0 == 1)); //espera el fin de la digitalizacion, outportb(PTO_IN,0x1); } //-----------------------------------------------------------void ControlTarjeta::despliegaUnCuadro(char modoDespliegue) { char colorPixel;

digitalizaUnCuadro(); saltatePixeles(4352); if(modoDespliegue == '1'){ int register indiceVideo = 321; memoriaVideo = (unsigned char far *)0xa0000000L; for(int register renglon=0;renglon < 198;renglon++){ for(int register columna=0;columna < 256;columna++){ outport(PTO_IN,0x4); outport(PTO_IN,0x0); colorPixel = (inport(PTO_DAT)); memoriaVideo[indiceVideo++] = colorPixel; } indiceVideo += 64; } } else{ setviewport(0,0,getmaxx(),getmaxy(),0); for(int register renglon=1;renglon < 240;renglon++){ for(int register columna=1;columna < 257;columna++){ outport(PTO_IN,0x4); outport(PTO_IN,0x0); colorPixel = (int)((inport(PTO_DAT))/16)-1; putpixel(columna,renglon,colorPixel); } } }

//-----------------------------------------------------------void ControlTarjeta::digiContinuamente(char modoDespliegue) { do{ despliegaUnCuadro(modoDespliegue); }while(!bioskey(1)); } //-----------------------------------------------------------int ControlTarjeta::ponMenuPostDigiM1() { Ambientes ambienteDespliegue; reInicializaGraficos(); ambienteDespliegue.instalate(fopen(paletaEscogida,"r"),'2'); despliegaUnCuadro('2'); setviewport(0,0,257,240,0); if(ponMenuPostDigiM2() == 0){ ambienteDespliegue.instalate(fopen(paletaEscogida,"r"),'1'); despliegaUnCuadro('1'); return 0; }

else{ clearviewport(); return 1; }

//-----------------------------------------------------------int ControlTarjeta::ponMenuPostDigiM2() { linea mensaje[]={{"SELECCIONE UNA OPCION:",WHITE}, {"(ESC) CONTINUAR. ",YELLOW}, {"(S) SALVAR IMAGEN.",YELLOW}, {"(T) TERMINAR DIGITALIZACION.",YELLOW}, {" ",WHITE}}; char op[]={"sStT"}; ventanasTexto vMPD(LIGHTBLUE,INTERLEAVE_FILL,TRIPLEX_FONT, mensaje,5,15,1); MenuPostDigi menuPostDigi(op); return menuPostDigi.trabaja(vMPD,10,200); } //-----------------------------------------------------------void ControlTarjeta::reInicializaGraficos() { int controlador,modo; controlador=DETECT; modo=DETECT; initgraph(&controlador,&modo,""); } //-----------------------------------------------------------int ControlTarjeta::trabaja(char modoDespliegue,char* paletaEscogida) { linea mensaje[]={{"PULSE CUALQUIER TECLA PARA",YELLOW}, {"CONGELAR LA IMAGEN.",YELLOW}, {" ",WHITE}}; ventanasTexto vCongelar(LIGHTBLUE,INTERLEAVE_FILL,TRIPLEX_FONT, mensaje,3,15,1); ControlTarjeta::paletaEscogida = paletaEscogida; if(modoDespliegue == '1'){ do{ digiContinuamente(modoDespliegue); }while(ponMenuPostDigiM1() == 0); } else{ do{ vCongelar.despliegate(5,270); digiContinuamente(modoDespliegue); vCongelar.borrate();

}while(ponMenuPostDigiM2() == 0);

//-----------------------------------------------------------int ControlTarjeta::verificate() { unsigned char dato,aux; int i; const PTO_IN=0x332; //puerto de lectura de seales de control. for(i=0;i<5;i++){ int cont=0; dato=inportb(PTO_IN)&0x4; while(1){ aux=inportb(PTO_IN)&0x4; if (aux!=dato) break; cont++; if(cont>5000) return(-1); //error tarjeta no inicializada } //o video no listo. } for(i=0;i<5;i++){ int cont=0; dato=inportb(PTO_IN)&0x8; while(1){ aux=inportb(PTO_IN)&0x8; if(aux!=dato) break; cont++; if(cont>12000) return(-2); pausa. } } for(i=0;i<5;i++){ int j=1; int cont=0; dato=inportb(PTO_IN)&0x2; while(1){ aux=inportb(PTO_IN)&0x2; if(aux!=dato){ j = -1; break; } cont++; if(cont>5000){ j = 1; break; }

//error video en

} }

} if(i>=4&&j==-1)return(-3); //error sobrecarga de seal. return(0); //todo esta correcto.

//************************************************************ //Clase "MenusPaletas", derivada de Menus. //************************************************************ class MenusPaletas : public Menus{ protected: FILE* pArchPaleta; char* nomArchPaleta; int bandera_archAbierto; void abreArchPaleta(char* nombreArch,ventanasTexto &v,int x,int y); void realiza_tareas(ventanasTexto &v); public: MenusPaletas(char* teclas_opcion); FILE* pAP(); char* nom_ArchPaleta() {return nomArchPaleta;}; }; //-----------------------------------------------------------MenusPaletas::MenusPaletas(char* teclas_opcion): Menus(teclas_opcion) { } //-----------------------------------------------------------void MenusPaletas::abreArchPaleta(char* nombreArchPal,ventanasTexto &v, int x,int y ) { FILE* pPal; linea mensaje_error[] = {{"- ERROR !",WHITE,CENTER_TEXT}, {"NO SE ENCONTRO ARCHIVO :",WHITE,}, {strupr(nombreArchPal),YELLOW,CENTER_TEXT}, {"PULSE CUALQUIER TECLA",WHITE,}}; ventanasMensajeError vE(TRIPLEX_FONT,mensaje_error,4,15,1); pPal = fopen(nombreArchPal,"r"); if(pPal != NULL){ pArchPaleta = pPal; resultado = 1; bandera_salir = 1; v.borrate(); } else{ vE.despliegate(x,y); resultado = 0; bandera_salir = 0; }

} //----------------------------------------------------------void MenusPaletas::realiza_tareas(ventanasTexto &v) { switch(respuesta){ case 27: v.borrate(); resultado = 0; bandera_salir = 1; break; case '1': strcpy(nomArchPaleta,"graypal.dac"); abreArchPaleta(nomArchPaleta,v,-270,30); break; case '2': strcpy(nomArchPaleta,"arcopal.dac"); abreArchPaleta(nomArchPaleta,v,-270,30); break; case '3': strcpy(nomArchPaleta,"firepal.dac"); abreArchPaleta(nomArchPaleta,v,-270,30); break; case '4': strcpy(nomArchPaleta,"bospal.dac"); abreArchPaleta(nomArchPaleta,v,-270,30); break; } } //----------------------------------------------------------FILE* MenusPaletas::pAP() { return pArchPaleta; } //*********************************************************** * //Clase "MenusModos". //*********************************************************** * class MenusModos : public MenusAuto{ protected: FILE* pArchPaleta; char* nomArchPaleta; void realiza_tareas(ventanasTexto &v); public: MenusModos(char* op); char* nom_ArchPaleta() {return nomArchPaleta;}; }; //----------------------------------------------------------MenusModos::MenusModos(char* op) :MenusAuto(op)

{ // }

MenusModos::respuestaMenuPrin = respuestaMenuPrin;

//----------------------------------------------------------void MenusModos::realiza_tareas(ventanasTexto &v) { switch(respuesta){ case 27: v.borrate(); bandera_salir = 1; bandera_auto = 0; resultado = 0; break; default: ultima_respuesta = respuesta; linea textoMenuPaletas[]= {{"MENU DE PALETAS",WHITE,CENTER_TEXT}, {" ",}, {"(1) PALETA EN TONOS DE GRIS",LIGHTGREEN}, {"(2) PALETA ARCOIRIS",LIGHTGREEN}, {"(3) PALETA FIRELIGHT",LIGHTGREEN}, {"(4) PALETA BOSCOSA ",LIGHTGREEN}, {" ",}}; char op[] = {"1234"}; ventanasTexto

ventMenuPal(MAGENTA,INTERLEAVE_FILL, TRIPLEX_FONT, textoMenuPaletas,7,15,1); MenusPaletas menuPaletas(op); if(menuPaletas.trabaja(ventMenuPal,150,120) == 1){ v.borrate(); pArchPaleta = menuPaletas.pAP(); nomArchPaleta = menuPaletas.nom_ArchPaleta(); Ambientes ambienteDespliegue; ambienteDespliegue.instalate(pArchPaleta,respuesta) ; resultado = 1; bandera_salir = 1; bandera_auto = 1; } else{ bandera_auto = 0; bandera_salir = 0; }

//********************************************************** * //Clase "ProcesoUno".

//********************************************************** * class ProcesoUno{ protected: int bandera_auto; char* paletaEscogida; char modoDespliegue; void aviso_error(char *elError,int x,int y); int ponMenuModos(); public: ProcesoUno(int bandera_auto,char ultimoModoDesp); virtual int ejecutate(); int BanderaAuto(); char ModoDespliegue() {return modoDespliegue;}; }; //----------------------------------------------------------ProcesoUno::ProcesoUno(int bandera_auto,char ultimoModoDesp) { ProcesoUno::bandera_auto = bandera_auto; ProcesoUno::modoDespliegue = ultimoModoDesp; } //----------------------------------------------------------void ProcesoUno::aviso_error(char *elError,int x,int y) { linea mensaje_error[] = {{"- DE LEON PINKY !",WHITE,CENTER_TEXT}, {" ",WHITE}, {elError,YELLOW,}, {" ",WHITE,}, {"PULSE CUALQUIER TECLA",WHITE,CENTER_TEXT}, {" ",RED}}; ventanasMensajeError cuadro_error(TRIPLEX_FONT,mensaje_error,6,15,1); cuadro_error.despliegate(x,y); } //-----------------------------------------------------------int ProcesoUno::ponMenuModos() { int resultado; linea texto_menu_modos[]= {{"MENU DE MODOS DE DESPLIEGUE",WHITE,CENTER_TEXT}, {" ",}, {"(1) MODO A (64 TONOS DE GRIS O 256 COLORES)",LIGHTCYAN}, {" ",}, {"(2) MODO B (16 TONOS DE GRIS O 64 COLORES)",LIGHTCYAN}, {" ",},}; char op[]={"12"}; ventanasTexto

ventanaMenuModos(LIGHTBLUE,INTERLEAVE_

FILL,TRIPLEX_FONT, texto_menu_modos,6,15,1); MenusModos menuModos(op); if(bandera_auto == 1) menuModos.precargaRespuesta(modoDespliegue); resultado = menuModos.trabaja(ventanaMenuModos,20,130); if(resultado == 1){ modoDespliegue = menuModos.UltimaRespuesta(); paletaEscogida = menuModos.nom_ArchPaleta(); bandera_auto = 1; } else bandera_auto = 0; return(resultado);

//----------------------------------------------------------int ProcesoUno::ejecutate() { int estado_tarjeta = 0; int bandera_SalirdeMenuPrincipal; ControlTarjeta tarjeta; estado_tarjeta = tarjeta.verificate(); char error1[] = {"NO HAY TARJETA O VIDEO NO LISTO"}; char error2[] = {"VIDEO EN PAUSA"}; char error3[] = {"SOBRECARGA DE LA SEAL"}; if(estado_tarjeta<0){ switch(estado_tarjeta){ case -1: aviso_error(error1,80,100); break; case -2: aviso_error(error2,80,100); break; case -3: aviso_error(error3,80,100); break; } bandera_auto = 0; bandera_SalirdeMenuPrincipal = 0; } else{ if(ponMenuModos()==1){ bandera_SalirdeMenuPrincipal = 1; tarjeta.trabaja(modoDespliegue,paletaEscogida); } else bandera_SalirdeMenuPrincipal = 0;

} }

return(bandera_SalirdeMenuPrincipal);

//----------------------------------------------------------int ProcesoUno::BanderaAuto() { return bandera_auto; } //*********************************************************** * //Clase "CargaImagenes". //*********************************************************** * class CargaImagenes:public AbreArchivos{ protected: public: CargaImagenes(FILE* pArchImagen) {CargaImagenes::pArchAbierto = pArchImagen;}; void cargaImagen(char modoDespliegue); }; //----------------------------------------------------------void CargaImagenes::cargaImagen(char modoDespliegue) { int j = 321,soplon; int cy = 1,cx = 1; unsigned char far *video = (unsigned char far *)0xa0000000L; if(modoDespliegue == '1'){ cx=cy=0; do{ soplon=(getc(pArchAbierto)); cx++; video[j++]=soplon; if(cx == 256){ cx = 0; cy++; j += 64; } }while(cy<198); } else{ do{ soplon=(getc(pArchAbierto))/16; putpixel(cx,cy,soplon); cx++; if(cx == 257) {cx = 1; cy++;} }while(cy<240); } rewind(pArchAbierto); getch();

//*********************************************************** //Clase "ProcesoDos". //*********************************************************** class ProcesoDos:public ProcesoUno{ protected: FILE* pArchImagenCargada; public: ProcesoDos(int bandera_auto,char ultimoModoDesp,FILE* pArchImgen); int ejecutate(); FILE* p_ArchImagen(); }; //-----------------------------------------------------------ProcesoDos::ProcesoDos(int bandera_auto,char ultimoModoDesp, FILE* pArchImagenCargada) :ProcesoUno(bandera_auto,ultimoModoDesp) { ProcesoDos::pArchImagenCargada = pArchImagenCargada; } //-----------------------------------------------------------int ProcesoDos::ejecutate() { int bandera_SalirdeMenuPrincipal,b_archivoAbierto; CargaImagenes cargador(pArchImagenCargada); if(bandera_auto == 0){ linea mensajeDialogo1[] = {{"INTRODUCE EL NOMBRE DEL ARCHIVO QUE",WHITE}, {"GUARDA LA IMAGEN (nombre.extension).",WHITE}, {" ",}, {" ",}, {" ",}}; AbreFlujos f(LIGHTGRAY,INTERLEAVE_FILL,TRIPLEX_FONT, mensajeDialogo1,5,20,1,"rb"); if(cargador.pideNomArch(f,-80,130) == 1){ b_archivoAbierto = 1; pArchImagenCargada = cargador.p_ArchAbierto(); } else b_archivoAbierto = 0;

} else b_archivoAbierto = 1;

if(b_archivoAbierto == 1){ if(ponMenuModos() == 1){ bandera_SalirdeMenuPrincipal = 1; cargador.cargaImagen(modoDespliegue); } else{

} } else{ bandera_SalirdeMenuPrincipal = 0; } return(bandera_SalirdeMenuPrincipal); } //----------------------------------------------------------FILE* ProcesoDos::p_ArchImagen() { return pArchImagenCargada; } //*********************************************************** * //Clase "convierteImagenes". //*********************************************************** * class convierteImagenes:public AbreArchivos{ protected: FILE* pArchTIF; FILE* pArchTags; void avisaExito(char* nomArchTIF); public: convierteImagenes(); int convierte(char* nomArchTIF); void cargaPunteros(FILE* pArchTags,FILE* pArchTIF); }; //-----------------------------------------------------------convierteImagenes::convierteImagenes() { }

bandera_SalirdeMenuPrincipal = 0; fclose(pArchImagenCargada);

//-----------------------------------------------------------void convierteImagenes::avisaExito(char* nomArchTIF) { linea texto_exito[] = {{"-CONVERSION DE FORMATO EXITOSA!",YELLOW,CENTER_TEXT}, {" ",WHITE} {"EL ARCHIVO : ",WHITE}, {nomArchTIF,YELLOW,CENTER_TEXT}, {"HA SIDO CREADO.",WHITE}, {"PULSE CUALQUIER TECLA ",WHITE}, {" ",WHITE}}; ventanasMensaje mensajeExito(LIGHTBLUE,HATCH_FILL,TRIPLEX_FONT, texto_exito,7,15,1); mensajeExito.despliegate(-80,120); }

//-----------------------------------------------------------void convierteImagenes::cargaPunteros(FILE* pArchTags,FILE* pArchTIF) { convierteImagenes::pArchTags = pArchTags; convierteImagenes::pArchTIF = pArchTIF; } //-----------------------------------------------------------int convierteImagenes::convierte(char* nomArchTIF) { unsigned int cuenta_tags,soplon; unsigned long int x=0; char tag[6]; linea texto_espera[] = {{"-ESPERE UN MOMENTO!",WHITE,CENTER_TEXT}, {" ",WHITE}, {"CONVERSION DE FORMATO EN PROCESO",WHITE}, {" ",WHITE}}; ventanasTexto mensajeEspera(BLUE,SOLID_FILL,TRIPLEX_FONT, texto_espera,4,15,1); mensajeEspera.despliegate(80,100); for(x=0;x<cuenta_tags;x++){ fgets(tag,5,pArchTags); soplon=atoi(tag); putc(soplon,pArchTIF); } x=0; do{ soplon=getc(pArchAbierto); putc(soplon,pArchTIF); x++; }while(x<61184); fclose(pArchAbierto); fclose(pArchTIF); fclose(pArchTags); //getch(); mensajeEspera.borrate(); avisaExito(nomArchTIF);

//*********************************************************** * //Clase "MenuPalTags", derivada de MenusPaletas. //*********************************************************** * class MenuPalTags : public MenusPaletas{ protected: void realiza_tareas(ventanasTexto &v); public: MenuPalTags(char* teclas_opcion); };

//----------------------------------------------------------MenuPalTags::MenuPalTags(char* teclas_opcion) :MenusPaletas(teclas_opcion) { } //----------------------------------------------------------void MenuPalTags::realiza_tareas(ventanasTexto &v) { switch(respuesta){ case 27: v.borrate(); resultado = 0; bandera_salir = 1; break; case '1': abreArchPaleta("graypal.pal",v,170,40) ; //v.borrate(); //bandera_salir = 1; //resultado = 1; break; case '2': abreArchPaleta("arcopal.pal",v,200,50); break; case '3': abreArchPaleta("firepal.pal",v,180,60); break; case '4': abreArchPaleta("bospal.pal",v,190,60); break; } } //*********************************************************** * //Clase "MenuNombres", derivada de Menus. //*********************************************************** * class MenuNombres : public Menus{ protected: FILE* pArchTIF; char* nomArchTIF; char* nomArchImagen; void realiza_tareas(ventanasTexto &v); public: MenuNombres(char* teclas_opcion,char* nomArchImagen); FILE* p_ArchTIF(){return pArchTIF;}; char* nom_ArchTIF(){return nomArchTIF;}; };

//----------------------------------------------------------MenuNombres::MenuNombres(char* teclas_opcion,char* nomArchImagen) :Menus(teclas_opcion) { MenuNombres::nomArchImagen = nomArchImagen; } //----------------------------------------------------------void MenuNombres::realiza_tareas(ventanasTexto &v) { switch(respuesta){ case 27: bandera_salir = 1; resultado = 0; v.borrate(); break; case '1': char *pPunto; strcpy(nomArchTIF,nomArchImagen); pPunto = strchr(nomArchTIF,'.'); *pPunto = '\0'; strcat(nomArchTIF,".TIF"); SoloAbreArchivos archivero; if(archivero.trabaja(nomArchTIF,"wb",100,50) == 1){ pArchTIF = archivero.p_ArchAbierto(); resultado = 1; bandera_salir = 1; v.borrate(); } else{ bandera_salir = 0; resultado = -1; } break; case '2': v.borrate(); linea mensaje3[] = {{"INTRODUCE EL NOMBRE DEL ARCHIVO QUE",YELLOW}, {"GUARDARA LA IMAGEN *.TIF (nombre.TIF).",YELLOW}, {" ",}, {" ",}, {" ",}}; AbreFlujos f(LIGHTGRAY,HATCH_FILL,TRIPLEX_FONT, mensaje3,5,15,1,"wb"); AbreArchivos archivero2; if(archivero2.pideNomArch(f,-80,100) == 1){ bandera_salir = 1; resultado = 1;

} else{ bandera_salir = 1; resultado = -1; } break;

pArchTIF = archivero2.p_ArchAbierto(); nomArchTIF = archivero2.nom_ArchAbierto();

//*********************************************************** * //Clase "MenuIntFoto", derivada de Menus. //*********************************************************** * class MenuIntFoto : public Menus{ protected: FILE* pArchTags; int ponMenuPalTags(); void realiza_tareas(ventanasTexto &v); public: MenuIntFoto(char* teclas_opcion); FILE* p_ArchTags(); }; //----------------------------------------------------------MenuIntFoto::MenuIntFoto(char* teclas_opcion) :Menus(teclas_opcion) { } //----------------------------------------------------------void MenuIntFoto::realiza_tareas(ventanasTexto &v) { SoloAbreArchivos archivero; switch(respuesta){ case 27: bandera_salir = 1; resultado = 0; v.borrate(); break; case'1': if(archivero.trabaja("mototif.txt","r",50,100)==1) { pArchTags = archivero.p_ArchAbierto(); v.borrate(); bandera_salir = 1; resultado = 1; } else {bandera_salir = 0;resultado = 0;} break;

} } //-----------------------------------------------------------int MenuIntFoto::ponMenuPalTags() { linea textoMenuPaletas[]= {{"MENU DE PALETAS",WHITE,CENTER_TEXT}, {" ",}, {"(1) PALETA EN TONOS DE GRIS",LIGHTGREEN}, {"(2) PALETA ARCOIRIS",LIGHTGREEN}, {"(3) PALETA FIRELIGHT",LIGHTGREEN}, {"(4) PALETA BOSCOSA ",LIGHTGREEN}, {" ",}}; char op[] = {"1234"}; ventanasTexto

case '2': switch(ponMenuPalTags()){ case 1: resultado = 1; bandera_salir = 1; v.borrate(); break; case 0: bandera_salir = 0; break; } break;

} //-----------------------------------------------------------FILE* MenuIntFoto::p_ArchTags() { return pArchTags; } //*********************************************************** //Clase "ProcesoTres". //*********************************************************** class ProcesoTres{ protected: FILE* pArchTags;

MenuPalTags menuPalTags(op); int resultado = menuPalTags.trabaja(vMenuPal,50,90); if(resultado == 1) pArchTags = menuPalTags.pAP(); return resultado;

vMenuPal(MAGENTA,INTERLEAV E_FILL,TRIPLEX_FONT, textoMenuPaletas,7,15,1);

FILE* pArchTIF; char* nomArchTIF; int ponMenuIntFoto(); int ponMenuNombres(char* nomArchImagen); public: int ejecutate(); }; //-----------------------------------------------------------int ProcesoTres::ponMenuIntFoto() { linea mensaje[]={{"SELECCIONE INTERPRETACION FOTOMETRICA:",WHITE}, {" ",WHITE}, {"(1) ESCALA DE GRISES.",YELLOW}, {"(2) PSEUDOCOLOR (INDEXED).",YELLOW}, {" ",WHITE}}; char op[]={"12"}; ventanasTexto vMIF(LIGHTBLUE,INTERLEAVE_FILL,TRIPLEX_FONT, mensaje,5,15,1); MenuIntFoto menuIntFoto(op); int resultado = menuIntFoto.trabaja(vMIF,-80,140); if(resultado == 1) pArchTags = menuIntFoto.p_ArchTags(); return resultado;

//----------------------------------------------------------int ProcesoTres::ponMenuNombres(char* nomArchImagen) { linea mensaje0[] = {{"MENU DE NOMBRADO",WHITE,CENTER_TEXT}, {" ",BLACK}, {"(1) EL ARCHIVO *.TIF TENDRA EL MISMO",BLUE}, {" NOMBRE QUE EL ARCHIVO *.DAT.",BLUE,}, {"(2) EL ARCHIVO *.TIF TENDRA OTRO NOMBRE",BLUE}, {" ",BLACK}}; ventanasTexto vR(CYAN,SOLID_FILL,TRIPLEX_FONT,mensaje0,6,15,1); char op[]={"12"}; MenuNombres menuRenom(op,nomArchImagen); int resultado = menuRenom.trabaja(vR,-80,140); if(resultado == 1){ pArchTIF = menuRenom.p_ArchTIF(); nomArchTIF = menuRenom.nom_ArchTIF(); } return resultado;

//----------------------------------------------------------int ProcesoTres::ejecutate() { linea mensajeDialogo1[] =

{{"INTRODUCE EL NOMBRE DEL ARCHIVO QUE",WHITE}, {"GUARDA LA IMAGEN BINARIA (nombre.DAT).",WHITE}, {" ",}, {" ",}, {" ",}}; AbreFlujos f(BROWN,INTERLEAVE_FILL,TRIPLEX_FONT, mensajeDialogo1,5,20,1,"rb"); int b_finLoop1,b_finLoop2,b_finLoop3; int b_ArchImagenAbierto = 0; int b_ArchTagsAbierto = 0; convierteImagenes convertidor; do{ if(convertidor.pideNomArch(f,-80,100) == 0){ if(b_ArchImagenAbierto == 1) fclose(convertidor.p_ArchAbierto()); b_finLoop1 = 1; } else{ b_ArchImagenAbierto = 1; do{ switch(ponMenuIntFoto()){ case 1: b_ArchTagsAbierto = 1; do{ switch(ponMenuNombres(convertidor.nom_ArchAbierto())){ case 1: convertidor.cargaPunteros(pArchTags,pArchTIF); convertidor.convierte(nomArchTIF); b_finLoop3 = 1; b_finLoop2 = 1; b_finLoop1 = 1; break; case -1: b_finLoop3 = 0; fclose(pArchTIF); break; case 0: b_finLoop3 = 1; b_finLoop2 = 0; break; } }while(b_finLoop3 == 0); break; case 0: if(b_ArchTagsAbierto == 1) fclose(pArchTags); b_finLoop2 = 1; b_finLoop1 = 0; break; } }while(b_finLoop2 == 0); } }while(b_finLoop1 == 0);

} //*********************************************************** * //Clase "MenusPrincipal", derivada de "MenusAuto". //*********************************************************** * class MenusPrincipal : public MenusAuto{ protected: FILE* pArchImagen; char* nomArchImagen; char ultimoModoDesp; virtual void realiza_tareas(ventanasTexto &v); public: MenusPrincipal(char* op); }; //----------------------------------------------------------MenusPrincipal::MenusPrincipal(char* teclas_opcion) :MenusAuto(teclas_opcion) { pArchImagen = NULL; ultimoModoDesp = '\0'; } //----------------------------------------------------------void MenusPrincipal::realiza_tareas(ventanasTexto &v) { switch(respuesta){ case '1': ultima_respuesta = '1'; ProcesoUno proceso1(bandera_auto,ultimoModoDesp); bandera_salir = proceso1.ejecutate(); ultimoModoDesp = proceso1.ModoDespliegue(); bandera_auto = proceso1.BanderaAuto(); break; case '2': ultima_respuesta = '2'; ProcesoDos proceso2(bandera_auto,ultimoModoDesp,pArch Imagen); bandera_salir = proceso2.ejecutate(); bandera_auto = proceso2.BanderaAuto(); pArchImagen = proceso2.p_ArchImagen(); ultimoModoDesp = proceso2.ModoDespliegue(); break; case '3': ultima_respuesta = '3'; ProcesoTres proceso3; proceso3.ejecutate(); bandera_auto = 0; bandera_salir = 0; break;

case '4': v.borrate(); bandera_salir = 1; restorecrtmode(); exit(0); break; default: bandera_salir = 0;

//*********************************************************** * //Clase "ControlPrograma". //*********************************************************** * class ControlPrograma{ public: ControlPrograma(); virtual void inicializa_graficos(); virtual void pon_menu_principal(); }; //----------------------------------------------------------ControlPrograma::ControlPrograma() { } //----------------------------------------------------------void ControlPrograma::inicializa_graficos() { int controlador,modo; controlador=DETECT; modo=DETECT; initgraph(&controlador,&modo,""); } //----------------------------------------------------------void ControlPrograma::pon_menu_principal() { linea textoMenuPrin[]={{"MENU PRINCIPAL",WHITE,CENTER_TEXT}, {" ",}, {"(1) DIGITALIZAR",14}, {"(2) CARGAR UNA IMAGEN",14}, {"(3) CONVERTIR ARCHIVO *.DAT A *.TIF",14}, {"(4) SALIR ",14}, {" ",}};

char opcionesMenuPrin[]={"1234"}; MenusPrincipal menuPrincipal(opcionesMenuPrin); while(1){ cleardevice(); setviewport(0,0,getmaxx(),getmaxy(),0); rectangle(0,0,getmaxx(),getmaxy()); rectangle(3,3,getmaxx()3,getmaxy()-3); ventanasTexto VentanaMenuPrincipal(GREEN,INTERLE AVE_FILL,TRIPLEX_FONT, textoMenuPrin,7,15,2); menuPrincipal.trabaja(VentanaMenuPrincipal,100,40); inicializa_graficos(); }

//************************************************************ void main() { ControlPrograma programa; programa.inicializa_graficos(); programa.pon_menu_principal(); }

Das könnte Ihnen auch gefallen