Cálculo científico con Julia 🧪
¿Qué es Julia?
Julia es un moderno lenguaje de programación especialmente diseñado para el cálculo científico que destaca principalmente en la construcción de modelos matemáticos.
Filtros para imágenes
En este taller veremos como las imágenes pueden representarse matemáticamente como matrices y cómo podemos diseñar filtros para cambiar el aspecto de las imágenes con Julia.
Representación de imágenes como matrices
Si miras con lupa una imagen digital, verás está formada por pequeños puntitos de colores llamados píxeles que se organizan en forma de tabla o matriz conocida como mapa de bits. El número de filas y columnas de esa matriz es la resolución de la imagen.
El color de cada pixel se obtiene mediante la combinación de los colores básicos R (red), G (green) y B (blue) y esa combianción se puede expresar como un código numérico.
En este taller trabajaremos con imágenes en blanco y negro que son más sencillas de representar matricialmente.
Podemos definir fácilmente una variable en Julia para representar un pixel con un nivel de gris determiando por un parámetro interactivo.
Observa cómo cambia de color el píxel de más abajo cuando movelos el deslizador del nivel del gris.
Ahora podemos definir una matriz de 3 x 3 (3 filas y 3 columnas) con números entre 0 y 1 que representan el nivel de gris.
En Julia las matrices se representan entre corchetes [ ]
, separando sus filas con punto y coma ;
y las columnas con espacios.
3×3 Matrix{Float64}:
0.1 0.2 0.3
0.4 0.5 0.6
0.7 0.8 0.9
A partir de esta matriz podemos usar el paquete Images
de Julia para generar fácilmente una imagen de 3x3 con pixels cuyos niveles de gris se corresponden con los valores de la matriz anterior.
Ahora que ya entiendes cómo se representa una imagen matemáticamente mediante una matriz, vamos a cargar una imagen real con la que trabajaremos. Selecciona la imagen que más prefieras.
A continuación se muestra la matriz que representa esta imagen.
512×512 reinterpret(reshape, N0f8, ::Array{Gray{N0f8},2}) with eltype N0f8:
0.569 0.22 0.192 0.349 0.537 0.353 … 0.271 0.518 0.443 0.6 0.694
0.455 0.396 0.157 0.263 0.353 0.212 0.498 0.475 0.51 0.584 0.49
0.302 0.447 0.18 0.18 0.384 0.235 0.482 0.384 0.392 0.345 0.318
0.278 0.533 0.373 0.188 0.325 0.471 0.333 0.435 0.286 0.294 0.275
0.341 0.478 0.518 0.196 0.298 0.341 0.365 0.259 0.231 0.314 0.337
0.322 0.298 0.624 0.239 0.282 0.376 … 0.267 0.208 0.333 0.596 0.714
0.169 0.2 0.525 0.51 0.275 0.478 0.239 0.357 0.725 0.776 0.643
⋮ ⋮ ⋱ ⋮
0.412 0.435 0.518 0.569 0.58 0.506 0.4 0.365 0.322 0.325 0.325
0.376 0.447 0.541 0.596 0.584 0.506 0.416 0.38 0.361 0.361 0.333
0.435 0.525 0.596 0.541 0.549 0.498 0.4 0.341 0.388 0.353 0.349
0.553 0.569 0.553 0.573 0.494 0.482 0.345 0.361 0.325 0.349 0.306
0.612 0.553 0.514 0.467 0.404 0.467 … 0.333 0.322 0.31 0.314 0.271
0.043 0.043 0.051 0.055 0.059 0.059 0.02 0.016 0.027 0.016 0.016
Filtros de imágenes
Ahora veremos como podemos aplicar un filtro a la imagen seleccionada para provocar un cambio en su aspecto.
¿Qué es un filtro?
Un filtro es una transformación que se aplica a cada uno de los pixels de la imagen.
Una transformación habitual es una convolución que consiste en multiplicar cada pixel y sus pixels vecinos por una pequeña matriz. El nuevo valor del pixel se obtienen sumando los valores de estos productos.
Dependiendo de los valores de la matriz de convolución, podemos obtener filtros que provocarán distintos cambios de aspecto de la imagen.
La siguiente función de Julia aplica la transformación de convolución. Esta función recorre los pixels de la matriz original y aplica la transformación de convolución a cada uno de ellos, pero no te preocupes si no la entiendes del todo.
convolucion (generic function with 1 method)
Filtro para difuminar
Vamos a empezar con un filtro sencillo para difuminar la imagen uniformemente. Para ello utilizaremos una matriz de convolución de 3x3 con los mismos valores. La intensidad del difuminado dependerá del valor de la matriz de convolución.
Como todos los valores de la matriz de convolución son iguales, el nuevo valor del pixel es la media de los valores del pixel y de sus vecinos.
A continuación definimos la matriz de un filtro de difuminado cuyos valores dependen del pámetro interactivo intensidad
.