martes, 13 de diciembre de 2016

DETECCIÓN DE BORDES



Bordes: Variaciones fuertes de la intensidad que corresponden a las fronteras de los objetos visualizados.[1]

Operadores de gradiente

Detectan los bordes en base a las derivadas espaciales de la imagen que se calculan mediante operadores de convolución.

La derivada de una señal continua proporciona las variaciones locales con respecto a la variable, de forma que el valor de la derivada es mayor cuanto más rápidas son estas variaciones. En el caso de funciones bidimensionales f(x,y), la derivada es un vector que apunta en la dirección de la máxima variación de f(x,y) y cuyo módulo es proporcional a dicha variación. Este vector se denomina gradiente y se define: 


Figura 1. La imagen muestra las funciones gradientes
La primera función es la derivada parcial fx(x,y) (gradiente de fila GF(i,j) ) y gradiente en el eje Y (GC(i,j)), se obtienen mediante la convolución de la imagen con las máscaras. La magnitud y orientación del vector gradiente obtiene la imagen final, como lo muestra la función 2.

Operador de Roberts. 

Obtiene buena respuesta ante bordes diagonales. Ofrece buenas prestaciones en cuanto a localización. El gran inconveniente de este operador es su extremada sensibilidad al ruido y por tanto tiene pobres cualidades de detección. [1]

En el caso discreto, se puede aproximar la derivada diferenciando los valores contiguos.
*Aproximación discreta en esa región:
*Otra alternativa: diferencias cruzadas: 
Es el operador de gradiente más simple. Utiliza direcciones diagonales para calcular el vector gradiente mediante las mascaras que se muestran en la figura 1.1.[1]

Figura 1.1. Mascaras de operador de Roberts.


Pseudocodigo para el Operador de Roberts.

1. Leemos la imagen en escala de grises.
2. Se obtiene el tamaño de la imagen.
3. Creamos las matriz  para cada función a realizar, en este caso se utilizaran tres, una para la función Borde en X, otra para la función Borde en Y y una más para la función final ya que es donde se almacenará los datos finales a través del calculo de la magnitud de las dos funciones anteriores, estas de tipo uint8 con el tamaño de la imagen.

Bordex = np.zeros((row, col), dtype=np.uint8)
Bordey = np.zeros((row, col), dtype=np.uint8)
Final = np.zeros((row, col), dtype=np.uint8)

5. Creamos dos arrays para el filtro de Borde en X y otro en Y de  tipo float, en este caso el tamaño será de 2x2.

x = np.array([[1,0],[0,-1]], dtype=np.float)
y = np.array([[0,1],[-1, 0]], dtype=np.float)

6. Se realiza el recorrido de la matriz con dos ciclos for, una para filas y otro para columnas pero que empiece en la posición 1  y termine con una posición menos para el manejo de la vecindad, esto para X.

6.1.Realizamos la convolución del tamaño del filtro con la subimagen del mismo tamaño que este, utilizando la vecindad:
      a = i-1
      c = j-1
      Bordex [i, j] = image [a, c] * x[0, 0] + image [a, j] * x [0, 1] + image [c, i] * x[1, 0]
      + image [i, j] * x [1, 1]
        .
7. Se realiza el recorrido de la matriz con dos ciclos for, una para filas y otro para columnas pero que empiece en la posición 1  y termine con una posición menos para el manejo de la vecindad., esto para Y.

7.1.Realizamos la convolución del tamaño del filtro con la subimagen del mismo tamaño que este, utilizando la vecindad:
        a = i-1
        c = j-1
        Bordey [i, j] = image [a, c] * y[0, 0] + image [a, j] * y [0, 1] + image [c, i] * y[1, 0]

        + image [i, j] * y [1, 1]

8. Calculamos la magnitud de las dos funciones para obtener la matriz Final con la siguiente operación. 

Mx=pow(Bordex,2)
My=pow(Bordey,2)

Final = ((Mx)+(My))**0.5

9. Mostramos la imagen original.
10. Mostramos la imagen Final aplicada la función.
11. Guardamos Imagen.
12. Cerramos ventanas.
13. Fin





Figura 1.2 Ejemplo de una imagen original y su función operador de Roberts.


Operador de Prewitt

El operador de Prewitt expande la definición del gradiente en máscara de 3 x 3 para ser más inmune al ruido, utiliza la misma ecuación que Roberts, pero con una constante k=1 como se muestra en la figura 1.3.[1]

                                           Figura 1.3. Mascaras de operador de Prewitt

Este operador no otorga importancia especial a píxeles cercanos al centro de la máscara


Pseudocodigo para el  Operador de Prewitt.

1. Leemos la imagen en escala de grises.
2. Se obtiene el tamaño de la imagen.
3. Creamos las matriz  para cada función a realizar, en este caso se utilizaran tres, una para la función Borde en X, otra para la función Borde en Y y una más para la función final ya que es donde se almacenará los datos finales a través del calculo de la magnitud de las dos funciones anteriores, estas de tipo uint8 con el tamaño de la imagen.

Bordex = np.zeros((row, col), dtype=np.uint8)
Bordey = np.zeros((row, col), dtype=np.uint8)
Final = np.zeros((row, col), dtype=np.uint8)

5. Creamos dos arrays para el filtro de Borde en X y otro en Y de  tipo float, en este caso el tamaño será de 3x3.

x = np.array([[-1, -1, -1], [0, 0, 0], [1, 1, 1]], dtype=np.float)
y = np.array([[-1, 0, 1], [-1, 0, 1], [-1, 0, 1]], dtype=np.float)

6. Se realiza el recorrido de la matriz con dos ciclos for, una para filas y otro para columnas pero que empiece en la posición 1  y termine con una posición menos para el manejo de la vecindad, esto para X.

6.1.Realizamos la convolución del tamaño del filtro con la subimagen del mismo tamaño que este, utilizando la vecindad:
        a = i-1
        b = i + 1
        c = j-1
        d = j + 1
        Bordex [i, j] = image [a, c] * x[0, 0] + image [a, j] * x [0, 1] + image [a, d] * x[0, 2]
        + image [i, c] * x [1, 0] + image [i, j] *x [1, 1] + image [i, d] * x [1, 2]
        + image [b, c] * x [2, 0] + image [b, j] *x [2, 1] + image [b, d] * x [2, 2]
        
7. Se realiza el recorrido de la matriz con dos ciclos for, una para filas y otro para columnas pero que empiece en la posición 1  y termine con una posición menos para el manejo de la vecindad., esto para Y.

7.1.Realizamos la convolución del tamaño del filtro con la subimagen del mismo tamaño que este, utilizando la vecindad:
        a = i-1
        b = i + 1
        c = j-1
        d = j + 1
        Bordey [i, j] = image [a, c] * y[0, 0] + image [a, j] * y [0, 1] + image [a, d] * y[0, 2]
        + image [i, c] * y[1, 0] + image [i, j] *y [1, 1] + image [i, d] * y [1, 2]
        + image [b, c] * y [2, 0] + image [b, j]*y [2, 1] + image [b, d] * y [2, 2]

8. Calculamos la magnitud de las dos funciones para obtener la matriz Final con la siguiente operación. 

Mx=pow(Bordex,2)
My=pow(Bordey,2)

Final = ((Mx)+(My))**0.5

9. Mostramos la imagen original.
10. Mostramos la imagen final aplicada la función.
11. Guardamos Imagen.
12. Cerramos ventanas.
13. Fin

       



                       Figura 1.4 Ejemplo de una imagen original y su función operador de Prewitt.



Operador de Sobel

De igual manera que en el operador de Robert, para este operador usamos la misma ecuación que es la magnitud del gradiente, al igual que los demás operadores Sx y Sy puede implementarse  usando máscaras de convolución.[2]

Este operador pone un especial énfasis en pixeles cercanos al centro de la máscara, este maneja una constante k=2, se obtiene con el producto de un vector de diferenciación por uno de suavizamiento. [2]


Figura 1.5. Mascaras del operador de Sobel


Pseudocodigo para el Operador de Sobel.

Nota: En este caso solo cambia las máscaras

1. Leemos la imagen en escala de grises.
2. Se obtiene el tamaño de la imagen.
3. Creamos las matriz  para cada función a realizar, en este caso se utilizaran tres, una para la función Borde en X, otra para la función Borde en Y y una más para la función final ya que es donde se almacenará los datos finales a través del calculo de la magnitud de las dos funciones anteriores, estas de tipo uint8 con el tamaño de la imagen.

Bordex = np.zeros((row, col), dtype=np.uint8)
Bordey = np.zeros((row, col), dtype=np.uint8)
Final = np.zeros((row, col), dtype=np.uint8)

5. Creamos dos arrays para el filtro de Borde en X y otro en Y de  tipo float, en este caso el tamaño será de 3x3.

x = np.array([[-1, -2, -1], [0, 0, 0], [1, 2, 1]], dtype=np.float)
y = np.array([[-1, 0, 1], [-2, 0, 2], [-1, 0, 1]], dtype=np.float)

6. Se realiza el recorrido de la matriz con dos ciclos for, una para filas y otro para columnas pero que empiece en la posición 1  y termine con una posición menos para el manejo de la vecindad, esto para X.

6.1.Realizamos la convolución del tamaño del filtro con la subimagen del mismo tamaño que este, utilizando la vecindad:
        a = i-1
        b = i + 1
        c = j-1
        d = j + 1
        Bordex [i, j] = image [a, c] * x[0, 0] + image [a, j] * x [0, 1] + image [a, d] * x[0, 2]
        + image [i, c] * x [1, 0] + image [i, j] *x [1, 1] + image [i, d] * x [1, 2]
        + image [b, c] * x [2, 0] + image [b, j] *x [2, 1] + image [b, d] * x [2, 2]
        
7. Se realiza el recorrido de la matriz con dos ciclos for, una para filas y otro para columnas pero que empiece en la posición 1  y termine con una posición menos para el manejo de la vecindad., esto para Y.

7.1.Realizamos la convolución del tamaño del filtro con la subimagen del mismo tamaño que este, utilizando la vecindad:
        a = i-1
        b = i + 1
        c = j-1
        d = j + 1
        Bordey [i, j] = image [a, c] * y[0, 0] + image [a, j] * y [0, 1] + image [a, d] * y[0, 2]
        + image [i, c] * y[1, 0] + image [i, j] *y [1, 1] + image [i, d] * y [1, 2]
        + image [b, c] * y [2, 0] + image [b, j]*y [2, 1] + image [b, d] * y [2, 2]

8. Calculamos la magnitud de las dos funciones para obtener la matriz Final con la siguiente operación. 

Mx=pow(Bordex,2)
My=pow(Bordey,2)

Final = ((Mx)+(My))**0.5

9. Mostramos la imagen original.
10. Mostramos la imagen final, aplicada la función.
11. Guardamos Imagen.
12. Cerramos ventanas.
13. Fin


                                                                                                                                                                   


Figura 1.4 Ejemplo de una imagen original y su función operador de Sobel.


Laplaciano de una Gaussiana.

Este detector de orillas se basa en la segundas derivadas o Laplaciano de una Gaussiana.

La ventaja de usar un operador que se basa en la segunda derivada es que se puede estimar con mayor presición la localización de la orilla, que es exactamente donde la segunda derivada cruza cero.

En una primera aproximación al Laplaciano de una Gaussiana, podría preprocesarse la imagen con un suavizamiento Gaussiano, para eliminar ruido, seguido de un operador Laplaciano. El Laplaciano de una Gaussiana (LOG: Laplacian of a Gaussian) se expresa como:[3]

∇^2G = (∂^2G/∂x ^2 ) + (∂^ 2G/∂y^ 2 )

Donde G es una distribución normal o Gaussiana en dos dimensiones.

Figura 1.5.Máscara 3x3 para el operador Laplaciano. 


Figura 1.6.Máscara 3x3 para el operador Laplaciano de una Gaussiana. 

Referencias

[1]http://catarina.udlap.mx/u_dl_a/tales/documentos/lis/ramos_r_m/capitulo3.pdf
[2]http://www.sc.ehu.es/ccwgrrom/transparencias/pdf-vision-1-transparencias/capitulo-6.pdf

  Consulta 15 de Diciembre del 2016
  Consulta 8 de Enero del 2017

lunes, 21 de noviembre de 2016

FILTROS

Filtro de suavizamiento o pasa bajo:


Suavizar la imagen:  Reducir las variaciones de intensidad entre píxeles vecinos. 

La convolución,  de un filtro está dada por:




Donde Wi son los pesos o coeficientes del filtro
 y Zi son los valores de los pixeles de la imagen 
correspondientes a los coeficientes.







El filtro de la media: es el más simple, intuitivo y fácil de implementar para suavizar imágenes, es decir, reducir la cantidad de variaciones de intensidad entre píxeles vecinos. 

¿Cómo funciona? Se visita cada píxel de la imagen y se reemplaza por la media de los píxeles vecinos. Se puede operar mediante convolución con una máscara determinada.[1]

Filtro pasa alto o de acentuamiento:


Realzar la imagen: aumentar las variaciones de intensidad, allí donde se producen.

Los filtros pasa-alta atenúan las componentes de baja frecuencia y dejan intactas las de medias-altas en función de la frecuencia de corte que se elija. Se usan para quedarnos con las propiedades de la imagen en los que los niveles de gris varían bruscamente, por bordes de la imagen.[2]

La función esta dada por:

PA=img-PB       Donde: PA es el valor del filtro a calcular (Pasa alto)
                                        img es el valor de la imagen original
                                        PB  es el valor del filtro paso bajo

La principal función de este filtro es acentuar las altas frecuencias.


Filtro High-Boost:


Este filtro su principal función es mantener las altas frecuencias

Se puede filtrar una imagen con un filtro paso alto como la diferencia entre la imagen y una versión suavizada (pasa bajo ) de la misma. De esta manera se mejoran los bordes y otros detalles de alta frecuencia. Este tipo de técnica se utiliza muy a menudo en la fotografía e imprentas para remarcar los bordes.[2]

La función esta dada por:

EA=(A)img - PB     Donde: EA es el valor del filtro a calcular (High-Boost)
                                               A   valor constante  de escala asignado 
                                              img es el valor de la imagen original
                                              PB  es el valor del filtro pasa bajo


Pseudocodigo para la función  de suavizamiento, pasa alto y  High-Boost  de una imagen.

1. Leemos la imagen en escala de grises.

2. Se obtiene el tamaño de la imagen.

3. Creamos las matriz  para cada función a realizar en este caso la de suavizamiento, pasa alto, y High-Boost de tipo uint8 con el tamaño de la imagen.

Suavi = np.zeros((row, col), dtype=np.uint8)
Acent = np.zeros((row, col), dtype=np.uint8)
Boost = np.zeros((row, col), dtype=np.uint8)


5. Creamos el array para el filtro de  tipo float, en este caso el tamaño será de 3x3.

gauss = np.array([[1, 1, 1], [1, 1, 1], [1, 1, 1]], dtype=np.float)

5.1 Dividiremos el array entre 9  ya que se esta usando el filtro media.

6. Asignamos el valor a la constante de escala para la función high-boots.

7. Se realiza el recorrido de la matriz con dos ciclos for, una para filas y otro para columnas pero que empiece en la posición 1  y termine con una posición menos para el manejo de la vecindad.

7.1.Realizamos la convolución del tamaño del filtro con la subimagen del mismo tamaño que este, utilizando la vecindad:
        a = i-1
        b = i + 1
        c = j-1
        d = j + 1
        Suavi [i, j] = img [a, c] * gauss [0, 0] + img [a, j] * gauss [0, 1] + img [a, d] * gauss [0, 2]
        + img [i, c] * gauss [1, 0] + img [i, j] * gauss [1, 1] + img [i, d] * gauss [1, 2]
        + img [b, c] * gauss [2, 0] + img [b, j] * gauss [2, 1] + img [b, d] * gauss [2, 2]
        .
7.2. Realizamos la función de acentuamiento.
          Acent = img - Suavi

7.4 Realizamos la función de High-Boost.
         Boost = A  * img- Suavi

8. Se realiza el recorrido de la matriz con dos ciclos for, una para filas y otro para columnas.

8.1 Realizamos la función de transferencia de los valores de cada una de la funciones.

             Suavi[i, j] = Suavi[i, j]
        
            Acent[i, j] = Acent[i, j]
      
            Boost[i, j] = Boost[i, j]

10. Mostramos la imagen original.
11. Mostramos la imagen suavizada..
12. Mostramos la imagen Acentuada.
13. Mostramos la imagen High- Boost..
14. Guardamos Imagen.
15. Cerramos ventanas.
16. Fin


Código de la función   de suavizamiento, pasa alto y  High-Boost  de una imagen.


import numpy as np
import numpy 
import cv2
from matplotlib import pyplot as plt

img = cv2.imread ('C:\Users\EROS\Pictures\Procesamiento Digital\Hi1.jpg',0)

row,col=img.shape

Suavi = np.zeros((row, col), dtype=np.uint8)
Acent = np.zeros((row, col), dtype=np.uint8)
Boost = np.zeros((row, col), dtype=np.uint8)

gauss = np.array([[1, 1, 1], [1, 1, 1], [1, 1, 1]], dtype=np.float)

gauss=gauss/9


A=3

for in range (1,  row-1):
    for j in range (1,  col-1):
        a = i-1
        b = i + 1
        c = j-1
        d = j + 1
        Suavi [i, j] = img [a, c] * gauss [0, 0] + img [a, j] * gauss [0, 1] + img [a, d] * gauss [0, 2]
        + img [i, c] * gauss [1, 0] + img [i, j] * gauss [1, 1] + img [i, d] * gauss [1, 2]
        + img [b, c] * gauss [2, 0] + img [b, j] * gauss [2, 1] + img [b, d] * gauss [2, 2]
        

Acent = img - Suavi

Boost = A  * img- Suavi

#Boost = (A-1)  * img+ Suavi

for in range (row):
    for j in range ( col):

            Suavi[i, j] = Suavi[i, j]
        
            Acent[i, j] = Acent[i, j]
      
            Boost[i, j] = Boost[i, j]


cv2.imshow('Original Monocromo', img)
cv2.imshow('Imagen Suavizada', Suavi)
cv2.imshow('Imagen Acentuada', Acent)
cv2.imshow('Imagen Higboots', Boost)    
                
k=cv2. waitKey(0)
if k == ord ('e'):
    cv2.destroyAllWindows()
elif k == ord('s'):
    plt.imwrite('C:\Users\EROS\Pictures\Procesamiento Digital\Foto1.jpg',g)

    cv2.destroyAllWindows()





       Foto 1. Ejemplo de una imagen original y su función de suavizado con filtro de 3x3. 



                     
              
   Foto 2. Ejemplo de una imagen original y su función de acentuamiento con filtro de 3x3.





  Foto 3. Ejemplo de una imagen original y su función de High-Boots con filtro de 3x3.


Nota: La función High-Boots no logre resolverla de la manera correcta, utilice la función correspondiente pero no se cual es mi error.


Con filtro de 5x5:

Pseudocodigo para la función  de suavizamiento, pasa alto y  High-Boost  de una imagen.

1. Leemos la imagen en escala de grises.

2. Se obtiene el tamaño de la imagen.

3. Creamos las matriz  para cada función a realizar en este caso la de suavizamiento, pasa alto, y High-Boost de tipo uint8 con el tamaño de la imagen.

Suavi = np.zeros((row, col), dtype=np.uint8)
Acent = np.zeros((row, col), dtype=np.uint8)
Boost = np.zeros((row, col), dtype=np.uint8)

5. Creamos el array para el filtro de  tipo float, en este caso el tamaño será de 5x5.

gauss = np.array([[1, 1, 1, 1, 1], [1, 1, 1, 1, 1], [1, 1, 1, 1, 1], [1, 1, 1, 1, 1], [1, 1, 1, 1, 1]], dtype=np.float)

5.1 Dividiremos el array entre 25  ya que se esta usando el filtro media.

6. Asignamos el valor a la constante de escala para la función high-boots.

7. Se realiza el recorrido de la matriz con dos ciclos for, una para filas y otro para columnas pero que empiece en la posición 2  y termine con dos posición menos para el manejo de la vecindad.

7.1.Realizamos la convolución del tamaño del filtro con la subimagen del mismo tamaño que este, utilizando la vecindad:
           a = i - 1
           b = i + 1
           c = i - 2
           d = i + 2
           e = j - 1
           f = j + 1
           g = j - 2
           h = j + 2
                 
          Suavi [i, j] = img [c, g] * gauss [0, 0] + img [c, e] * gauss [0, 1] + img [c, j] * gauss [0, 2]
         + img [c, f] * gauss [0, 3] + img [c, h] * gauss [0, 4] + img [a, g] * gauss [1, 0] + img [a, e] *                           gauss [1, 1] + img [a, j] * gauss [1, 2] + img [a, f] * gauss [1, 3] + img [a, h] * gauss [1, 4] +                          img [i, g] * gauss [2, 0] + img [i, e] * gauss [2, 1] + img [i, j] * gauss [2, 2] + img [i, f] *                               gauss [2, 3] + img [i, h] * gauss [2, 4]+ img [b, g] * gauss [3, 0] + img [b, e] * gauss [3, 1] +                         img [b, j] * gauss [3, 2] + img [b, f] * gauss [3, 3]+ imge[b, h] * gauss [3, 4] + img [d, e] *                             gauss [4, 0] + img [d, e] * gauss [4, 1] + img [d, j] * gauss [4, 2]+ img [d, f] * gauss [4, 3]  + img                 [d, h]  * gauss [4, 4]
        .
7.2. Realizamos la función de acentuamiento.
           Acent = img - Suavi

7.4 Realizamos la función de High-Boost.
         Boost = A * img- Suavi

8. Se realiza el recorrido de la matriz con dos ciclos for, una para filas y otro para columnas.

8.1 Realizamos la función de transferencia de los valores de cada una de la funciones.

            Suavi[i, j] = Suavi[i, j]
        
            Acent[i, j] = Acent[i, j]
      
            Boost[i, j] = Boost[i, j]

10. Mostramos la imagen original.
11. Mostramos la imagen suavizada..
12. Mostramos la imagen Acentuada.
13. Mostramos la imagen High- Boost..
14. Guardamos Imagen.
15. Cerramos ventanas.
16. Fin

Código de la función   de suavizamiento, pasa alto y  High-Boost  de una imagen.


import numpy as np
import numpy 
import cv2
from matplotlib import pyplot as plt

img = cv2.imread ('C:\Users\EROS\Pictures\Procesamiento Digital\Hi1.jpg',0)

row,col=img.shape

Suavi = np.zeros((row, col), dtype=np.uint8)
Acent = np.zeros((row, col), dtype=np.uint8)
Boost = np.zeros((row, col), dtype=np.uint8)

gauss = np.array([[1, 1, 1, 1, 1], [1, 1, 1, 1, 1], [1, 1, 1, 1, 1], [1, 1, 1, 1, 1], [1, 1, 1, 1, 1]], dtype=np.float)

gauss=gauss/25

A=3

for in range (2,  row-2):
    for j in range (2,  col-2):
           a = i - 1
           b = i + 1
           c = i - 2
           d = i + 2
           e = j - 1
           f = j + 1
           g = j - 2
           h = j + 2
                 
          imgauss [i, j] = image [c, g] * gauss [0, 0] + image [c, e] * gauss [0, 1] + image [c, j] * gauss [0, 2]
         + image [c, f] * gauss [0, 3] + image [c, h] * gauss [0, 4] + image [a, g] * gauss [1, 0] + image [a, e] *            gauss [1, 1] + image [a, j] * gauss [1, 2] + image [a, f] * gauss [1, 3] + image [a, h] * gauss [1, 4] +              image [i, g] * gauss [2, 0] + image [i, e] * gauss [2, 1] + image [i, j] * gauss [2, 2] + image [i, f] *                  gauss [2, 3] + image [i, h] * gauss [2, 4]+ image [b, g] * gauss [3, 0] + image [b, e] * gauss [3, 1] +              image [b, j] * gauss [3, 2] + image [b, f] * gauss [3, 3]+ image [b, h] * gauss [3, 4] + image [d, e] *               gauss [4, 0] + image [d, e] * gauss [4, 1] + image [d, j] * gauss [4, 2]+ image [d, f] * gauss [4, 3]                   + simage [d, h]  * gauss [4, 4]
        

Acent = img - Suavi

Boost = A * img- Suavi

# Boost = (A-1)  * img+ Suavi

for in range (row):
    for j in range (col):

            Suavi[i, j] = Suavi[i, j]
        
            Acent[i, j] = Acent[i, j]
      
            Boost[i, j] = Boost[i, j]


cv2.imshow('Original Monocromo', img)
cv2.imshow('Imagen Suavizada', Suavi)
cv2.imshow('Imagen Acentuada', Acent)
cv2.imshow('Imagen Higboots', Boost)    
                
k=cv2. waitKey(0)
if k == ord ('e'):
    cv2.destroyAllWindows()
elif k == ord('s'):
    plt.imwrite('C:\Users\EROS\Pictures\Procesamiento Digital\Foto1.jpg',g)

    cv2.destroyAllWindows()








          Foto 4. Ejemplo de una imagen original y su función de suavizado con filtro de 5x5. 



   
     Foto 5. Ejemplo de una imagen original y su función de acentuamiento con filtro de 5x5.







  Foto 6. Ejemplo de una imagen original y su función de High-Boots con filtro de 5x5.

Nota: La función High-Boots no logre resolverla de la manera correcta, utilice la función correspondiente pero no se cual es mi error.



Referencias

[1]http://alojamientos.us.es/gtocoma/pid/tema1-2.pdf
[2]http://alojamientos.us.es/gtocoma/pid/tema3-1.pdf

  Consulta 16 de Noviembre del 2016
  Consulta 21 de Noviembre del 2016