Procesamiento de imágeneshomepage.cem.itesm.mx/jose.luis.gomez/data/mathematica/...Procesamiento de...
Transcript of Procesamiento de imágeneshomepage.cem.itesm.mx/jose.luis.gomez/data/mathematica/...Procesamiento de...
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