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]
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.
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
Suavi[i, j] = Suavi[i, j]
10. Mostramos la imagen original.
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 i 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]
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()
Filtro pasa alto o de acentuamiento:
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]
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.
5.1 Dividiremos el array entre 9 ya que se esta usando el filtro media.
gauss = np.array([[1, 1, 1], [1, 1, 1], [1, 1, 1]], dtype=np.float)
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]
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 pltimport numpy
import cv2
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 i 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 i 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)
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)
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.
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
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 i 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 i 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)
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
No hay comentarios.:
Publicar un comentario