procesamiento de imágeneshomepage.cem.itesm.mx/jose.luis.gomez/data/mathematica/...procesamiento de...

22
Procesamiento de imágenes José Luis Gómez-Muñoz Operaciones puntuales: El nuevo valor de cada punto (pixel) depende únicamente de su valor anterior Una matriz de números entre cero y uno se puede usar para representar una imagen en tonos de grises: Una matriz con valores entre 0.0 y 1.0: miPrimerMatriz = 0.0 0.3 0.3 0.3 0.0 0.0 0.7 0.7 0.0 0.3 0.0 1.0 0.0 0.0 0.3 0.0 880., 0.3, 0.3, 0.3<, 80., 0., 0.7, 0.7<, 80., 0.3, 0., 1.<, 80., 0., 0.3, 0.<< Interpretando 0.0 como negro, 1.0 como blanco, y valores intermedios como tonos de gris, se obtiene una pequeña "imagen": miPrimerImagen = Image@miPrimerMatrizD La matriz original puede ser obtenida de la imagen con el comando ImageData:

Upload: others

Post on 21-Mar-2020

3 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Procesamiento de imágeneshomepage.cem.itesm.mx/jose.luis.gomez/data/mathematica/...Procesamiento de imágenes José Luis Gómez-Muñoz Operaciones puntuales: El nuevo valor de cada

Procesamiento de imágenesJosé Luis Gómez-Muñoz

Operaciones puntuales: El nuevo valor de cada punto (pixel) depende únicamente de su valor anterior

Una matriz de números entre cero y uno se puede usar para representar una imagen en tonos de grises:

Una matriz con valores entre 0.0 y 1.0:

miPrimerMatriz =

0.0 0.3 0.3 0.3

0.0 0.0 0.7 0.7

0.0 0.3 0.0 1.0

0.0 0.0 0.3 0.0

880., 0.3, 0.3, 0.3<, 80., 0., 0.7, 0.7<, 80., 0.3, 0., 1.<, 80., 0., 0.3, 0.<<

Interpretando 0.0 como negro, 1.0 como blanco, y valores intermedios como tonos de gris, se obtiene una pequeña "imagen":

miPrimerImagen = Image@miPrimerMatrizD

La matriz original puede ser obtenida de la imagen con el comando ImageData:

Page 2: Procesamiento de imágeneshomepage.cem.itesm.mx/jose.luis.gomez/data/mathematica/...Procesamiento de imágenes José Luis Gómez-Muñoz Operaciones puntuales: El nuevo valor de cada

ImageData@miPrimerImagenD880., 0.3, 0.3, 0.3<, 80., 0., 0.7, 0.7<, 80., 0.3, 0., 1.<, 80., 0., 0.3, 0.<<

Restando cada elemento de "1" para obtener el "negativo" de la imagen

Mathematica le resta al número uno cada elemento de miPrimerMatriz para generar el correspondiente elemento de

miSegundaMatriz

miSegundaMatriz = 1 − miPrimerMatriz

881., 0.7, 0.7, 0.7<, 81., 1., 0.3, 0.3<, 81., 0.7, 1., 0.<, 81., 1., 0.7, 1.<<

Se obtiene el "negativo" de la imagen original

miSegundaImagen = Image@miSegundaMatrizD

La matriz puede ser obtenida de la imagen con el comando ImageData:

ImageData@miSegundaImagenD881., 0.7, 0.7, 0.7<, 81., 1., 0.3, 0.3<, 81., 0.7, 1., 0.<, 81., 1., 0.7, 1.<<

Elevando a la cuarta potencia cada número para aumentar el contraste

Aquí se eleva a la cuarta potencia cada elemento de miSegundaMatriz.

2 LAD06.nb

Page 3: Procesamiento de imágeneshomepage.cem.itesm.mx/jose.luis.gomez/data/mathematica/...Procesamiento de imágenes José Luis Gómez-Muñoz Operaciones puntuales: El nuevo valor de cada

miTercerMatriz = miSegundaMatriz^4

881., 0.2401, 0.2401, 0.2401<,81., 1., 0.0081, 0.0081<, 81., 0.2401, 1., 0.<, 81., 1., 0.2401, 1.<<

Se obtiene una imagen similar a la anterior pero con más "contraste"

miTercerImagen = Image@miTercerMatrizD

La matriz original puede ser obtenida de la imagen con el comando ImageData:

ImageData@miTercerImagenD881., 0.2401, 0.2401, 0.2401<,81., 1., 0.0081, 0.0081<, 81., 0.2401, 1., 0.<, 81., 1., 0.2401, 1.<<

Importa una imagen JPG

El comando FileNames permite mostrar las imágenes JPG que están en el folder "Mis documentos" de esta computadora.

El resultado de este comando será diferente en tu computadora.

Si obtienes como resultado una lista vacía, obtén una imagen JPG de internet y guárdala en la carpeta (folder) donde Mathematica

busca archivos ("Mis documentos" si tu computadora usa Windows y Mathematica versión 7)

FileNames@"∗.JPG"D8ambassadors.jpg, h1.jpg, im01.jpg, landscape.jpg, lenna.jpg<

Importa una de las imágenes JPG que aparecieron en tu computadora.

LAD06.nb 3

Page 4: Procesamiento de imágeneshomepage.cem.itesm.mx/jose.luis.gomez/data/mathematica/...Procesamiento de imágenes José Luis Gómez-Muñoz Operaciones puntuales: El nuevo valor de cada

miCuartaFoto = Import@"lenna.jpg"D

La convertimos en una imagen en tonos de grises con el comando ColorConvert

4 LAD06.nb

Page 5: Procesamiento de imágeneshomepage.cem.itesm.mx/jose.luis.gomez/data/mathematica/...Procesamiento de imágenes José Luis Gómez-Muñoz Operaciones puntuales: El nuevo valor de cada

miCuartaImagen = ColorConvert@miCuartaFoto, "Grayscale"D

La matriz puede ser obtenida de la imagen con el comando ImageData. La matriz es tan grande, que Mathematica tarda un poco,

y finalmente decide no mostrarla completa. Si quieres ver más de la matriz, oprime el botón Show More, pero para evitar que la

computadora quede trabada, No oprimas Show Full Outup.

miCuartaMatriz = ImageData@miCuartaImagenD

A very large output was generated. Here is a sample of it:

880.639216, 0.643137, 0.643137, 0.635294, 0.623529, 0.619608, 0.627451, 0.631373, 0.643137,

0.619608, 0.627451, 0.619608, 0.627451, 0.643137, 0.615686, 0.611765, �448�, 0.486275,

0.462745, 0.47451, 0.458824, 0.478431, 0.447059, 0.466667, 0.466667, 0.498039,

0.596078, 0.670588, 0.67451, 0.678431, 0.678431, 0.607843, 0.513725<, �478�, 8�1�<<

Show Less Show More Show Full Output Set Size Limit...

LAD06.nb 5

Page 6: Procesamiento de imágeneshomepage.cem.itesm.mx/jose.luis.gomez/data/mathematica/...Procesamiento de imágenes José Luis Gómez-Muñoz Operaciones puntuales: El nuevo valor de cada

Restando cada elemento de "1" para obtener el "negativo" de la imagen

Mathematica le resta al número uno cada elemento de miCuartaMatriz para generar el correspondiente elemento de miQuintaMa-

triz. La matriz es tan grande, que Mathematica tarda un poco, y finalmente decide no mostrarla completa. Si quieres ver más de

la matriz, oprime el botón Show More, pero para evitar que la computadora quede trabada, No oprimas Show Full Outup.

miQuintaMatriz = 1 − miCuartaMatriz

A very large output was generated. Here is a sample of it:

880.360784, 0.356863, 0.356863, 0.364706, 0.376471, 0.380392, 0.372549, 0.368627, �465�,

0.403922, 0.329412, 0.32549, 0.321569, 0.321569, 0.392157, 0.486275<, �478�, 8�1�<<

Show Less Show More Show Full Output Set Size Limit...

Se obtiene el "negativo" de la imagen original

6 LAD06.nb

Page 7: Procesamiento de imágeneshomepage.cem.itesm.mx/jose.luis.gomez/data/mathematica/...Procesamiento de imágenes José Luis Gómez-Muñoz Operaciones puntuales: El nuevo valor de cada

miQuintaImagen = Image@miQuintaMatrizD

Elevando a la cuarta potencia cada número para aumentar el contraste

Aquí se eleva a la cuarta potencia cada elemento de miQuintaMatriz. La matriz es tan grande, que Mathematica tarda un poco, y

finalmente decide no mostrarla completa. Si quieres ver más de la matriz, oprime el botón Show More, pero para evitar que la

computadora quede trabada, No oprimas Show Full Outup.

LAD06.nb 7

Page 8: Procesamiento de imágeneshomepage.cem.itesm.mx/jose.luis.gomez/data/mathematica/...Procesamiento de imágenes José Luis Gómez-Muñoz Operaciones puntuales: El nuevo valor de cada

miSextaMatriz = miQuintaMatriz^4

A very large output was generated. Here is a sample of it:

880.016943, 0.0162183, 0.0162183, 0.0176918, 0.0200874,

0.0209376, 0.0192634, �466�, 0.0266188, 0.0117749, 0.0112241, 0.0106929,

0.0106929, 0.0236504, 0.0559147<, �478�, 8�20�, �478�, �20�<<

Show Less Show More Show Full Output Set Size Limit...

Se obtiene una imagen similar a la anterior pero con más "contraste"

miSextaImagen = Image@miSextaMatrizD

8 LAD06.nb

Page 9: Procesamiento de imágeneshomepage.cem.itesm.mx/jose.luis.gomez/data/mathematica/...Procesamiento de imágenes José Luis Gómez-Muñoz Operaciones puntuales: El nuevo valor de cada

"Posterizado"

En la siguiente operación, cada elemento de la matriz se multiplica por 4, lo que se obtiene se redondea, y después se divide entre

4. Veamos en que se transforman algunos números cuando se hace esa operación:

Si comenzamos con el número 0.2, lo multiplicamos por 4 y obtenemos 0.8, al redondearlo obtenemos 1, lo dividimos entre 4 y

obtenemos 1/4

Si comenzamos con el número 0.3, lo multiplicamos por 4 y obtenemos 1.2, al redondearlo obtenemos 1, lo dividimos entre 4 y

obtenemos 1/4

Si comenzamos con el número 0.7, lo multiplicamos por 4 y obtenemos 2.8, al redondearlo obtenemos 3, lo dividimos entre 4 y

obtenemos 3/4

Si comenzamos con el número 0.8, lo multiplicamos por 4 y obtenemos 3.2, al redondearlo obtenemos 3, lo dividimos entre 4 y

obtenemos 3/4

Como se puede ver con estos ejemplos, toda la variedad de números que hay en la matriz inicial se transforma con esta operación

en sólo algunos valores posibles: 0,1

4,

2

4,

3

4, 1. La matriz es tan grande, que Mathematica tarda un poco, y finalmente decide no

mostrarla completa. Si quieres ver más de la matriz, oprime el botón Show More, pero para evitar que la computadora quede

trabada, No oprimas Show Full Outup.

miSeptimaMatriz = Round@4 ∗ miCuartaMatrizD ê 4

A very large output was generated. Here is a sample of it:

99 3

4,

3

4,

3

4,

3

4,

1

2,

1

2,

3

4,

3

4,

3

4,

1

2,

3

4,

1

2,

3

4,

3

4,

1

2,

1

2,

1

2,

3

4,

3

4,

1

2,

1

2,

1

2,

1

2,

1

2,

1

2,

1

2,

1

2,

1

2,

1

2,

1

2,

1

2,

1

2,

1

2,

3

4,

3

4,

3

4,

3

4,

3

4,

3

4,

3

4,

3

4,

3

4,

3

4,

3

4,

3

4,

3

4,

3

4,

3

4,

3

4,

3

4,

3

4,

3

4,

1

2, �375�,

1

2,

1

2,

1

2,

1

2,

1

2,

1

2,

1

2,

1

2,

1

2,

1

2,

1

2,

1

2,

1

2,

1

2,

1

2,

1

2,

1

2,

1

2,

1

2,

1

2,

1

2,

1

2,

1

2,

1

2,

1

2,

1

2,

1

2,

1

2,

1

2,

1

2,

1

2,

1

2,

1

2,

1

2,

1

2,

1

2,

1

2,

1

2,

1

2,

1

2,

1

2,

1

2,

1

2,

1

2,

1

2,

1

2,

3

4,

3

4,

3

4,

3

4,

1

2,

1

2=, �479�=

Show Less Show More Show Full Output Set Size Limit...

Esta es la imagen que se obtiene. Observa que sólo hay cinco tonos de gris (0,1

4,

2

4,

3

4, 1) en toda la imagen:

LAD06.nb 9

Page 10: Procesamiento de imágeneshomepage.cem.itesm.mx/jose.luis.gomez/data/mathematica/...Procesamiento de imágenes José Luis Gómez-Muñoz Operaciones puntuales: El nuevo valor de cada

miSeptimaImagen = Image@miSeptimaMatrizD

Convolución: El nuevo valor de cada punto (pixel) depende de los valores anteriores de los puntos vecinos

Primer ejemplo de convolución a mano

Aquí hay algunos cálculos de "convolución" similares a los que se hicieron a mano en el salón de clases.

10 LAD06.nb

Page 11: Procesamiento de imágeneshomepage.cem.itesm.mx/jose.luis.gomez/data/mathematica/...Procesamiento de imágenes José Luis Gómez-Muñoz Operaciones puntuales: El nuevo valor de cada

"Imagen original" "Kernel" "Convolución" "Imagen Final"

0. 0. 0.8 0. 0. 0.

0.8 0.8 1. 0.8 1. 0.8

0. 0. 0.8 0. 0. 0.

0. 0. 0.8 0. 0. 0.

0.8 0.8 1. 0.8 0.8 0.8

0. 0. 0.8 0. 0. 0.

1 1 1

1 −8 1

1 1 1

−3. −4.8 −2.8 −6.4

4.2 −3. 4.4 2.6

4.2 −3. 4.2 2.4

−3. −4.8 −3. −4.8

0.31 0.15 0.33 0.

0.98 0.31 1. 0.83

0.98 0.31 0.98 0.81

0.31 0.15 0.31 0.15

Segundo ejemplo de convolución a mano

Aquí hay algunos cálculos de "convolución" similares a los que se hicieron a mano en el salón de clases.

"Imagen original" "Kernel" "Convolución" "Imagen Final"

0. 0. 0.8 0. 0. 0.

0.8 0.8 1. 0.8 1. 0.8

0. 0. 0.8 0. 0. 0.

0. 0. 0.8 0. 0. 0.

0.8 0.8 1. 0.8 0.8 0.8

0. 0. 0.8 0. 0. 0.

−1 0 1

−1 0 1

−1 0 1

1.8 0. −1.6 0.

1.8 0. −1.6 0.

1.8 0. −1.8 0.

1.8 0. −1.8 0.

1. 0.5 0.06 0.5

1. 0.5 0.06 0.5

1. 0.5 0. 0.5

1. 0.5 0. 0.5

Ejercicio: Realiza a mano los siguientes cálculos para obtener la "imagen final":

"Imagen original" "Kernel" "Convolución" "Imagen Final"

0. 0. 0.8 0. 0. 0.

0.8 0.8 1. 0.8 1. 0.8

0. 0. 0.8 0. 0. 0.

0. 0. 0.8 0. 0. 0.

0.8 0.8 1. 0.8 0.8 0.8

0. 0. 0.8 0. 0. 0.

1 2 1

2 4 2

1 2 1

" " " " " " " "

" " " " " " " "

" " " " " " " "

" " " " " " " "

" " " " " " " "

" " " " " " " "

" " " " " " " "

" " " " " " " "

LAD06.nb 11

Page 12: Procesamiento de imágeneshomepage.cem.itesm.mx/jose.luis.gomez/data/mathematica/...Procesamiento de imágenes José Luis Gómez-Muñoz Operaciones puntuales: El nuevo valor de cada

Convolución con un Kernel para detección de bordes

El comando ImageConvolve hace los mismos cálculos que hiciste a mano. En este ejemplo, la imagen obtenida es clara donde hay

cambios bruscos en la imagen original, y es obscura donde la imagen original cambia lentamente:

miOctavaImagen = ImageConvolveBmiCuartaImagen,1 1 1

1 −8 1

1 1 1

F

La matriz puede ser obtenida de la imagen con el comando ImageData. La matriz es tan grande, que Mathematica tarda un poco,

y finalmente decide no mostrarla completa. Si quieres ver más de la matriz, oprime el botón Show More, pero para evitar que la

computadora quede trabada, No oprimas Show Full Outup.

12 LAD06.nb

Page 13: Procesamiento de imágeneshomepage.cem.itesm.mx/jose.luis.gomez/data/mathematica/...Procesamiento de imágenes José Luis Gómez-Muñoz Operaciones puntuales: El nuevo valor de cada

miOctavaMatriz = ImageData@miOctavaImagenD

A very large output was generated. Here is a sample of it:

994.44089×10−16, −0.027451, −0.0392157, −0.0235294,

0.0235294, 0.0431373, 0.00392157, �466�, −0.0666667, −0.223529,

−0.0313725, −0.0470588, −0.235294, −0.0823529, 0.27451=, �478�, 8�1�<=

Show Less Show More Show Full Output Set Size Limit...

"Kernel" para detección de cambios horizontales

Este otro "kernel" sirve para "detectar" cambios horizontales. Observa como la nariz está muy bien definida, mientras que los labios

casi no se ven

LAD06.nb 13

Page 14: Procesamiento de imágeneshomepage.cem.itesm.mx/jose.luis.gomez/data/mathematica/...Procesamiento de imágenes José Luis Gómez-Muñoz Operaciones puntuales: El nuevo valor de cada

miNovenaImagen = ImageConvolveBmiCuartaImagen,−1 0 1

−1 0 1

−1 0 1

F

"Kernel" para detección de cambios verticales

Este otro "kernel" sirve para "detectar" cambios verticales. Observa que con la nariz y los labios pasa lo opuesto a la imagen

anterior, ahora la nariz no está muy bien definida, mientras que los labios se ven muy claramente:

14 LAD06.nb

Page 15: Procesamiento de imágeneshomepage.cem.itesm.mx/jose.luis.gomez/data/mathematica/...Procesamiento de imágenes José Luis Gómez-Muñoz Operaciones puntuales: El nuevo valor de cada

miDecimaImagen = ImageConvolveBmiCuartaImagen,1 1 1

0 0 0

−1 −1 −1

F

"kernel" que duplica la imagen:

Con este enorme kernel se enciman dos copias de la imagen (observa que sólo hay dos números distintos de cero, en dos

esquinas de la matriz):

LAD06.nb 15

Page 16: Procesamiento de imágeneshomepage.cem.itesm.mx/jose.luis.gomez/data/mathematica/...Procesamiento de imágenes José Luis Gómez-Muñoz Operaciones puntuales: El nuevo valor de cada

miDecimaImagen =

ImageConvolveBmiCuartaImagen,

0 0 0 0 0 0 0 0 0 0 01

2

0 0 0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0 0 0 0 0

1

20 0 0 0 0 0 0 0 0 0 0

F

16 LAD06.nb

Page 17: Procesamiento de imágeneshomepage.cem.itesm.mx/jose.luis.gomez/data/mathematica/...Procesamiento de imágenes José Luis Gómez-Muñoz Operaciones puntuales: El nuevo valor de cada

"Kernel" que suaviza la imagen

Comparando con el ejemplo anterior, podemos pensar que este kernel genera 64 imágenes encimadas, lo cual terminamos viendo

como una sola imagen suavizada, como "fuera de foco":

LAD06.nb 17

Page 18: Procesamiento de imágeneshomepage.cem.itesm.mx/jose.luis.gomez/data/mathematica/...Procesamiento de imágenes José Luis Gómez-Muñoz Operaciones puntuales: El nuevo valor de cada

miDecimaImagen = ImageConvolveBmiCuartaImagen,

1 ê64 1ê 64 1 ê 64 1 ê64 1ê 64 1 ê 64 1 ê64 1ê 641 ê64 1ê 64 1 ê 64 1 ê64 1ê 64 1 ê 64 1 ê64 1ê 641 ê64 1ê 64 1 ê 64 1 ê64 1ê 64 1 ê 64 1 ê64 1ê 641 ê64 1ê 64 1 ê 64 1 ê64 1ê 64 1 ê 64 1 ê64 1ê 641 ê64 1ê 64 1 ê 64 1 ê64 1ê 64 1 ê 64 1 ê64 1ê 641 ê64 1ê 64 1 ê 64 1 ê64 1ê 64 1 ê 64 1 ê64 1ê 641 ê64 1ê 64 1 ê 64 1 ê64 1ê 64 1 ê 64 1 ê64 1ê 641 ê64 1ê 64 1 ê 64 1 ê64 1ê 64 1 ê 64 1 ê64 1ê 64

F

18 LAD06.nb

Page 19: Procesamiento de imágeneshomepage.cem.itesm.mx/jose.luis.gomez/data/mathematica/...Procesamiento de imágenes José Luis Gómez-Muñoz Operaciones puntuales: El nuevo valor de cada

Otra forma de procesamiento: convirtiendo la imagen en una función contínua (interpolación)

Convirtiendo en una función contínua

Este comando convierte la matriz en una función contínua:

miImagenInterpolada = ListInterpolation@miCuartaMatrizDInterpolatingFunction@881., 480.<, 81., 480.<<, <>D

Reproduce la siguiente imagen y USA EL RATÓN PARA GIRAR LA IMAGEN.

Plot3D@miImagenInterpolada@x, yD,8x, 1, base<, 8y, 1, altura<,PlotPoints → 100,

Mesh → False,

ColorFunction → GrayLevel,

Lighting → 88"Ambient", White<<,ViewPoint → 80, −0.6, 3<

D

LAD06.nb 19

Page 20: Procesamiento de imágeneshomepage.cem.itesm.mx/jose.luis.gomez/data/mathematica/...Procesamiento de imágenes José Luis Gómez-Muñoz Operaciones puntuales: El nuevo valor de cada

DensityPlot permite ver la función contínua como imagen

DensityPlot@miImagenInterpolada@x, yD, 8x, 1, base<,8y, 1, altura<, PlotPoints → 200, Mesh → False,

AspectRatio → Automatic, Frame → None, ColorFunction → GrayLevelD

20 LAD06.nb

Page 21: Procesamiento de imágeneshomepage.cem.itesm.mx/jose.luis.gomez/data/mathematica/...Procesamiento de imágenes José Luis Gómez-Muñoz Operaciones puntuales: El nuevo valor de cada

Modificando la función contínua

DensityPlotBmiImagenInterpoladaAx2, y2E, :x, 1, base >,:y, 1, altura >, PlotPoints → 100, Mesh → False,

AspectRatio → Automatic, Frame → None, ColorFunction → GrayLevelF

LAD06.nb 21

Page 22: Procesamiento de imágeneshomepage.cem.itesm.mx/jose.luis.gomez/data/mathematica/...Procesamiento de imágenes José Luis Gómez-Muñoz Operaciones puntuales: El nuevo valor de cada

Modificando la función contínua

In[68]:= DensityPlot@miImagenInterpolada@Exp@xD, Exp@yDD, 8x, 1, Log@baseD<,8y, 1, Log@alturaD<, PlotPoints → 100, Mesh → False,

AspectRatio → Automatic, Frame → None, ColorFunction → GrayLevelD

Out[68]=

22 LAD06.nb