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

Post on 21-Mar-2020

10 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

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:

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

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

miCuartaFoto = Import@"lenna.jpg"D

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

4 LAD06.nb

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

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

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

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

"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

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

"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

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

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

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

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

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

"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

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

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

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

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

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

top related