¿Qué entendemos por imagen?
Una imagen puede ser definida matemáticamente como una función bidimensional,
f(x,y),
donde x y y son coordenadas espaciales (en un plano), y f en cualquier par de
coordenadas es la intensidad o nivel de gris de la imagen en esa coordenada.[1]
¿Qué entendemos por imagen digital?
Cuando x,y, y los valores de f son todas cantidades finitas, discretas, decimos que la
imagen es una imagen digital.
Una imagen digital se compone de un número finito de elementos, cada uno con un
lugar y valor específicos. Estos elementos son llamados pels, o pixels.[1]
¿Qué es el procesamiento digital de imágenes?
En el resto de la sección se intentará contestar esta pregunta basándose en el dominio
que presentan González y Woods en el libro de texto de la materia .La vista es nuestro sentido más avanzado, y no es sorprendente que las imágenes
jueguen el papel más importante en la percepción humana. Aunque los seres humanos estemos limitados a la banda visible del espectro
electromagnético (EM), las máquinas pueden percibir casi el espectro completo, desde
los rayos gamma, a las ondas de radio.
Las máquinas también pueden procesar imágenes generadas por fuentes que los
humanos no asociamos con imágenes; como es el caso del ultrasonido, la microscopia
de electrones, etc.[1]
Funciones Lineales
NEGATIVO DE UNA IMAGEN
El negativo de una imagen con niveles de gris en el rango [0, L – 1]se obtiene al utilizar
la transformación de negativo, consiste principalmente en invertir los niveles de intensidad de esta manera produce el equivalente de un negativo
fotográfico.[1]
La función del negativo es :
s = L – 1 – r
Donde s es g(x,y) función de salida
Donde L – 1 es 256-1
Donde r es la función de entrada en este caso f(x,y)
Finalmente queda:
g(x,y)= 255- f(x,y)
Sirve para mejorar los niveles de blanco o gris en las imágenes donde predomina el oscuro y así puedan ser visibles esas áreas.
Foto 1. Gráfica de la función Negativo una imagen
Algoritmo o pseudocodigo para la función negativo de una imagen
1. Leemos la imagen en escala de grises.
2. Se obtiene el tamaño de la imagen.
3. Creamos la matriz con el tamaño de la imagen.
4. Se realiza el recorrido de la matriz con dos ciclos for, una para filas y otro para columnas.
4.1. Se realiza la función del negativo en este caso g [x,y]= 255-img [x,y].
6. Mostramos la imagen original y la imagen Negativa.
7. Guardamos Imagen negativa.
8. Cerramos ventanas.
9. Fin.
Código de la función negativo de una imagen
import numpy as np
import numpy
import cv2
img = cv2.imread ('C:\Users\EROS\Pictures\Procesamiento Digital\Caballo.jpg',0)
reg,col=img.shape
g = np.zeros((reg,col), dtype = np.uint8)
for i in range (reg):
for j in range (col):
g [i,j]= 255-img[i,j]
cv2.imshow ('Caballito',img)
cv2.imshow ('Negro',g)
k=cv2. waitKey(0)
if k == ord ('e'):
cv2.destroyAllWindows()
elif k == ord('s'):
cv2.imwrite('C:\Users\EROS\Pictures\Procesamiento Digital\Caballo1.jpg',g)
cv2.destroyAllWindows()
Foto 2. Ejemplo de una imagen original y su respectivo negativo
AUMENTO DE INTENSIDAD
La función aumento de intensidad esta también dentro de las funciones lineales, en esta usamos datos como
m y
b que son los que complementan la ecuación de la recta.
por ende la función aumento de intensidad queda :
g(x,y)= m* f(x,y)+b
m es la pendiente de la recta
b es el intercepto con el eje y
g(x,y) es la función de salida
f(x,y) es la función de entrada o valor de la imagen de entrada.
Esta función principalmente sirve para aumentar la tonalidad de blancos en imágenes oscuras como las astronómicas.
Foto 3. Gráfica de la función, Aumento de Intensidad de una imagen
Algoritmo o pseudocodigo para la función aumento de intensidad
1. Leemos la imagen en escala de grises.
2. Se obtiene el tamaño de la imagen.
3. Creamos la matriz con el tamaño de la imagen.
4. Se asignan valores a m y b donde m es la pendiente de la recta y b el intercepto de la recta con el eje y.
5. Se realiza el recorrido de la matriz con dos ciclos for, una para filas y otro para columnas.
5.1. Se realiza la función del aumento de intensidad, en este caso g [x,y]= m* (img [x,y]) + b.
6. Mostramos la imagen original y la imagen de salida con la función aplicada.
7. Guardamos Imagen con la función aplicada.
8. Cerramos ventanas.
9. Fin.
Código de la función aumento de intensidad
import numpy as np
import numpy
import cv2
img = cv2.imread ('C:\Users\EROS\Pictures\Procesamiento Digital\Foto.jpg',0)
reg,col=img.shape
g = np.zeros((reg,col), dtype = np.uint8)
b=50
m=0.8
for i in range (reg):
for j in range (col):
g [i,j]= m*img [i,j]+b
cv2.imshow ('Espacio',img)
cv2.imshow ('Negro',g)
k=cv2. waitKey(0)
if k == ord ('e'):
cv2.destroyAllWindows()
elif k == ord('s'):
cv2.imwrite('C:\Users\EROS\Pictures\Procesamiento Digital\Foto1.jpg',g)
cv2.destroyAllWindows()
Foto 4. Ejemplo de una imagen original y su aumento de intensidad
AUMENTO DE CONTRASTE
El efecto de la
transformación sería producir una imagen de más alto contraste que la original al
oscurecer los niveles de grises blancos y aclarar los niveles de grises poco contrastados de la imagen original. Esta
técnica se denomina aumento del contraste.[1]
El aumento de contraste esta dada por al función:
g(x,y)= {0,
( ( f(x,y)-Min) * 255)/Max-Min,
255,
Donde:
g(x,y) es la función de salida
f(x,y) es la función de entrada o valor de la imagen de entrada.
Min es el valor mínimo de grises de la imagen original
Max es el valor máximo de grises de la imagen original
Esta función de aumento de contraste sirve para darle buen aspecto a las imágenes muy opacas o con poco contraste.
Foto 5. Gráfica de la función, Aumento de contraste de una imagen
Algoritmo o pseudocodigo para la función aumento de contraste
1. Leemos la imagen en escala de grises.
2. Se obtiene el tamaño de la imagen.
3. Creamos la matriz con el tamaño de la imagen.
4. Encontramos el valor mínimo y máximo de la imagen original.
5. Se realiza el recorrido de la matriz con dos ciclos for, una para filas y otro para columnas.
5.1. Se realiza la función del aumento de contraste, en este caso
if img[i,j]<=Min:
g[i,j]=0
if Min<img[i,j]<Max:
g[i,j]=((img[i,j]-Min)*255)/(Max-Min)
if img[i,j]>=Max:
g[i,j]=255
6. Mostramos la imagen original y la imagen de salida con la función aplicada.
7. Guardamos Imagen con la función aplicada.
8. Cerramos ventanas.
9. Fin.
Código de la función aumento de contraste
import numpy as np
import numpy
import cv2
img = cv2.imread ('C:\Users\EROS\Pictures\Procesamiento Digital\Ain.jpg',0)
reg,col=img.shape
g = np.zeros((reg,col), dtype = np.uint8)
Min= np.min(img)
Max= np.max(img)
for i in range (reg):
for j in range (col):
if img[i,j]<=Min:
g[i,j]=0
if Min<img[i,j]<Max:
g[i,j]=((img[i,j]-Min)*255)/(Max-Min)
if img[i,j]>=Max:
g[i,j]=255
cv2.imshow ('Caballo',img)
cv2.imshow ('Negro',g)
k=cv2. waitKey(0)
if k == ord ('e'):
cv2.destroyAllWindows()
elif k == ord('s'):
cv2.imwrite('C:\Users\EROS\Pictures\Procesamiento Digital\Foto1.jpg',g)
cv2.destroyAllWindows()
Foto 6. Ejemplo de una imagen original y su aumento de contraste
Transformaciones no lineales
FUNCIÓN ALGORÍTMICA
La forma general de la transformación logarítmica es:
s = c log (1 + r)
Donde c es una constante, y se asume que r >= 05
.
r es f(x,y) función de entrada
El efecto de la transformación es
mapear un pequeño rango de valores bajos de nivel de gris a un rango más amplio de
niveles de salida, al tiempo que lo contrario ocurre con los valores de entrada altos.
Se usa una transformación de este tipo para expander los valores de pixeles oscuros de
una imagen, mientras se comprime los valores de alto valor. La transformación
logarítmica inversa lleva a cabo la transformación contraria. [1]
Foto 7. Gráfica de la función Algorítmica
Algoritmo o pseudocodigo para la función Algorítmica
1. Leemos la imagen en escala de grises.
2. Se obtiene el tamaño de la imagen.
3. Creamos la matriz con el tamaño de la imagen.
4. Encontramos el valor máximo de la imagen original.
5. Calculamos el valor de la constante c, ocupando como dato el valor del máximo.
6. Se realiza el recorrido de la matriz con dos ciclos for, una para filas y otro para columnas.
6.1. Se realiza la función algorítmica, en este caso g[i,j]=c*(math.log(1+img[i,j])).
7. Mostramos la imagen original y la imagen de salida con la función aplicada.
8. Guardamos Imagen con la función aplicada..
9. Cerramos ventanas.
10. Fin
Código de la función Algorítmica
import numpy as np
import numpy
import cv2
img = cv2.imread ('C:\Users\EROS\Pictures\Procesamiento Digital\IM.png',0)
reg,col=img.shape
g = np.zeros((reg,col), dtype = np.uint8)
Max= np.max(img)
c= 255/(math.log(1+Max))
for i in range (reg):
for j in range (col):
g[i,j]=c*(math.log(1+img[i,j]))
cv2.imshow ('Foto',img)
cv2.imshow ('Negro',g)
k=cv2. waitKey(0)
if k == ord ('e'):
cv2.destroyAllWindows()
elif k == ord('s'):
cv2.imwrite('C:\Users\EROS\Pictures\Procesamiento Digital\Foto1.png',g)
cv2.destroyAllWindows()
Foto 8. Ejemplo de una imagen original y la aplicación de la función algorítmica.
FUNCIÓN EXPONENCIAL
Las transformaciones de función de potencia tienen la forma básica
s = crγ
Donde c y γ son constantes positivas. Algunas veces la ecuación se escribe como s = c
(r + ε)
γ
para tomar en cuenta un offset de calibración. [1]
Al variar la γ obtenemos las diversas transformaciones que se grafican en la fig 9
Foto 9. Gráfica de la función Exponencial
Esta transformación también se utiliza para manipular el contraste de una imagen.
Algoritmo o pseudocodigo para la función Exponencial
1. Leemos la imagen en escala de grises.
2. Se obtiene el tamaño de la imagen.
3. Creamos la matriz con el tamaño de la imagen.
5.Asignamos en valor a gamma y calculamos el valor de la constante c, ocupando como dato el valor del gamma.
6. Se realiza el recorrido de la matriz con dos ciclos for, una para filas y otro para columnas.
6.1. Se realiza la función exponencial, en este caso g[i,j]=c*(img[i,j]**gamma).
7. Mostramos la imagen original y la imagen de salida con la función aplicada.
8. Guardamos Imagen con la función aplicada.
9. Cerramos ventanas.
10. Fin
Código de la función Exponencial
import numpy as np
import numpy
import cv2
img = cv2.imread ('C:\Users\EROS\Pictures\Procesamiento Digital\Cubo.png',0)
reg,col=img.shape
g = np.zeros((reg,col), dtype = np.uint8)
gamma=0.7
c=255/((255)**gamma)
for i in range (reg):
for j in range (col):
g[i,j]=c*(img[i,j]**gamma)
cv2.imshow ('Cubo',img)
cv2.imshow ('Negro',g)
k=cv2. waitKey(0)
if k == ord ('e'):
cv2.destroyAllWindows()
elif k == ord('s'):
cv2.imwrite('C:\Users\EROS\Pictures\Procesamiento Digital\Foto1.png',g)
cv2.destroyAllWindows()
Foto 10. Ejemplo de una imagen original y la aplicación de la función exponencial.
Funciones de transformación lineal por partes
La principal ventaja de las funciones de transformación lineal por partes es que pueden
ser arbitrariamente complejas (pueden tener la forma que queramos). Su desventaja es
que su especificación requiere más datos de entrada por parte del usuario. [1]
EXPANSIÓN DE CONTRASTE (CASO 1)
La idea del aumento del contraste es estirar el rango dinámico de los niveles de gris que
se están procesando. Los puntos de control (r1, s1) y (r2, s2) determinan la forma de la función de
transformación. [1]
Su función esta dada por :
S={αr,
β(r-a)+Va
γ(r-b)+Vb
Si r1 = s1 y r2 = s2 la transformación es una función lineal que no produce cambios en el
nivel de gris.
Foto 11. Gráfica de la función transformación lineal por partes
Algoritmo o pseudocodigo para la función expansión de contraste
1. Leemos la imagen en escala de grises.
2. Se obtiene el tamaño de la imagen.
3. Creamos la matriz con el tamaño de la imagen.
5.Asignamos los valores a los registros alfa, beta y gamma, tal que alfa y gamma sean mayor que 1 y beta menor que 1, también asignamos los valores a a y b tal que al graficar esta no sobrepase los 255 ya que si es así aparecerán manchas negras en la imagen que se le aplica la función, también asignamos valores de entradas para Va y Vb.
6. Se realiza el recorrido de la matriz con dos ciclos for, una para filas y otro para columnas.
6.1. Se realiza la función de expansión del contraste, en este caso
if 0<=img[i,j]<a:
g[i,j]=A*img[i,j]
if a<=img[i,j]<b:
g[i,j]=B*(img[i,j]-a)+Va
if b<=img[i,j]<=255:
g[i,j]=G*(img[i,j]-b)+Vb.
7. Mostramos la imagen original y la imagen de salida con la función aplicada.
8. Guardamos Imagen con la función aplicada.
9. Cerramos ventanas.
10. Fin
Código de la función Expansión de contraste
import numpy as np
import numpy
import cv2
img = cv2.imread ('C:\Users\EROS\Pictures\Procesamiento Digital\T.png',0)
reg,col=img.shape
g = np.zeros((reg,col), dtype = np.uint8)
A=1.2
B=0.3
G=1.3
a=125
b=195
Va=100
Vb=110
for i in range (reg):
for j in range (col):
if 0<=img[i,j]<a:
g[i,j]=A*img[i,j]
if a<=img[i,j]<b:
g[i,j]=B*(img[i,j]-a)+Va
if b<=img[i,j]<=255:
g[i,j]=G*(img[i,j]-b)+Vb
cv2.imshow ('Arbol',img)
cv2.imshow ('Negro',g)
k=cv2. waitKey(0)
if k == ord ('e'):
cv2.destroyAllWindows()
elif k == ord('s'):
cv2.imwrite('C:\Users\EROS\Pictures\Procesamiento Digital\Foto1.png',g)
cv2.destroyAllWindows()
Foto 12. Ejemplo de una imagen original y la aplicación de la función expansión de contraste.
RANGO ESPECIFICO DE NIVEL DE GRIS (CASO 2)
A veces se desea mostrar un rango específico de niveles de gris. Masas de agua
en fotos satélitales, una manera de lograr esto es con la transformación lineal por
partes llamada fraccionamiento del nivel de gris. [1]
Se muestra un valor alto para todos los
valores dentro del rango de interés y un valor bajo para todos los demás.[1]
La función del segundo caso esta dada por
S={L-1, si a<=r<=b
0, cualquier otro caso
Donde L-1 es 256-1.
a y b son valores asignados por nosotros ya que es donde determinamos el rango.
r es la función de entrada en este caso f(x,y).
Foto 13. Gráfica de la función transformación lineal por partes, Caso 2 Nivel de gris
Algoritmo o pseudocodigo para la función transformación lineal por partes, Caso 2 Nivel de gris.
1. Leemos la imagen en escala de grises.
2. Se obtiene el tamaño de la imagen.
3. Creamos la matriz con el tamaño de la imagen.
5. Asignamos los valores a a y b con valores que nosotros queramos siempre y cuando no sobrepase los 255 ya que es donde se especificara el rango para aplicar el nivel de gris.
6. Se realiza el recorrido de la matriz con dos ciclos for, una para filas y otro para columnas.
6.1. Se realiza la función de nivel de gris, en este caso
if a<=img[i,j]<=b:
g[i,j]=255
else:
g[i,j]=0.
7. Mostramos la imagen original y la imagen de salida con la función aplicada.
8. Guardamos Imagen con la función aplicada.
10. Fin
Código de la función Nivel de gris (Caso 2)
import numpy as np
import numpy
import cv2
img = cv2.imread ('C:\Users\EROS\Pictures\Procesamiento Digital\T.png',0)
reg,col=img.shape
g = np.zeros((reg,col), dtype = np.uint8)
a=100
b=170
for i in range (reg):
for j in range (col):
if a<=img[i,j]<=b:
g[i,j]=255
else:
g[i,j]=0
cv2.imshow ('Arbol',img)
cv2.imshow ('Negro',g)
k=cv2. waitKey(0)
if k == ord ('e'):
cv2.destroyAllWindows()
elif k == ord('s'):
cv2.imwrite('C:\Users\EROS\Pictures\Procesamiento Digital\Foto1.png',g)
cv2.destroyAllWindows()
Foto 14. Ejemplo de una imagen original y la aplicación de la función transformación lineal por partes dado un rango, Caso 2 Nivel de gris.
Recalco que por el tipo de imagen que estoy usando se observa como imagen binaria.
RANGO ESPECIFICO DE NIVEL DE GRIS (CASO 3)
En este caso estamos usando la misma función que el anterior, ya que se quiere resaltar un rango en especifico, pero el resto de la imagen se mantendrá de la misma forma debido a que se esta usando la función de identidad, por lo que en esa parte de la imagen no sufrirá cambio más que en lo que queremos resaltar.
La función del tercer caso esta dada por
S={L-1, si a<r<=b
r, cualquier otro caso
Donde L-1 es 256-1.
a y b son valores asignados por nosotros ya que es donde determinamos el rango.
r es la función de entrada en este caso f(x,y).
Foto 15. Gráfica de la función transformación lineal por partes, Caso 3 Nivel de gris
Algoritmo o pseudocodigo para la función transformación lineal por partes, Caso 3 Nivel de gris.
1. Leemos la imagen en escala de grises.
2. Se obtiene el tamaño de la imagen.
3. Creamos la matriz con el tamaño de la imagen.
5. Asignamos los valores a a y b con valores que nosotros queramos siempre y cuando no sobrepase los 255 ya que es donde se especificara el rango para aplicar el nivel de gris.
6. Se realiza el recorrido de la matriz con dos ciclos for, una para filas y otro para columnas.
6.1. Se realiza la función de nivel de gris, en este caso
if a<img[i,j]<=b:
g[i,j]=255
else:
g[i,j]=img[i,j].
7. Mostramos la imagen original y la imagen de salida con la función aplicada.
8. Guardamos Imagen con la función aplicada.
9. Cerramos ventanas.
10. Fin
Código de la función Nivel de gris (Caso 3)
import numpy as np
import numpy
import cv2
img = cv2.imread ('C:\Users\EROS\Pictures\Procesamiento Digital\T.png',0)
reg,col=img.shape
g = np.zeros((reg,col), dtype = np.uint8)
a=100
b=170
for i in range (reg):
for j in range (col):
if a<img[i,j]<=b:
g[i,j]=255
else:
g[i,j]=img[i,j]
cv2.imshow ('Arbol',img)
cv2.imshow ('Negro',g)
k=cv2. waitKey(0)
if k == ord ('e'):
cv2.destroyAllWindows()
elif k == ord('s'):
cv2.imwrite('C:\Users\EROS\Pictures\Procesamiento Digital\Foto1.png',g)
Foto 16. Ejemplo de una imagen original y la aplicación de la función transformación lineal por partes dado un rango, Caso 3 Nivel de gris.
THRESHOLD (CASO 4)
En este caso utilizamos un limite para asignarlo llamado umbral, dependiendo del valor que uses resaltarás lo que desees de la imagen y esto se encuentra utilizando prueba y error, en pocas palabras debes jugar con el umbral para resaltar lo que desees de la imagen.
La función del cuarto caso esta dada por
S={0, si T<=r
L-1, si T>r
Donde L-1 es 256-1.
T es el umbral a encontrar probando con valores asignados.
r es la función de entrada en este caso f(x,y).
Foto 17. Gráfica de la función transformación lineal por partes, Caso 4 Threshold
Algoritmo o pseudocodigo para la función transformación lineal por partes, Caso 4 Threshold (Umbral).
1. Leemos la imagen en escala de grises.
2. Se obtiene el tamaño de la imagen.
3. Creamos la matriz con el tamaño de la imagen.
5. Asignamos el valor del umbral en este caso T.
6. Se realiza el recorrido de la matriz con dos ciclos for, una para filas y otro para columnas.
6.1. Se realiza la función Threshold, en este caso
if T<=img[i,j]:
g[i,j]=255
if T>img[i,j]:
g[i,j]=0.
7. Mostramos la imagen original y la imagen de salida con la función aplicada.
8. Guardamos Imagen con la función aplicada.
9. Cerramos ventanas.
10. Fin
Código de la función Threshold (Caso 4)
import numpy as np
import numpy
import cv2
img = cv2.imread ('C:\Users\EROS\Pictures\Procesamiento Digital\T.png',0)
reg,col=img.shape
g = np.zeros((reg,col), dtype = np.uint8)
T=90
for i in range (reg):
for j in range (col):
if T<=img[i,j]:
g[i,j]=255
if T>img[i,j]:
g[i,j]=0
cv2.imshow ('Arbol',img)
cv2.imshow ('Negro',g)
k=cv2. waitKey(0)
if k == ord ('e'):
cv2.destroyAllWindows()
elif k == ord('s'):
cv2.imwrite('C:\Users\EROS\Pictures\Procesamiento Digital\Foto1.png',g)
cv2.destroyAllWindows()
Foto 18. Ejemplo de una imagen original y la aplicación de la función Threshold (Caso 4).
HISTOGRAMA DE UNA IMAGEN
El histograma de una imagen digital con niveles de gris en el rango [0, L – 1] es una
función discreta h (rk) = nk donde rk es el nivel de gris k-ésimo y nk es el número de
pixeles en la imagen con nivel de gris rk.
Para normalizar el histograma se divide cada uno de sus valores entre el número total
de pixeles en la imagen, n. Así, el histograma normalizado se obtiene de p (rk) = nk / n,
para k = 0, 1, ...[1]
La función esta dada por :
h(rk)=nk
Donde h(rk) es el nivel de gris
nk es el numero de veces que aparece en nivel de gris dentro de la imagen
Algoritmo o pseudocodigo para el histograma de una imagen.
1. Debemos de importar la librería matplotlib ya que es la que usaremos para la creación del histograma.
2. Leemos la imagen en escala de grises.
3. Se obtiene el tamaño de la imagen.
4. Creamos la matriz con el tamaño de la imagen.
5. Creamos el arreglo con un tamaño de 256 ya que es el nivel máximo en la matriz y con tipo de dato entero.
6. Se realiza el recorrido de la matriz con dos ciclos for, una para filas y otro para columnas.
6.1. Se realiza la función del histograma tomando en cuenta el arreglo declarado, en este caso
V = img[i, j]
Histograma[V] = Histograma[V] + 1.
7.Utilizamos una variable temporal para la lectura de la imagen y utilizamos la variable de la librería matplotlib para llevarlo acabo.
8. Asignamos los parámetros para el histograma como tamaño colores etc.
9. Mostramos la imagen original y su histograma (Gráfica) este utilizando la libreria matplotlib .
10. Guardamos el histograma.
11. Cerramos ventanas.
12. Fin
Código de la función Histograma de una imagen
import numpy as np
import numpy
import cv2
img = cv2.imread ('C:\Users\EROS\Pictures\Procesamiento Digital\T.png',0)
reg,col=img.shape
g = np.zeros((reg,col), dtype = np.uint8)
Histograma = np.zeros([256],int)
for i in range (reg):
for j in range (col):
V = img[i, j]
Histograma[V] = Histograma[V] + 1
fig =plt.figure()
ax=fig.add_subplot(111)
xx=range(len(Histograma))
ax.bar(xx, Histograma, width=5, color=(1,0,0))
ax.set_ylabel('Veces')
plt.show()
cv2.imshow ('Arbol',img)
k=cv2. waitKey(0)
if k == ord ('e'):
cv2.destroyAllWindows()
elif k == ord('s'):
plt.imwrite('C:\Users\EROS\Pictures\Procesamiento Digital\Foto1.png',g)
cv2.destroyAllWindows()
Foto 19. Ejemplo de una imagen original y su histograma.
[1]http://read.pudn.com/downloads159/ebook/711796/Procesamiento_Digital_de_Imagenes.pdf
Consulta 10 de octubre del 2016
Consulta 11 de octubre del 2016
Consulta 15 de octubre del 2016