• No se han encontrado resultados

biOps : un paquete de procesamiento de imágenes en R

N/A
N/A
Protected

Academic year: 2020

Share "biOps : un paquete de procesamiento de imágenes en R"

Copied!
119
0
0

Texto completo

(1)

biOps: un paquete de procesamiento de

im´

agenes en R

Mat´ıas Bordese

Walter Daniel Alini

Director: Dr. Oscar Humberto Bustos

30 de noviembre de 2007

Facultad de Matem´

atica, Astronom´ıa y F´ısica

(2)

“No se qu´e hace, pero est´a muy bueno.”

(3)

Clasificaci´on:

I.4 Image Processing and Computer Vision

Palabras clave:

R, procesamiento de im´agenes, detecci´on de bordes, clasificaci´on, FFT

UNIVERSIDAD NACIONAL DE C ´ORDOBA

Facultad de Matem´atica, Astronom´ıa y F´ısica

Licenciatura en Ciencias de la Computaci´on

biOps: un paquete de procesamiento de im´agenes en R

por Mat´ıas Bordese Walter Daniel Alini

Resumen

El presente trabajo describe un paquete de procesamiento de im´agenes realizado en R, un lengua-je y entorno computacional libres, enfocado en estad´ıstica y gr´aficos estad´ısticos. Las distintas funciones del paquete, denominado biOps, fueron especificadas utilizando la notaci´on Z -un len-guaje formal de especificaciones usado para describir y modelar sistemas de computaci´on- e implementadas usando R mediante la codificaci´on e integraci´on de c´odigo C.

El paquete se compone de operaciones geom´etricas, morfol´ogicas, aritm´eticas, l´ogicas, de tablas de reemplazo, de detecci´on de bordes y de convoluci´on. Incluye tambi´en filtros en el espacio de frecuencias a partir de la Transformada R´apida de Fourier y m´etodos no supervisados de clasificaci´on de im´agenes. Se describen y detallan las implementaciones, sus fundamentos te´oricos y aplicaciones m´as frecuentes.

(4)

Agradecimientos

Al Dr. Oscar H. Bustos, por la direcci´on del trabajo.

Al Dr. Pedro R. D’Argenio, por su apoyo, consejos y opiniones.

A la Dra. Laura Alonso y al MSc. Maximiliano Cristi´a, por su desinteresada colaboraci´on. A Kurt Hornik y Uwe Ligges, del R Development Core Team, nuestros R-gur´us.

A nuestros familiares y grupo de amigos.

(5)

´

Indice general

Resumen II

Agradecimientos III

Listado de Figuras VII

1. Introducci´on 1

2. R 4

2.1. Antecedente: El lenguaje S . . . 4

2.2. Rcomo implementaci´on deS . . . 5

2.3. Interfaz contra lenguajes compilados . . . 7

2.4. Rpuro vs. interfazC . . . 8

2.5. Colaboraci´on a CRAN . . . 10

3. Z 12 3.1. Las especificaciones formales . . . 12

3.2. El lenguaje de especificaci´on Z . . . 13

3.3. Definiciones en Z . . . 14

3.3.1. Declaraciones . . . 14

3.3.2. Abreviaciones . . . 15

3.3.3. Definiciones axiom´aticas . . . 15

3.3.4. Definiciones gen´ericas . . . 15

3.3.5. Esquemas . . . 16

3.4.

f

uzz . . . 16

3.5. Especificaci´on enZ . . . 17

3.5.1. Especificaci´on de reales . . . 17

3.5.2. Resto de las especificaciones . . . 20

4. Imagen digital 21 4.1. Representaci´on . . . 21

4.2. Resoluci´on espacial y de profundidad . . . 22

4.3. Modelos de color . . . 23

4.3.1. RGB . . . 23

4.3.2. CYM . . . 24

4.3.3. HSI . . . 24

4.4. Nuestra implementaci´on . . . 25

4.4.1. Especificaci´on . . . 26

5. El procesamiento digital de im´agenes 27 5.1. Or´ıgenes . . . 27

(6)

´

Indice general v

5.2. Aplicaciones . . . 29

5.2.1. Astronom´ıa y exploraci´on del espacio . . . 29

5.2.2. Inteligencia y aplicaci´on militar . . . 29

5.2.3. Ciencias de la tierra . . . 29

5.2.4. Gobierno . . . 30

5.2.5. Visualizaci´on de datos . . . 30

5.2.6. Entretenimiento . . . 30

5.2.7. Medicina . . . 30

5.2.8. Procesamiento de documentos . . . 31

5.2.9. Aplicaciones industriales y visi´on de m´aquinas . . . 31

5.2.10. Aplicaciones hogare˜nas . . . 31

6. biOps: un paquete de procesamiento de im´agenes para R 32 6.1. Otros paquetes R de manejo de im´agenes . . . 32

6.2. Estructura del paquete . . . 33

6.3. Testing . . . 34

6.4. biOpsGUI: el principio de una interfaz gr´afica de usuario . . . 36

6.5. Pr´oximos cap´ıtulos . . . 36

6.6. Formato Digital . . . 37

7. Operaciones por pixel 38 7.1. Look-up tables . . . 39

7.1.1. Modificaci´on de contraste . . . 40

7.1.2. Modificaci´on de intensidad . . . 41

7.1.3. Otras modificaciones . . . 41

7.2. Operaciones aritm´eticas y l´ogicas . . . 43

7.3. Histogramas . . . 45

7.4. Generaci´on de ruido . . . 46

8. Operaciones geom´etricas 48 8.1. Mapeo de valores: “hacia adelante” vs. “hacia atr´as” . . . 48

8.2. Interpolaci´on . . . 49

8.2.1. Interpolaci´on por el vecino m´as cercano . . . 49

8.2.2. Interpolaci´on bilineal . . . 50

8.2.3. Interpolaci´on por B-Spline . . . 50

8.2.4. Interpolaci´on convolucional c´ubica . . . 51

8.3. Operaciones implementadas . . . 51

8.3.1. Escalar . . . 51

8.3.2. Encoger . . . 52

8.3.3. Rotar . . . 54

8.3.4. Espejar . . . 55

8.3.5. Trasladar . . . 55

8.3.6. Recortar . . . 56

9. Operaciones por vecino 58 9.1. Convoluci´on . . . 58

9.1.1. Blurring . . . 60

9.1.2. Sharpening . . . 61

9.2. Filtro por mediana . . . 62

9.3. Filtro por m´ınimo/m´aximo . . . 63

10.Algoritmos de detecci´on de bordes 64 10.1. Generalidades . . . 64

(7)

´

Indice general vi

10.3. T´ecnicas por convoluci´on . . . 66

10.3.1. Detecci´on de bordes por gradiente (Gradient Edge Detection) . . . 67

10.3.2. Detecci´on de bordes por comp´as (Compass Edge Detection) . . . 68

10.4. T´ecnicas avanzadas . . . 69

10.4.1. Marr Hildreth . . . 70

10.4.2. Canny . . . 70

10.4.3. Shen Castan . . . 72

10.5. Detecci´on de bordes en color . . . 73

11.Filtros en el espacio de frecuencias 74 11.1. Espacio de frecuencias . . . 74

11.2. Transformada de Fourier . . . 75

11.3. Convoluci´on . . . 78

11.4. Filtros por frecuencia . . . 80

12.Operaciones morfol´ogicas 82 12.1. Operaciones sobre im´agenes binarias . . . 82

12.1.1. Dilataci´on binaria . . . 83

12.1.2. Erosi´on binaria . . . 85

12.1.3. Apertura y clausura binarias . . . 86

12.2. Operaciones sobre im´agenes en escala de grises . . . 88

13.Clasificaci´on de im´agenes 90 13.1. Conceptos . . . 90

13.2. Clasificaci´on supervisada y no supervisada . . . 91

13.3. M´etodos de clasificaci´on no supervisados . . . 92

13.3.1. K-means . . . 93

13.3.1.1. Complejidad . . . 96

13.3.2. Isodata . . . 97

14.Conclusiones 99 14.1. Trabajo futuro . . . 100

14.2. Estad´ısticas . . . 101

A. Profiling 103

(8)

´

Indice de figuras

4.1. Matriz imagen . . . 22

4.2. Modelos de color RGB y CYM . . . 23

4.3. Modelo de color HSI . . . 25

6.1. Estructura biOps . . . 35

7.1. Look-up tables . . . 39

7.2. Decrementar contraste . . . 40

7.3. Incrementar contraste . . . 41

7.4. Decrementar intensidad . . . 42

7.5. Incrementar intensidad . . . 42

7.6. Negativo . . . 42

7.7. Thresholding . . . 43

7.8. Transformaci´on Gamma . . . 43

7.9. Aplicaci´on deimgDiffer . . . 45

7.10. Histograma de una imagen . . . 45

7.11. Ruido “sal y pimienta” . . . 47

8.1. Rotaci´on de imagen . . . 54

8.2. Operaci´on de espejado . . . 55

8.3. Operaci´on de traslaci´on . . . 56

9.1. Convoluci´on . . . 59

9.2. Aplicaci´on de sharpening . . . 61

9.3. Aplicaci´on de filtro por mediana . . . 62

10.1. Operador de homogeneidad . . . 65

10.2. Operador por diferencia . . . 65

10.3. Aplicaci´on de operador por diferencia . . . 66

10.4. Borde y derivadas en una dimensi´on . . . 66

10.5. Aplicaci´on de Sobel (threshold = 40, negativo) . . . 68

10.6. Aplicaci´on de Canny . . . 72

11.1. Transformada de Fourier . . . 78

11.2. Filtros FFT . . . 79

11.3. Filtro por frecuencia . . . 81

12.1. Representaci´on gr´afica de una imagen binaria . . . 83

12.2. Dilataci´on binaria . . . 84

12.3. Dilataci´on binaria . . . 85

12.4. Erosi´on binaria . . . 86

12.5. Erosi´on binaria . . . 86

12.6. Apertura y clausura . . . 87

(9)

List of Figures viii

(10)

Cap´ıtulo 1

Introducci´

on

El procesamiento digital es el conjunto de t´ecnicas computacionales que se aplican sobre las im´agenes con el objetivo de mejorar la calidad, alterar su morfolog´ıa, facilitar su interpretaci´on o proporcionar herramientas para la b´usqueda de informaci´on. Aparece tard´ıamente en la historia de la computaci´on, debido a los requisitos de hardware y los sistemas gr´aficos que permitieran desarrollarla. El abaratamiento de los costos y la evoluci´on de los equipos le dio un fuerte impulso en los ´ultimos tiempos.

En la actualidad existen muchas aplicaciones de software que permiten el procesamiento digital de im´agenes, as´ı como librer´ıas para los diferentes lenguajes de programaci´on. R, un lenguaje libre destinado principalmente al an´alisis estad´ıstico de datos, es quiz´a una excepci´on a la regla. Las alternativas que se presentan para el manejo multiprop´osito de im´agenes son escasas.

La posibilidad de integrar funcionalidad para el procesamiento de im´agenes en un entorno es-tad´ıstico, libre y con una comunidad muy bien organizada y en constante crecimiento, sumado a las ventajas que suponen las utilidades estad´ısticas (c´alculo de medias, desviaciones, histogra-mas), nos impulsaron a la realizaci´on de este proyecto. El objetivo fue, entonces, el de investigar, estudiar, especificar e implementar un conjunto de algoritmos para R, que provea un entorno funcional, ´util y general para el procesamiento de im´agenes, colaborando con la comunidad de Software Libre, es decir, permitiendo de esta forma su libre uso y modificaci´on.

Presentamos en este escrito el resumen de varios meses de trabajo. Intentamos ser precisos al introducir los conceptos manejados, para que el lector tenga una buena lectura preparatoria, y analizar en detalle las especificaciones, utilidades e implementaciones de los algoritmos elegidos para formar parte del paquete.

Se realiz´o el estudio, an´alisis, especificaci´on, implementaci´on y testeo de t´ecnicas para el manejo de im´agenes, que concluyeron con la creaci´on y publicaci´on de un paquete R, denominado biOps, liberado bajo la licencia GPL y que se encuentra disponible en el repositorio oficial de paquetes del lenguaje R. Adem´as se comenz´o con el trabajo de una interfaz gr´afica de usuario, biOpsGUI, para brindar una mejor experiencia de usuario.

(11)

Cap´ıtulo 1. Introducci´on 2

Creemos que el paquete obtenido es una importante colaboraci´on con la comunidad R, que no contaba con paquetes multiprop´osito de importancia en el procesamiento de im´agenes. biOps, en este sentido, resulta de gran utilidad, f´acilmente extensible y con una amplia gama de algoritmos.

Consideramos que los trabajos futuros para la mejora del paquete debieran considerar la exten-si´on de la interfaz gr´afica, diversificar los formatos de imagen soportados, reconsiderar el manejo en memoria de la representaci´on de im´agenes y a˜nadir algoritmos para ampliar su utilidad (al-goritmos supervisados de clasificaci´on de im´agenes, filtros, reconocimiento de patrones, machine vision, etc.).

Estructura de este trabajo

Este texto se compone de dos partes principales: los cap´ıtulos 2 al 5 introducen conceptos re-lacionados a las etapas previas a la codificaci´on. Se presentan la notaci´on Z, lenguaje utilizado para las especificaciones formales en este trabajo, y el lenguaje R, sobre el cual se implementaron los algoritmos estudiados. Se desarrollan adem´as, los conceptos relacionados con im´agenes, sus representaciones, modelos de color y los usos en las diversas ´areas de aplicaci´on. El cap´ıtulo 6 presenta una descripci´on de las secciones posteriores (cap´ıtulos 7 al 13), en los cuales se profun-dizan los conceptos, utilidades, especificaci´on e implementaci´on correspondientes a cada una de las divisiones del paquete.

Para una visi´on global de este trabajo, recomendamos la lectura de los cap´ıtulos 1 (esta In-troducci´on), 6 (descripci´on del paquete, contenidos del trabajo y cap´ıtulos posteriores) y 14 (recapitulaci´on, evaluaci´on, conclusiones y desaf´ıos para el trabajo futuro). Quien desee profun-dizar acerca de los lenguajes y notaciones utilizados, puede concentrarse en los cap´ıtulos 2 (el lenguaje R, y sus interfaz con el lenguaje C) y 3 (la notaci´on Z, de especificaci´on de modelos de sistemas computacionales). A los interesados en conceptos o implementaciones en una deter-minada rama del procesamiento digital de im´agenes que hayan sido tratados en este trabajo, sugerimos la lectura del cap´ıtulo correspondiente.

A continuaci´on se presenta un breve resumen del contenido de los cap´ıtulos de este trabajo:

R [Cap. 2]:Res un lenguaje interpretado, de scripting, y un conjunto de librer´ıas destinadas principalmente al an´alisis estad´ıstico de datos. El “Comprehensive R Archive Network” es una red de sitios con las librer´ıas que est´an disponibles para el uso en R. Se realiza una breve descripci´on del lenguaje, sus procedimientos para colaborar con su comunidad, su red de archivos y las interfaces para comunicarlo con otros lenguajes de programaci´on. Se comparan adem´as algoritmos codificados en R y en C (mediante interfaz en R).

(12)

Cap´ıtulo 1. Introducci´on 3

Imagen digital [Cap. 4]: Se presentan los conceptos necesarios para comprender la represen-taci´on computacional de im´agenes: la resoluci´on espacial y de profundidad (detalles en una imagen) y los modelos de color m´as conocidos (RGB, CYM y HSI). Se detalla adem´as la representaci´on elegida para este trabajo e implementaci´on para la obtenci´on de im´agenes mediante R.

Procesamiento digital de im´agenes [Cap. 5]: El procesamiento de im´agenes es una rama que data de principios de siglo pasado. Se relata su origen y las principales aplicaciones en las diversas ´areas donde es utilizado.

biOps: un paquete de procesamiento de im´agenes en R [Cap. 6]: biOps es el nombre del paquete que desarrollamos y que se encuentra publicado en el repositorio oficial de paquetes R. Se detallan estructura, componentes y el comienzo de la implementaci´on de su interfaz gr´afica: biOpsGUI. Tambi´en se presenta una comparaci´on contra otros paquetes R de manejo de im´agenes y una visi´on global de los cap´ıtulos posteriores:

Operaciones por pixel [Cap. 7]: Algoritmos de “tabla de reemplazos”, operaciones aritm´eticas, l´ogicas, de representaci´on gr´afica (histogramas) y generaci´on de ruidos.

Operaciones geom´etricas [Cap. 8]: Operaciones de rotaci´on, escalado, espejado, crop, shrink y traslaci´on. Adem´as, diversas formas de interpolaci´on (vecino m´as cer-cano, bilineal, c´ubica y por spline).

Operaciones por vecino [Cap. 9]: Concepto de convoluci´on y aplicaci´on de filtros lineales y no lineales.

Algoritmos de detecci´on de bordes [Cap. 10]: Algoritmos sencillos y r´apidos (homogeneidadydiferencia), m´etodos basados en convoluci´on (Sobel,Prewitt,Roberts, etc.) y algunas t´ecnicas avanzadas (Shen Castan,Marr Hildreth, etc.).

Filtros en el espacio de frecuencias [Cap. 11]: Filtros mediante latransformada r´apida de Fourier.

Operaciones morfol´ogicas [Cap. 12]: Operaciones para im´agenes binarias y de escala de grises, deerosi´on,dilataci´on y sus combinaciones:apertura yclausura.

Clasificaci´on de im´agenes [Cap. 13]: Se dividen en algoritmos supervisados y no supervisados. Se detallanIsodata yK-Means(no supervisados).

(13)

Cap´ıtulo 2

R

Res un lenguaje interpretado, de scripting, y un conjunto de librer´ıas destinadas principalmente al an´alisis estad´ıstico de datos. Es una implementaci´on libre del lenguaje estad´ıstico S, creado a mediados de la d´ecada del ’70 por los Laboratorios Bell, aunque se ve influenciado tambi´en por el lenguajeScheme. Se distribuye sin costo y bajo la licenciaGPL, y es el lenguaje sobre el cual se ha llevado a cabo la implementaci´on de los diversos algoritmos que forman parte de este trabajo.Rest´a construido principalmente sobre el lenguaje de programaci´onC, aunque mucha funcionalidad est´a escrita en R mismo. Adem´as puede integrarse con otros lenguajes mediante el uso de funciones espec´ıficas, lo que nos permite una diversidad de opciones a la hora de tomar decisiones de implementaci´on. Se codificaron algunos algoritmos, objeto de este trabajo, tanto con acceso a c´odigo realizado enC como a uso expl´ıcito de este lenguaje, y se compararon los datos de eficiencia mediante algunas herramientas deprofiling. La gran diferencia encontrada a favor de las implementaciones con llamadas a c´odigoC, cuyas causas se mencionan, influenci´o en su mayor uso en el resto de los algoritmos.

El “Comprehensive R Archive Network” es una red de sitios con las librer´ıas que est´an disponibles para el uso enR. Para colaborar conCRAN es necesario cumplir con una serie de requisitos que hacen que los paquetes puedan funcionar correctamente y estar documentados de una manera homog´enea.

La comunidadR, en constante crecimiento, ha realizado diversas herramientas y comandos para aliviar la tarea de los programadores que deseen colaborar con el proyecto. Entre ellas est´an los comandoscheck ybuild, que se explican brevemente.

2.1.

Antecedente: El lenguaje S

Desde la segunda parte del siglo XX, y gracias al incremento del poder de c´alculo de la compu-taci´on, la estad´ıstica se ha visto sustancialmente impactada. Este impacto ha tra´ıdo dos con-secuencias fundamentales: por un lado, la automatizaci´on del c´alculo para los viejos m´etodos estad´ısticos; y por el otro, el resurgimiento del inter´es en m´etodos menos estudiados, como los

(14)

Cap´ıtulo 2. R 5

no lineales, encabezados por las redes neuronales y los ´arboles de decisi´on. La abundancia en recursos ha causado tambi´en el renacer de nuevos modelos lineales descartados con anterioridad.

Alrededor del a˜no 1980 comienzan a surgir los lenguajes de programaci´on especializados en an´alisis estad´ısticos. Hoy en d´ıa hay tantos como programadores emprendedores hubo en las ´

ultimas d´ecadas.

Entre los lenguajes que m´as popularidad han logrado, se encuentraS. La historia de este lenguaje se remonta a mediados de los ’70, en los Laboratorios Bell. Hasta ese entonces, mucho de los investigadores se val´ıan de librer´ıas del lenguajeFortran (acr´onimo deFormulaTranslator) para realizar sus c´alculos, sobre todo la librer´ıa SCS (Statistical Computing Subroutines), rutinas que se extend´ıan seg´un las necesidades. El impulso a realizar c´alculos m´as simplistas que los que propon´ıa esta librer´ıa, sumado a la paulatina disminuci´on de c´odigoFortran necesario para los c´alculos, hacen que Rick Becker, Allan Wilks y John Chambers comiencen el desarrollo de S

como una unidad independente.

S no fue el primer lenguaje con funcionalidad estad´ıstica realizado por los Laboratorios Bell, pero s´ı el primero en ser implementado. La primera implementaci´on data del 1976 y funcionaba sobre el sistema operativoGCOS (General Comprehensive Operating System). El nombre ’S’ (escrito en un principio as´ı, con comillas simples) fue elegido por ser esta letra com´unmente usada en computaci´on estad´ıstica, siendo consistente con otros lenguajes de programaci´on desarrollados en la misma instituci´on (l´ease el lenguaje de programaci´onC, de uso frecuente en nuestros d´ıas).

Tras una mutaci´on no demasiado importante que hizo que pudiera empezar a utilizarse en el sis-tema operativoUNIX, por el a˜no 1988,S sufre una serie de cambios de peso (en implementaci´on y, sobre todo, en sintaxis) y en 1991 se introduce el concepto de notaci´on de f´ormulas.

Este “nuevo” lenguaje es bastante parecido a las implementaciones actuales: S−Plus (versi´on comercial deS, tambi´en conocida comoS+), desarrollado por la empresaInsightful, yR(versi´on libre), objeto de nuestro estudio, y en el cual centraremos toda la atenci´on.

R tambi´en fue influenciado, sobre todo en lo que se refiere a implementaci´on subyacente y sem´antica, por el lenguaje Scheme1, desarrollado por Guy L. Steele y Gerald Jay Sussman en los a˜nos ’70.

Actualmente, adem´as de S −Plus2 existen otras alternativas comerciales, que si bien no son

objeto de estudio en este trabajo, vale la pena mencionarlas:SAS3,Minitab4 ySPSS5.

2.2.

R

como implementaci´

on de

S

La primera implementaci´on de S como proyecto de software libre fue dise˜nada por Ross Ihaka y Robert Gentleman en el Departamento de Estad´ısticas de la Universidad de Aukland, Nueva

1http://www.schemers.org

2http://www.insightful.com/products/splus 3http://www.sas.com

4http://www.minitab.com 5

(15)

Cap´ıtulo 2. R 6

Zelanda. Le llamaronR, que surge por un juego conS, principal antecesor, y el primer nombre de ambos autores.

Un gran grupo de personas han contribuido con el desarrollo deRmediante el aporte de c´odigo y reportes de bugs desde su creaci´on. Hacia mediados de 1997 se cre´o un grupo de desarrolladores con permisos de modificaci´on de las fuentes deR, el “R Core Team”, que se compone actualmente de 17 personas, entre ellas sus primeros programadores Ihaka y Gentleman.

R es, en pocas palabras, la suma de un lenguaje de scripting, un int´erprete y un conjunto muy completo de m´odulos built-in para el manejo de datos y trabajos estad´ısticos. Consta de dos componentes principales: el lenguaje propiamente dicho y el int´erprete, con los cuales se puede manejar gr´aficos, efectuar tareas de depuraci´on y debugging, as´ı como tambi´en acceder a algunas funciones del sistema y correr scripts desde c´odigo guardado en archivos.

R integra programas para la manipulaci´on de datos, c´alculo y gr´aficos. Dispone de una gran cantidad de librer´ıas, con un fuerte hincapi´e en el manejo de datos y funcionalidades estad´ısticas. Cuenta adem´as con:

Almacenamiento y manipulaci´on eficaz de datos

Operadores para variables indexadas, en particular matrices (y arreglos, es decir, matrices unidimensionales)

Una amplia colecci´on integrada de herramientas para el an´alisis de datos Funcionalidad de impresi´on gr´afica en pantalla o impresora

El lenguaje de programaci´on incluye condicionales, ciclos, funciones recursivas y de entrada/sa-lida. Muchas de las funcionalidades que provee est´an escritas enR mismo, si bien gran parte de las librer´ıas b´asicas est´an escritas enC.

R puede integrarse con distintas bases de datos y existen librer´ıas que facilitan su utilizaci´on desde lenguajes de programaci´on interpretados (comoPerl yPython) o desde lenguajes de c´odigo compilado (comoC,C+ + yFortran), como veremos m´as adelante para el caso particular que nos interesa. La lista de los lenguajes en los cuales pueden agregarse funcionalidad est´a creciendo con el correr del tiempo, a medida que ´estos aumentan en eficiencia o popularidad, y a medida queRcrece como utilidad para el usuario.

Una amplia colecci´on de librer´ıas se encuentran enCRAN6(Comprehensive R Archive Network),

una red de sitios que cuentan con id´entico contenido (mirrors), tanto de c´odigo como de docu-mentaci´on y de archivos binarios, y que mantienen la informaci´on que rodea a R actualizada y a disposici´on de toda la comunidad. En CRAN se mantienen, tambi´en, una lista de correo electr´onico y un sistema de seguimientos de bugs.

R se utiliza mucho en la investigaci´on biom´edica, la bioinform´atica y la matem´atica financiera. Los proyectos m´as conocidos basados enR sonBioconductor7, destinado al an´alisis de datos en

(16)

Cap´ıtulo 2. R 7

gen´etica y biolog´ıa molecular, y Rmetrics8, dedicado al an´alisis de t´ecnicas de mercadotecnia y

evaluaci´on de instrumentos financieros.

R se distribuye bajo la licencia GNU GPL y est´a disponible para la mayor´ıa de los sistemas operativos existentes (incluidas excentricidades como adaptaciones para funcionar en la consola

PlayStation2 y otras)

R tiene su propio formato de documentaci´on, similar al reconocido LATEX. Esta documentaci´on

es obligatoria para la aceptaci´on de paquetes en CRAN, lo que hace que los agregados tengan la chance de ofrecer documentaci´on comprensible en varios formatos.

La distribuci´on deRcuenta con muchos procedimientos con fines estad´ısticos, entre los que se en-cuentran: modelos lineales y generalizados, modelos de regresi´on no lineales y an´alisis de tiempos de series, asi como tambi´en funcionalidad de gr´aficos y representaciones de datos. Es relativa-mente sencillo agregar nuevas utilidades, mediante lo que se denominan “add-on”s, m´odulos de prop´ositos espec´ıficos.

2.3.

Interfaz contra lenguajes compilados

R nos ofrece la posibilidad de acceder a c´odigo compilado que haya sido linkeado previamente. Este link se puede realizar en tiempo de creaci´on del m´odulo o bien din´amicamente mediante la funci´ondyn.load. A trav´es de la funci´on.C se genera una interfaz a c´odigo compilado enC

o C+ +. Los argumentos que se le pasan a esta funci´on son generalmente copiados antes de la ejecuci´on del c´odigo, y tambi´en son copiados a una lista de argumentos enRcuando la funci´on a la cual accedemos ha retornado su valor. Los argumentos pueden pasarse con nombre, de forma tal de tener un f´acil acceso a ellos en su posterior manejo.R tiene un mecanismo de pasajes de par´ametros por defecto que transforma cada tipo del c´odigo en un tipo del c´odigoC. La lista de tipos para los cualesRconoce mecanismos de transformaci´on es acotada, pero puede extenderse, en caso de requerirse, de una manera sencilla. Para este ´ultimo caso, es preferible el uso de otras funciones de ejecuci´on de c´odigo compilado. La funci´on.Call es la que se utiliza generalmente, y que da un mecanismo para pasar directamente a C algunos tipos m´as complejos de R como las listas. En el caso del lenguaje C, de inter´es para este trabajo, podemos ver en la siguiente tabla la tranformaci´on que sufren los principales modos de almacenamiento:

Mapeo de tipos

R C

logical int∗

integer int∗

double double∗

complex Rcomplex∗

character char∗ ∗

raw char∗

8

(17)

Cap´ıtulo 2. R 8

Contype∗ se denota al puntero atype, es decir, la direcci´on de memoria de una variable de tipo

type.Rcomplex se refiere a una estructura enC incluida en los archivos de cabecera que provee el lenguajeR.

2.4.

R

puro vs. interfaz

C

La facilidad que presentaRde escribiradd−ons en otros lenguajes (nombrados de forma breve anteriormente) se enfrenta con las ventajas que encuentran algunos desarrolladores de basar sus m´odulos sin la intervenci´on expl´ıcita de otros lenguajes. La mayor parte de las librer´ıas deR

est´an escritas enC, por la indiscutible eficiencia de este lenguaje.

Existe una forma de generar un an´alisis estad´ıstico de un script en R que muestre el uso de procesador y el porcentaje de tiempo de ejecuci´on que cada parte del script ha utilizado. Lo anterior es mucho m´as f´acil de decir en ingl´es, para lo cual tenemos una palabra que lo expresa:

profiling.

Para hacer profiling en R puede llamarse a la funci´onRprof, entre cuyos argumentos se encuen-tran el tiempo (medido en segundos) a esperar para hacer un muestreo del stack del proceso (en general, este n´umero debe ser cercano a 15/20 milisegundos, ya que un n´umero menor har´ıa que el tiempo necesario para recolectar la informaci´on se vea superpuesto con la siguiente consulta al stack, y un n´umero mayor perjudicar´ıa la precisi´on del an´alisis), y el nombre del archivo en el cual (sobre)escribir la informaci´on recolectada. De esta manera, si bien el script que se est´a corriendo baja un poco su performance, es posible identificar las partes en que la ejecuci´on ha invertido m´as o menos tiempo. Los mecanismos que se usan para el profiling son los mismos que usa el lenguaje C, con lo que estas herramientas no pueden usarse conjuntamente.

Los test para Windows y sistemas operativos UNIX puede que arrojen resultados distintos, puesto que el intervalo fijo que se establece para el muestreo del stack corresponde a uso del tiempo delCPU enUNIX, y simplemente tiempo nominal enWindows. Sin embargo, ante igual carga de CPU, los resultados no deber´ıan variar para los distintos sistemas operativos.

La funci´on Rprof consulta el estado de la ejecuci´on peri´odicamente y escribe en el archivo indicado el estado encontrado. El archivo generado puede tratarse de varias formas. Entre las que nos ofrece la distribuci´on deR se encuentran:

Mediante un script enPerl (comando deR) llamado tambi´enRprof.

Una funci´on del lenguaje llamadasummaryRprof que devuelve un objeto enRque puede ser analizado.

(18)

Cap´ıtulo 2. R 9

La bibliograf´ıa consultada es redundante en cuanto a la mayor eficiencia de las implementaciones en c´odigo compilado en C contra las implementaciones puras en el lenguaje R. Sin embargo, parte de nuestro inter´es era comparar cuantitativamente estas diferencias para algunos casos de nuestro proyecto, de forma tal de tomar una decisi´on al respecto basada en la aplicaci´on directa de nuestras implementaciones.

Para ello, codificamos una selecci´on de algoritmos tanto con acceso a c´odigo C como sin ´el (y aqu´ı hablamos de “sin acceso expl´ıcito”), para realizar luego un an´alisis con la herramienta anteriormente mencionada.

A continuaci´on se muestran los resultados obtenidos para un algoritmo de Look-up tables (de-crementar contraste, funci´on imgDecreaseContrast), que se detallan en 7.1.1, y, para uno de operaciones aritm´eticas (diferencia de im´agenes, funci´onimgDiffer), detallados en 7.2. El resto de los resultados pueden encontrarse en el Ap´endice A:

r _ d e c _ c o n t r a s t vs . i m g D e c r e a s e C o n t r a s t E a c h s a m p l e r e p r e s e n t s 0 . 1 5 s e c o n d s . T o t a l run t i m e : 1 9 7 7 . 9 0 0 0 0 0 0 0 0 4 7 s e c o n d s .

T o t a l s e c o n d s : t i m e s p e n t in f u n c t i o n and c a l l e e s . S e l f s e c o n d s : t i m e s p e n t in f u n c t i o n a l o n e .

% t o t a l % s e l f

t o t a l s e c o n d s s e l f s e c o n d s n a m e

9 9 . 7 9 1 9 7 3 . 7 0 0 . 0 0 0 . 0 0 " r _ d e c _ c o n t r a s t " 9 9 . 7 8 1 9 7 3 . 5 5 4 8 . 4 0 9 5 7 . 3 0 " r _ l o o k _ u p _ t a b l e " ...

0 . 2 1 4 . 2 0 0 . 0 0 0 . 0 0 " i m g D e c r e a s e C o n t r a s t " 0 . 2 1 4 . 2 0 0 . 0 0 0 . 0 0 " . i m g C o n t r a s t " ...

0 . 0 6 1 . 2 0 0 . 0 6 1 . 2 0 " . C " ...

% s e l f % t o t a l

s e l f s e c o n d s t o t a l s e c o n d s n a m e

4 8 . 4 0 9 5 7 . 3 0 9 9 . 7 8 1 9 7 3 . 5 5 " r _ l o o k _ u p _ t a b l e " ...

0 . 0 6 1 . 2 0 0 . 0 6 1 . 2 0 " . C " 0 . 0 5 0 . 9 0 0 . 0 5 0 . 9 0 " as . v e c t o r " ...

r _ i m g D i f f e r vs . i m g D i f f e r

E a c h s a m p l e r e p r e s e n t s 0 . 1 5 s e c o n d s . T o t a l run t i m e : 3 5 9 2 . 5 0 0 0 0 0 0 0 1 4 5 s e c o n d s .

T o t a l s e c o n d s : t i m e s p e n t in f u n c t i o n and c a l l e e s . S e l f s e c o n d s : t i m e s p e n t in f u n c t i o n a l o n e .

% t o t a l % s e l f

t o t a l s e c o n d s s e l f s e c o n d s n a m e

9 9 . 6 1 3 5 7 8 . 4 0 5 3 . 4 7 1 9 2 0 . 9 0 " r _ i m g D i f f e r " ...

0 . 3 9 1 4 . 1 0 0 . 0 0 0 . 0 0 " . i m g A r i t h m e t i c O p e r a t o r " 0 . 3 9 1 4 . 1 0 0 . 0 0 0 . 0 0 " i m g D i f f e r "

0 . 2 9 1 0 . 3 5 0 . 2 9 1 0 . 3 5 " . C " ...

% s e l f % t o t a l

(19)

Cap´ıtulo 2. R 10

5 3 . 4 7 1 9 2 0 . 9 0 9 9 . 6 1 3 5 7 8 . 4 0 " r _ i m g D i f f e r " ...

0 . 2 9 1 0 . 3 5 0 . 2 9 1 0 . 3 5 " . C " 0 . 2 5 9 . 0 0 0 . 2 5 9 . 0 0 " : " ...

En el primero de los listados de estos resultados se encuentran las funciones llamadas en la ejecuci´on, ordenadas por el porcentaje de tiempo ocupado dentro de cada una (y de aquellas a las cuales ha llamado). El segundo listado corresponde al orden seg´un el porcentaje del tiempo ocupado s´olo por la funci´on (y no por las llamadas anidadas).

Notamos para el caso de la funci´on de decrementar contraste (r dec contrastvs.imgDecreaseContrast) que la relaci´on de uso de CPU fue de aproximadamente 475 a 1 (475.1904) y para la funci´on de diferencia de im´agenes (r imgDiffer vs.imgDiffer) fue de 255 (255.4102) a 1, en ambos casos a favor de las implementaciones con acceso a c´odigo C.

No resta demasiado an´alisis por hacer. Lo que valdr´ıa preguntarse es el por qu´e de semejante diferencia. La respuesta puede buscarse de entre las siguientes justificaciones:

Lo principal es recordar que C es un lenguaje compilado y R uno interpretado, con lo que hay una capa de abstracci´on (al menos) de diferencia. Adem´as, muchas de las optimi-zaciones a c´odigo fuente que hacen los c´odigos compilados se pierden para el caso de los interpretados.

Las funciones de acceso a algunas estructuras de datos en R verifican ciertas condiciones (como la validez del lugar de memoria a acceder), lo cual hace que las estructuras de R subyacentes (implementadas enC) sean m´as complejas y tengan chequeos que no nos eran necesarios realizar en nuestro c´odigo C (esto hace a R un lenguaje m´as robusto que C, pagando el precio de la eficiencia).

El uso, en algunos casos, de funciones no del todo adecuadas pero que se pegaban m´as a las especificaciones de los algoritmos. Por caso, en las look-up tables, se usa una estructura de memoria contigua (tal como lo describen los algoritmos). Sin embargo, esta raz´on no es del todo v´alida: una evaluaci´on para estos casos (cambiando es uso de memoria contigua por las funcionesmapply y el uso de funciones en los par´ametros) arroj´o, para el caso de decrementar contraste, una relaci´on de 433.78 a 1. Es decir, del mismo orden de magnitud que las pruebas anteriores.

2.5.

Colaboraci´

on a CRAN

La colaboraci´on con la comunidadRpuede hacerse de diversas formas. Existen sistemas de bug-tracking, para el reporte y discusi´on de bugs, manejo de versiones, utilidades diversas como de testeo de nuevos paquetes, interfaz de int´erprete por web y un largo etc´etera. La comunidad

(20)

Cap´ıtulo 2. R 11

CRAN (explicado brevemente en la secci´on anterior) recibe las colaboraciones de paquetes. Antes de subir un paquete nuevo, es necesario seguir ciertos pasos que garanticen su funcionabilidad y documentaci´on, entre otras cosas. El grupo de desarrollo deR ha creado un comando a tal fin:

check. Este comando verifica que el paquete pueda instalarse, que los ejemplos corran y que la documentaci´on con la cual debe liberarse exista, est´e completa y pueda ser procesada por los formateadores (la documentaci´on de un paquete se crea en los formatos de texto plano,HTML

(21)

Cap´ıtulo 3

Z

Las especificaciones pueden ser provechosas en muchos sentidos: describen propiedades sin in-miscuirse en implementaciones, son referencia constante para todos los individuos involucrados de una u otra forma en el proceso de creaci´on de software (investigadores, codificadores, testers, documentadores, clientes, etc.) y forman la estructura b´asica para la etapa de codificaci´on. La matem´atica ha ayudado a formalizar estos conceptos a trav´es del concepto de tipos.

Z es el nombre de la notaci´on que utilizamos para la especificaci´on de nuestro trabajo. En este cap´ıtulo se presentan las notaciones b´asicas y definiciones de objetos necesarios para compren-derla. Ellos son: definiciones, abreviaciones, definiciones axiom´aticas, definiciones gen´ericas y esquemas.

Z es un lenguaje tipado, lo que permite la creaci´on de algoritmos para la verificaci´on autom´atica de tipos y ´ambito de variables. Entre todas las herramientas disponibles a tal fin, elegimos

f

uzz para este trabajo, por tener una notaci´on simple y adaptaciones para su impresi´on en formatos como LATEX.

Al disponer s´olo del tipo de los n´umeros enteros (caracter´ıstica de Z), vimos la necesidad de definir el tipo que represente los n´umeros reales (y varios de sus subconjuntos), de modo de clarificar notaciones y hacer nuestras especificaciones de lectura natural e intuitiva. Para ello nos basamos en una publicaci´on de R. D. Arthan que axiomatiza este conjunto de forma precisa.

Con esta extensi´on fue posible definir nuestro esquema de representaci´on de una imagen y a partir de all´ı modelar los algoritmos que componen este trabajo, y que ser´an tratados en los sucesivos cap´ıtulos.

3.1.

Las especificaciones formales

Las especificaciones formales usan la notaci´on matem´atica para describir de una forma precisa las propiedades que debe tener un sistema de informaci´on, sin restringir excesivamente la forma en que estas propiedades son alcanzadas. Describen qu´e debe hacer el sistema sin decir c´omo debe

(22)

Cap´ıtulo 3. Z 13

hacerlo. Esta abstracci´on hace de la especificaci´on formal una herramienta ´util en el proceso de desarrollo de sistemas de computaci´on, porque permiten que las preguntas acerca de lo que hace el sistema puedan ser respondidas de una manera confiable, sin la necesidad de desenmara˜nar la informaci´on de una masa de c´odigo detallada, o especular acerca del significado de frases en una descripci´on en prosa imprecisa.

Una especificaci´on formal puede servir como un punto de referencia simple y confiable para quienes investiguen las necesidades de los clientes, para quienes implementen los programas para satisfacer esas necesidades, para aquellos que testeen los resultados y para aquellos que escriban la documentaci´on del sistema. En definitiva, es una herramienta que puede ser ´util para todos los integrantes del proceso de desarrollo.

Al ser independiente del c´odigo del programa, la especificaci´on formal de un sistema puede ser realizada en las primeras etapas del proceso de desarrollo. A´un cuando cambie a medida que se gane en comprensi´on del problema y percepci´on de la evoluci´on de las necesidades del cliente, puede ser una media apreciable para promover un entendimiento com´un entre todos los roles involucrados en el sistema.

Una forma en que la notaci´on matem´atica puede ayudar a alcanzar estos objetivos es a trav´es del modelo de tipos de datos matem´aticos del sistema. Estos tipos de datos no est´an orientados a la representaci´on computacional, pero responden a un conjunto de leyes que hacen posible sacar conclusiones efectivas acerca del comportamiento que tendr´a un sistema especificado.

3.2.

El lenguaje de especificaci´

on Z

Z es un lenguaje de especificaci´on que trabaja a altos niveles de abstracci´on. Esto permite que a´un comportamientos complejos puedan ser descriptos precisa y consisamente. Originalmente propuesto por Jean-Raymond Abrial en 1977 con la ayuda de Steve Schuman y Bertrand Meyer, fue desarrollado por el grupo de Investigaci´on de Programaci´on de la Universidad de Oxford. Ha sido sometido en los ´ultimos a˜nos a estandarizaci´on de la Organizacion Internacional de Estandarizaci´on (ISO).

La sem´antica deZes matem´atica; de esta manera las f´ormulas pueden ser manipuladas algebraica y l´ogicamente.

En Z usamos la notaci´on de predicados l´ogicos para describir abstractamente el efecto de cada operaci´on del sistema, de una forma que permite sacar conclusiones y hacer an´alisis acerca de su comportamiento.

La notaci´on est´a basada en teor´ıa de conjuntos y l´ogica matem´atica. La teor´ıa de conjuntos usada incluye operadores de conjunto b´asicos y por comprensi´on, productos cartesianos y partes de conjuntos. La l´ogica matem´atica es un c´alculo de predicados de primer orden. Juntos, forman un lenguaje matem´atico que es f´acil de entender y, sobre todo, de llevar a la pr´actica.

Otro aspecto es c´omo se puede estructurar este lenguaje. EnZ esto se responde con el concepto de

(23)

Cap´ıtulo 3. Z 14

para describir el estado del sistema, y las formas en que este estado puede cambiar. Tambi´en puede describir propiedades del sistema y ayudar a pensar acerca de posibles refinamientos del dise˜no.

Los esquemas se utilizan para describir aspectos din´amicos y est´aticos. Estos ´ultimos incluyen:

los estados que ocupa; y

las relaciones invariantes que son mantenidas en el movimiento de estado a estado en el sistema

Los aspectos din´amicos incluyen:

las operaciones posibles;

la relaci´on entre las entradas y las salidas; y

los cambios de estados que pueden ocurrir

Una de las caracter´ısticas principales deZ es el uso de tipos. Adem´as de ser esto un enlace de extrema utilidad para el momento de la codificaci´on, puede ser sujeto de chequeos autom´aticos. Existen varias herramientas a tal fin, entre las que se encuentra

f

uzz, la cual describiremos brevemente m´as adelante (secci´on 3.4).

Otro aspecto es el uso del lenguaje natural: usamos el lenguaje matem´atico para determinar el problema y eventualmente encontrar soluciones, e incluso para probar que los dise˜nos cumplen con la especificaci´on. El uso del lenguaje natural relaciona la matem´atica con los objetos de la vida real, y es esencial para hacer que las especificaciones sean realmente obvias para el lector.

3.3.

Definiciones en

Z

A modo introductivo presentamos algunos de los conceptos sobre los cuales se basa el lenguaje de especificaci´onZ, que ser´an de utilidad para la comprensi´on de las especificaciones del trabajo.

3.3.1.

Declaraciones

Es la forma m´as simple de declarar un objeto en Z. Se utiliza en especial para tipos b´asicos o conjuntos dados. Se denotan por una declaraci´on del nombre entre corchetes:

[A]

(24)

Cap´ıtulo 3. Z 15

0:A

3.3.2.

Abreviaciones

Es la manera en que se puede definir un objeto a partir de otros existentes, cuando sus objetos y estados son iguales:

VALUE ==MinValue. .MaxValue

3.3.3.

Definiciones axiom´

aticas

Se pueden introducir objetos con restricciones, como las que deben asumirse cuando un s´ımbolo es usado. Estas restricciones se interpretan como axiomas del objeto:

declaracion predicado

dondepredicadosimboliza las restricciones del objeto u objetos declarados endeclaracion.

Por ejemplo:

TopValue:N

TopValue=MaxValue+1

Introduce un nuevo s´ımbolo, TopValue, que satisface el predicado que se menciona. Como en este ejemplo, las declaraciones pueden restringirse hasta el punto que se denote s´olo un objeto.

3.3.4.

Definiciones gen´

ericas

Se utilizan para definir una familia de constantes globales, parametrizadas por alg´un conjunto:

[Y]

y :Y

(25)

Cap´ıtulo 3. Z 16

introduce una constante gen´erica de tipo Y, satisfaciendo el predicado predicado. Notar que Y es, en este caso, un par´ametro formal: puede considerarse como un tipo b´asico con visibilidad en esta definici´on gen´erica.

A modo de ejemplo, tenemos la definici´on utilizada en el trabajo para obtener el largo de una secuencia:

[X]

# : seqX "N

#hi=0

∀i: seqX |i6=hi •#i=1+ # (tail i)

3.3.5.

Esquemas

Adem´as del lenguaje matem´atico, enZ tenemos el lenguaje de esquemas, usado principalmente para rejuntar partes de informaci´on, encapsularlas y nombrarlas para su futura reutilizaci´on. Este ´

ultimo aspecto es de vital importancia para las t´ecnicas formales: con ello podemos mantener nuestras descripciones flexibles y manejables.

La forma general de los esquemas es esta:

NombreDeEsquema declaraciones predicados

A modo de ejemplo, nuestro esquema para representar una imagen:

Image v :VALUES width,height :N

dom v={a:N ×N |0≤first a<width∧0≤second a<height}

3.4.

f

uzz

f

uzz es un conjunto de herramientas de formateo e impresi´on de especificaciones en Z, y al-goritmos para verificaciones de alcance y reglas de tipos conforme a la especificaci´on de este lenguaje.

Entre las herramientas de formateo se incluyen archivos de estilo para LATEX, y la definici´on

(26)

Cap´ıtulo 3. Z 17

axdef,gendef yschema, respectivamente para texto en prosa y fuera de estructuras, definicio-nes axiom´aticas, definiciones gen´ericas y esquemas. Existen otros entornos disponibles que no mencionaremos en este breve resumen.

Para este trabajo hicimos uso de sus dos funcionalidades principales. En la impresi´on actual se utilizaron las herramientas que permiten que los diagramas y s´ımbolos especiales puedan verse correctamente y mezclarse con texto en prosa, como es caracter´ıstico en muchos formatos de especificaci´on. Y para la diagramaci´on del c´odigoZ para los algoritmos implementados, hicimos uso del chequeador de tipos y alcance de variables, lo cual es m´ınimamente necesario en cualquier chequeo de especificaciones.

El comando

f

uzzpuede configurarse para tener dos tipos de salida: con la opci´on−v obtenemos un reporte en c´odigo ASCII de una representaci´on de cada p´arrafo enZ; y con la opci´on−t se listan el tipo de cada nombre definido globalmente, en una representaci´on f´acil de leer. Adem´as, los esquemas son expandidos, para que resulte claro ver qu´e componente tiene cada uno. La salida de esta ´ultima opci´on se incluye en formato digital con este trabajo (tal como se describe en la secci´on 6.6).

3.5.

Especificaci´

on en

Z

3.5.1.

Especificaci´

on de reales

En la especificaci´on de software generalmente vienen incluidas ciertas nociones de tipos. EnZ, esta noci´on es muy acotada: un tipo es un conjunto maximal, al menos para los l´ımites de la especificaci´on en cuesti´on. Esto trae como consecuencia que cada valor x en una especificaci´on est´e asociado exactamente a un tipo: el conjunto m´as grandes para el cual x ∈s.

La notaci´onZ tiene un solo tipobuilt−in (esto es, propio de la notaci´on): el conjunto de todos los enterosZ. Cualquier otro tipo puede construirse a base de ´este, o de valores de tipos b´asicos (sobre los cuales no pueden asumirse ninguna propiedad).

Muchos de los algoritmos que presentamos en nuestra implementaci´on requieren de una precisi´on que los enteros no nos brindan de forma natural. Es f´acil determinar una biyecci´on entre los n´umeros enteros y los reales de precisi´on acotada, pero el manejo de los mismos se torna tedioso y la representaci´on no obedece a las costumbres sobre el manejo de valores que arrastramos en la educaci´on que recibimos. Por esta raz´on, y por la estructura de im´agenes que creimos conveniente utilizar (aunque esta estructura y la representaci´on de valores est´an ´ıntimamente relacionadas) y que mencionaremos en esta secci´on, es que necesitamos la especificaci´on de un tipo que represente m´as fidelignamente a los reales.

Para tal fin nos basamos en la publicaci´on de [Art96], “Arithmetics for Z”, la cual est´a fuertemen-te inspirada en el est´andar [Dep95]. La especificaci´on que realizamos incluye la axiomatizaci´on necesaria para definir el conjunto de los n´umeros reales y sus operaciones b´asicas (de acuerdo a lo que nos resultaba excluyente disponer).

(27)

Cap´ıtulo 3. Z 18

1. Los reales forman un campo

2. El campo de los reales puede ordenarse linealmente de forma que este orden sea compatible con la suma y la multiplicaci´on. Para definir dicho orden es suficiente con encontrar un conjunto R, cerrado por multiplicaci´on y suma, tales que Rp, Rn y {0} conformen una

partici´on del campo.

3. Cualquier subconjunto no vac´ıo de los reales, acotado inferiormente con respecto al orden establecido en el punto anterior, tiene una cota inferior maximal.

Estas propiedades caracterizan a los reales (o cualquier isomorfismo) y una consecuencia de ello es la existencia de un anillo incluido en este conjunto, que es isomorfo a los enteros.

Esta axiomatizaci´on es similar a las vistas en los libros de c´alculo. Comenzamos con un conjunto maximal, que llamamosA

[A]

A partir de ´el, definimos el conjuntoZ (el cual “redefinimos”),

Z :A

y dos de sus elementos:

0:A 1:A

El resto de operaciones y axiomas se detallan a continuaci´on:

+ :A×AA

:AA

N :Z

(Z×Z)( + )∈Z×Z "Z Z (∼)∈Z "Z

{0,1} ⊆Z

∀i,j,k:Z •(i+j) +k =i+ (j +k)

∧i+j =j+i

∧i+∼i =0

∧i+0=i

∀h:Z •1∈h∧(∀i,j:h•i+j∈h∧∼ih)h=Z

N =T{s :Z |0s∧ {i:si+1} ⊆s}

(28)

Cap´ıtulo 3. Z 19

− :A×AA

(Z×Z)( − )∈Z×Z "Z

∀i,j :Z •i−j =i+ (∼j)

≤ , < , ≥ , > :A#A

∀i,j :Z •(i≤j ⇔j−i∈N)

∧(i<j ⇔i+1≤j)

∧(i≥j ⇔j≤i)

∧(i>j ⇔j<i)

∗ :A×AA

(Z×Z)( ∗ )∈Z×Z "Z

∀i,j,k:Z •(i∗j)∗k=i∗(j∗k)

∧i∗j =j∗i

∧i∗(j+k) =i∗j+i∗k

∧1∗i=i

div , mod :A×AA

(Z×Z \ {0})( div )∈Z×Z"Z

(Z×Z \ {0})( mod )∈Z×Z"Z

∀i:Z • ∀j :Z \ {0} •i= (i div j)∗j+i mod j

∧(0≤i mod j<j∨0≥i mod j>j)

R:1A

/ :A×AA

(R×R)( + )∈R×R"R

(R×R)( ∗ )∈R×R"R

(R×R\ {0})( / )∈R×R\ {0}"R

R(∼)∈R"R Z ⊆R

∀x,y,z :R•(x+y) +z =x+ (y+z)

∧x+y =y+x

∧x+∼x =0

∧x+0=x

∀x,y,z :R•(x∗y)∗z =x∗(y∗z)

∧x∗y=y∗x

∧x∗(y+z) =x∗y+x∗z

∧1∗x=x

(29)

Cap´ıtulo 3. Z 20

Rp,Rn:1A

(Rp×Rp)( + )∈Rp×Rp"Rp

(Rp×Rp)( ∗ )∈Rp×Rp"Rp Rn= (∼)Rp

Rn∩Rp=

R=Rn∪ {0} ∪Rp

∀x,y :R•x≤y ⇔y+∼x ∈Rp∪ {0}

Con esta “creaci´on” del tipoR, muchas de las operaciones sobre im´agenes que fueron especificadas (y que se mostrar´an pertinentemente, a medida que lo consideremos necesario) resultaron m´as claras e intuitivas.

3.5.2.

Resto de las especificaciones

A partir de nuestro esquema de imagen

Image v :VALUES width,height :N

dom v={a:N ×N |0≤first a<width∧0≤second a<height}

se especificaron las operaciones sobre im´agenes que corresponden al presente trabajo. Las mismas se presentar´an en las secciones particulares de los algoritmos, cuando creamos necesario hacer alguna aclaraci´on. De todas formas, los archivos correspondientes a estas descripciones pueden encontrarse en formato digital, con el material que acompa˜na este impreso (ver secci´on 6.6 para m´as detalles).

(30)

Cap´ıtulo 4

Imagen digital

Cuando se captura una imagen del mundo real a trav´es de una computadora, la continuidad de tama˜no, intensidad y colores es truncada. La combinaci´on de caracter´ısticas f´ısicas continuas que nuestra mente se encarga de manejar deben ser convertidas en n´umeros finitos para ser utilizados por una computadora. Esa visi´on continua debe ser discretizada para obtener una imagen digital. En esa conversi´on se determinan la resoluci´on espacial y la profundidad de color.

La representaci´on de im´agenes color se basa en los denominados espacios de color, modelos matem´aticos para especificar los colores. La mayor´ıa de estos modelos en uso est´an orientados o bien hacia el hardware o bien hacia aplicaciones en que la manipulaci´on de los colores es el principal objetivo.

4.1.

Representaci´

on

Una imagen se puede definir como una funci´on de dos dimensiones, f(x,y), donde x, y son coordenadas espaciales, en el plano, y la amplitud def en cualquier par de coordenadas (x,y) se llama intensidad de la imagen en ese punto. La denominaci´onescala de grises se usa para referirse a la intensidad en im´agenes monocrom´aticas. Las im´agenes en color est´an formadas por la combinaci´on de im´agenes 2-D. Por ejemplo, en el sistema de color RGB (red, green, blue), una imagen consiste de tres im´agenes componentes individuales (rojo, verde, azul). Por esta raz´on, muchas de las t´ecnicas desarrolladas para im´agenes monocrom´aticas se pueden extender a im´agenes color mediante el procesamiento de cada una de las componentes individuales. En general hablaremos en t´erminos de im´agenes en escala de grises, haciendo las aclaraciones y distinciones para extender a im´agenes color cuando sea necesario.

Una imagen puede ser continua respecto a los ejes de coordenadas, como as´ı tambi´en en am-plitud. Convertir dicha imagen a formato digital requiere que tanto las coordenadas como la intensidad sean digitalizadas. El proceso de digitalizar las coordenadas se llamasampling (mues-treo), mientras que el de digitalizar la amplitud se llama quantization. De esta manera, cuando

x,y, y la amplitud de f son valores finitos y discretos tenemos una imagen digital.

(31)

Cap´ıtulo 4. Imagen digital 22

El resultado de sampling y quantization es una matriz de n´umeros reales. Asumiendo quef(x,y) es muestreada a una imagen que tieneM filas yN columnas, decimos que la imagen tiene tama˜no

M×N. El origen de la imagen lo definimos en (x,y) = (0,0). La siguiente coordenada a lo largo de la primera fila es (x,y) = (0,1). Es decir, que de acuerdo con la notaci´on de matrices, el eje vertical,y, recorre la imagen de arriba hacia abajo. El eje horizontal,x, la recorre de izquierda a derecha. De esta manera podemos representar nuestra imagen digital como una matrizM ×N:

Figura 4.1:Matriz imagen

El lado derecho de la igualdad es por definici´on una imagen digital. Cada elemento de esta matriz se llamapixel (picture element). Usaremos los t´erminos imagen y pixel de aqu´ı en adelante para denotar una imagen digital y sus elementos, respectivamente.

En el proceso de digitalizaci´on se deben tomar decisiones sobre los valores de M, N, y para el n´umeroL de niveles de gris permitidos para cada pixel. No hay restricciones sobre M yN, s´olo que deben ser enteros positivos. Sin embargo, debido al tipo de procesos, almacenamiento y hardware de sampling, el n´umero de niveles de gris es en general un entero potencia de 2:L= 2k.

Se asume tambi´en que estos niveles son equidistantes y que son enteros en el intervalo [0,L−1].

4.2.

Resoluci´

on espacial y de profundidad

El sampling determina laresoluci´on espacial de una imagen. La resoluci´on espacial define el me-nor detalle discernible en una imagen. Supongamos que tenemos un cuadro con l´ıneas verticales de ancho W, con un espacio entre estas l´ıneas tambi´en de ancho W. Un par consiste de una l´ınea y el correspondiente espacio adyacente. Entonces el ancho de un par es 2W, y hay 1/2W

pares por unidad de distancia. Una definici´on deresoluci´on es simplemente el menor n´umero de pares discernibles por unidad de distancia; por ejemplo, 100 pares por mil´ımetro.

Hay que tener en cuenta que cada pixel no representa s´olo un punto en la imagen, sino una regi´on rectangular. De esta forma, con pixels grandes no s´olo la resoluci´on espacial es baja, sino que el valor del nivel de gris correspondiente hace aparecer discontinuidades en los bordes de los pixels. A medida que los pixels se hacen m´as peque˜nos, el efecto se hace menos pronunciado, hasta el punto en que se tiene la sensaci´on de una imagen continua. Esto sucede cuando el tama˜no de los pixels es menor que la resoluci´on espacial de nuestro sistema visual. Para una tarea dada el tama˜no de pixel deber´ıa ser lo suficientemente peque˜no de acuerdo a los objetos que queramos estudiar de la imagen.

(32)

Cap´ıtulo 4. Imagen digital 23

ha dicho, principalmente debido a restricciones de hardware, en general el n´umero de niveles de gris es un entero potencia de 2, com´unmente 8 bits, aunque algunas aplicaciones que requieren mucha precisi´on en este sentido pueden llevarlo a 16.

4.3.

Modelos de color

Lo que los humanos percibimos como color es una combinaci´on de caracter´ısticas f´ısicas. Un

modelo(o espacio)de colores una representaci´on matem´atica de esas caracter´ısticas. El objetivo es tambi´en facilitar la especificaci´on de colores mediante alguna forma est´andar y aceptada. En esencia se tratan de sistemas de coordenadas y subespacios en que cada color se representa por un ´unico punto.

Brevemente repasaremos estos distintos esquemas. Si bien la mayor´ıa de los procesos con im´ age-nes digitales trabajan en RGB, muchas aplicacioage-nes requieren la conversi´on a otros espacios de color.

4.3.1.

RGB

Todos los espacios de color son sistemas ortogonales tridimensionales de coordenadas, es decir que los tres ejes (en este caso las intensidades de rojo, verde y azul) son perpendiculares entre s´ı. La intensidad del rojo empieza en cero y se incrementa en uno de los ejes. An´alogamente para el verde y el azul en sus correspondientes ejes. Asumiendo 8 bits de profundidad, cada color puede tener un valor m´aximo de 255, dando como resultado una estructura c´ubica. La escala de grises (puntos de valores RGB iguales) se extiende desde el negro hasta el blanco, a lo largo de la diagonal que une estos dos puntos.

(33)

Cap´ıtulo 4. Imagen digital 24

De esta manera tenemos un modelo matem´atico que nos permite definir cualquier color dando sus valores de rojo, verde y azul, es decir coordenadas en el cubo. El RGB es un espacio de color aditivo, porque su origen est´a en el negro y cualquier otro color se deriva sumando valores de intensidad. Es el modelo usado en la pr´actica para los monitores color y muchas c´amaras de video.

4.3.2.

CYM

Este espacio de color es el inverso exacto del RGB. En este caso, el origen es blanco y los ejes primarios son cyan, amarillo y magenta. As´ı, el color rojo es una combinaci´on de amarillo y magenta, el verde de amarillo y cyan, y el azul de cyan y magenta. A continuaci´on se detallan las ecuaciones que permiten pasar de un sistema a otro:

c=max−r m =max−g y=max−b r =max−c g =max−m b=max−y

(max es el valor m´aximo de intensidad)

Si se muestra una imagen en CYM como si fuera RGB veremos una imagen con sus colores invertidos o negativos. El CYM se usa principalmente en la industria de la impresi´on, donde las im´agenes empiezan sobre un papel blanco y la tinta se aplica para obtener los colores. Se han desarrollado t´ecnicas para obtener im´agenes de mayor calidad y a un menor costo. Uno de estos avances es el llamado “under color removal” que modifica CYM en CYMK, donde la K representa al negro.

Este proceso, sabiendo que todo color tiene un gris subyacente, es decir una misma cantidad de cyan, magenta y amarillo, genera esa componente con tinta negra (m´as barata) y utiliza menor cantidad de tinta de color para lograr el tono correcto.

4.3.3.

HSI

La visi´on humana tiende a observar los colores de una forma diferente. No vemos las cosas como una mezcla de colores primarios en una proporci´on particular, sino comotonos (hue),saturaci´on

(saturation) e intensidad (intensity). Todav´ıa se trata de un espacio tridimensional, aunque bastante diferente del RGB o CYM.

En la imagen 4.3 vemos un eje que recorre el centro del cono, que representa la intensidad. Sobre este eje se encuentran todos los valores de gris, con el negro en el origen del cono y el blanco en la base. Cuanto mayor es la distancia sobre esta l´ınea al origen, la intensidad es mayor, m´as brillante.

(34)

Cap´ıtulo 4. Imagen digital 25

Figura 4.3: Modelo de color HSI

Lasaturaci´on, o riqueza de color, est´a definida como la distancia perpendicular al eje de intensi-dad. Los colores m´as cercanos al eje central tienen menor saturaci´on y se ven pastel. Los colores cercanos al borde del cono tienen mayor saturaci´on y son m´as marcados en apariencia. A veces es preferible modificar una imagen en HSI en lugar de RGB. Por ejemplo, si quisi´eramos cambiar el color amarillo de un auto a azul, pero sin afectar el brillo ni las sombras. Esto es relativamente sencillo en HSI. Basta cambiar el valor de tono, sin modificar la intensidad ni la saturaci´on.

4.4.

Nuestra implementaci´

on

Siguiendo el esquema visto hasta aqu´ı elegimos representar una imagen digital mediante una matriz. Nos inclinamos por usar matrices de R, de dos dimensiones si la imagen tiene un ´unico nivel de profundidad de color o tres dimensiones si se trata de im´agenes RGB, el espacio de color base del cual partimos. Sin embargo, esta decisi´on tambi´en afectar´ıa nuestra forma de trabajar en el lenguaje C.

Esta elecci´on significar´ıa manejar arreglos lineales en C con una distribuci´on particular de los datos, que es la forma en que R hace la conversi´on de matrices. Para hacer m´as comprensible el manejo de ´ındices sobre dicho arreglo se defini´o una macro que hace la traducci´on de coordenadas en la imagen a ´ındices en ese arreglo lineal.

Dada la siguiente matriz imagen

(r0,0,g0,0,b0,0) (r0,1,g0,1,b0,1) (r0,2,g0,2,b0,2) · · ·

(r1,0,g1,0,b1,0) (r1,1,g1,1,b1,1) (r1,2,g1,2,b1,2) · · ·

..

(35)

Cap´ıtulo 4. Imagen digital 26

el correspondiente arreglo lineal que se obtiene en C tras la traducci´on es:

r0,0 r1,0 . . . r0,1 r1,1 · · · g0,0 g1,0 · · · b0,0 b1,0 · · ·

Los formatos de imagen soportados sonjpeg, a trav´es de la librer´ıalibjpeg, ytiff, mediantelibtiff. A partir de ellas se desarrollaron las funciones para leer y escribir archivos de im´agenes. libjpeg es una librer´ıa escrita en C que implementa un codificador/decodificador JPEG. Es mantenida por elGrupo JPEG Independiente1. La versi´on actual es la 6b. Similarmente, libtiff2 es una librer´ıa

que permite leer y escribir archivos en formato TIFF. Actualmente la ´ultima versi´on estable es la 3.8.2. Ambas librer´ıas son libres, y se distribuyen tanto su c´odigo fuente como versiones binarias para distintas plataformas.

4.4.1.

Especificaci´

on

A lo largo del trabajo se explican las distintas t´ecnicas y filtros mediante especificaciones en el lenguaje Z. A continuaci´on se describen los esquemas que caracterizan a la representaci´on de imagen elegida.

Existen un valor m´ınimo y un valor m´aximo. Para el caso de im´agenes de 8 bits de profundidad, tendremosMinValue= 0 yMaxValue = 255.

MinValue,MaxValue :N

Los posibles valores para cada pixel oscilan en el intervalo determinado por el m´ınimo y m´aximo dados.

VALUE ==MinValue. .MaxValue

VALUES define el espacio que va de un par (que representa las coordenadas de la imagen) en unVALUE. Especifica el espacio de las matrices imagen.

VALUES == (N ×N VALUE)

El esquema estado de una imagen est´a dado por una matriz, y las dimensiones de alto y ancho. En este caso se trata de im´agenes con una sola componente de color.

Image v :VALUES width,height :N

dom v={a:N ×N |0≤first a<width∧0≤second a<height}

1http://www.ijg.org/

(36)

Cap´ıtulo 5

El procesamiento digital de

im´

agenes

La vista es el m´as avanzado de nuestros sentidos, tal es as´ı que las im´agenes tienen un papel importante en la percepci´on humana. Sin embargo, a diferencia del ser humano que est´a limitado a la banda visual del espectro electromagn´etico, las m´aquinas pueden cubrir distintas bandas, desde las ondas gamma hasta las de radio. Pueden trabajar con im´agenes generadas a partir de fuentes que los humanos no est´an acostumbrados a asociar con im´agenes: ultrasonido, visualiza-ci´on de modelos matem´aticos o visi´on por computadora, por citar algunos ejemplos. El campo del procesamiento digital de im´agenes se refiere al proceso de trabajar con im´agenes digitales mediante computadoras. Cubre una amplia gama de t´ecnicas, utilizadas en numerosas aplica-ciones: para mejorar o distorsionar una imagen, destacar ciertas caracter´ısticas, crear una nueva imagen desde otras o restaurar una imagen degradada (por transmisi´on, adquisici´on). Actual-mente puede ser llevada a cabo por cualquier persona con una computadora personal. De esta manera se observa el uso de t´ecnicas de procesamiento de im´agenes entre artistas, cient´ıficos y otros, a´un sin conocimientos espec´ıficos.

5.1.

Or´ıgenes

Una de las primeras aplicaciones de las im´agenes digitales fue en la industria de los peri´odicos, cuando se enviaban fotos a trav´es de un cable submarino entre Londres y Nueva York. De esta forma se redujo la transmisi´on de una foto a trav´es del Atl´antico, en 1920, de m´as de una semana a menos de tres horas. Un sistema de impresi´on especializado recib´ıa y reconstru´ıa las im´agenes codificadas enviadas a trav´es del cable. Algunos de los problemas iniciales fueron mejorar la calidad visual de estas im´agenes en funci´on los procedimientos de impresi´on y la distribuci´on de los niveles de intensidad.

Hasta ese momento tenemos ejemplos que involucran im´agenes digitales, pero que no pueden considerarse como ejemplos de procesamiento digital de im´agenes, ya que no hab´ıa computadoras

(37)

Cap´ıtulo 5. El procesamiento digital de im´agenes 28

en la generaci´on de las mismas. Entonces, la historia del procesamiento de im´agenes se encuentra ligada al desarrollo de las computadoras y la tecnolog´ıa asociada (almacenamiento, visualizaci´on, transmisi´on).

Las primeras computadoras suficientemente poderosas para ejecutar tareas significativas de pro-cesamiento de im´agenes aparecieron en la d´ecada del ’60. El nacimiento de lo que consideramos el procesamiento digital de im´agenes se puede remontar a la disponibilidad de esas m´aquinas y el desarrollo del programa espacial de ese per´ıodo. La combinaci´on de estos dos factores sac´o a la luz el potencial del campo de procesamiento de im´agenes. El uso de t´ecnicas con computadoras para mejorar im´agenes espaciales empez´o en elJet Propulsion Laboratory (California) en 1964, donde las im´agenes de la Luna transmitidas por elRanger 7 fueron procesadas por una compu-tadora para corregir diferentes distorsiones inherentes a la c´amara de televisi´on utilizada. Estas t´ecnicas constituyeron la base para nuevos m´etodos que se utilizar´ıan m´as tarde para mejorar y restaurar im´agenes de misiones posteriores.

En paralelo a las aplicaciones espaciales, las t´ecnicas de procesamiento digital de im´agenes se comenzaron a usar en medicina, observaciones remotas de la Tierra y astronom´ıa (1960-70). La invenci´on de la tomograf´ıa computada es uno de los hechos m´as importantes de la aplicaci´on del procesamiento de im´agenes en el diagn´ostico m´edico. Desde 1960 hasta nuestros d´ıas, el campo del procesamiento de im´agenes ha crecido de forma importante. Adem´as de su aplicaci´on en la medicina y las actividades espaciales, se ha extendido a m´ultiples ´areas. Se usan procedimien-tos por computadora para realzar el contraste o codificar los niveles de intensidad en colores para facilitar la interpretaci´on de im´agenes de rayos X y otros tipos utilizados en la industria, la medicina y la biolog´ıa. Los ge´ografos usan t´ecnicas similares para estudiar los patrones de contaminaci´on del aire e im´agenes satelitales.

Los procedimientos para mejorar y restaurar im´agenes se utilizan para procesar im´agenes de-gradadas de objetos irrecuperables o resultados experimentales demasiados costosos de repetir. En arqueolog´ıa, por ejemplo, se usan estos m´etodos para restaurar im´agenes con ruido que son el ´unico registro de art´ıculos raros, perdidos o da˜nados despu´es de ser fotografiados. En f´ısica y campos relacionados se usan t´ecnicas para procesar im´agenes de experimentos en ´areas ta-les como plasma de alta energ´ıa y microscop´ıa del electr´on. Y de la misma manera se pueden encontrar casos de aplicaci´on en astronom´ıa, biolog´ıa, medicina nuclear, defensa o en la industria.

(38)

Cap´ıtulo 5. El procesamiento digital de im´agenes 29

5.2.

Aplicaciones

El uso del procesamiento digital de im´agenes se ha ido extendiendo a distintas ´areas, y ha dejado de ser una actividad exclusiva de un grupo de cient´ıficos, para ir teniendo cada vez mayor impacto en nuestra vida cotidiana. A continuaci´on se describen algunas aplicaciones espec´ıficas.

5.2.1.

Astronom´ıa y exploraci´

on del espacio

Este campo ha sido desde el comienzo una de las ´areas m´as activas en el desarrollo de t´ecnicas y avances en el procesamiento digital de im´agenes. Debido a las se˜nales d´ebiles en la captura de im´agenes de los objetos celestes, se debieron desarrollar m´etodos para extraer informaci´on; es as´ı como surgen muchos de los filtros disponibles hoy: promedio de im´agenes, filtros de convolu-ci´on y transformadas de Fourier, por ejemplo.

Los sistemas de im´agenes dise˜nados en esta ´area, en general, atribuyen menor importancia al color, buscando el detalle. Es por eso que en gran medida se trabaja con im´agenes en escala de grises, aunque en algunos casos se a˜naden colores para resaltar determinada informaci´on.

5.2.2.

Inteligencia y aplicaci´

on militar

En este caso se utiliza como herramienta para la interpretaci´on de fotograf´ıas, con el objetivo de identificar ´areas de inter´es y extraer toda la informaci´on posible de la imagen. Puede ser en b´usqueda de instalaciones militares, facilidades para la investigaci´on, complejos industriales o estructuras residenciales. Una de las principales necesidades es la velocidad. Se hace zoom sobre determinadas zonas de una imagen, rotaciones para lograr una perspectiva particular, o puede ser necesario mejorar el contraste de la fotograf´ıa. Adicionalmente tambi´en se requiere hacer anotaciones sobre la imagen.

Otro uso en este campo es la combinaci´on de mapas digitalizados e im´agenes satelitales para el mejor conocimiento de una zona dada, sumado a la reconstrucci´on del terreno y animaciones, que permiten conocer las caracter´ısticas topogr´aficas del lugar.

5.2.3.

Ciencias de la tierra

Los ge´ologos pueden aprender mucho de im´agenes tomadas de la superficie. Pueden identificar f´acilmente fallas en la corteza de la Tierra, especialmente a partir de im´agenes multiespectrales, es decir cuando se cuenta con muchas im´agenes capturadas de una misma ´area en diferentes espectros electromagn´eticos.

Referencias

Documento similar

Los datos que requieran un proceso secuencial se ejecutarán en el CPU (host), mientras que aquellos que requieran un proceso paralelo el CPU encargará esta función a la GPU. 3)

Abstract: This paper reviews the dialogue and controversies between the paratexts of a corpus of collections of short novels –and romances– publi- shed from 1624 to 1637:

Entre nosotros anda un escritor de cosas de filología, paisano de Costa, que no deja de tener ingenio y garbo; pero cuyas obras tienen de todo menos de ciencia, y aun

Después de una descripción muy rápida de la optimización así como los problemas en los sistemas de fabricación, se presenta la integración de dos herramientas existentes

We have created this abstract to give non-members access to the country and city rankings — by number of meetings in 2014 and by estimated total number of participants in 2014 —

Por lo tanto, en base a su perfil de eficacia y seguridad, ofatumumab debe considerarse una alternativa de tratamiento para pacientes con EMRR o EMSP con enfermedad activa

The part I assessment is coordinated involving all MSCs and led by the RMS who prepares a draft assessment report, sends the request for information (RFI) with considerations,

Ciaurriz quien, durante su primer arlo de estancia en Loyola 40 , catalogó sus fondos siguiendo la división previa a la que nos hemos referido; y si esta labor fue de