Se utiliza un filtro bilateral para suavizar las imágenes y reducir el ruido, conservando los bordes . Este artículo explica un enfoque que usa el filtro de promedio, mientras que este artículo proporciona uno que usa un filtro de mediana. Sin embargo, estas circunvoluciones a menudo dan como resultado una pérdida de información de borde importante, ya que borran todo, independientemente de que sea ruido o un borde. Para contrarrestar este problema, se introdujo el filtro bilateral no lineal.
Desenfoque gaussiano
El desenfoque gaussiano se puede formular de la siguiente manera:
Aquí, está el resultado en el píxel p , y el RHS es esencialmente una suma sobre todos los píxeles q ponderados por la función gaussiana. es la intensidad en el píxel q .
Filtro bilateral: un término de borde adicional
El filtro bilateral se puede formular de la siguiente manera:
Aquí, el factor de normalización y el peso del rango son términos nuevos agregados a la ecuación anterior. denota la extensión espacial del núcleo, es decir, el tamaño de la vecindad, y denota la amplitud mínima de un borde. Garantiza que solo aquellos píxeles con valores de intensidad similares a los del píxel central se consideren para el desenfoque, mientras que se mantienen los cambios bruscos de intensidad. Cuanto menor sea el valor de , más nítido será el borde. Como tiende al infinito, la ecuación tiende a un desenfoque gaussiano.
OpenCV tiene una función llamada bilateralFilter() con los siguientes argumentos:
- d: Diámetro de cada vecindad de píxeles.
- sigmaColor: Valor de en el espacio de color. Cuanto mayor sea el valor, los colores más alejados entre sí comenzarán a mezclarse.
- sigmaSpace: Valor de en el espacio de coordenadas. Cuanto mayor sea su valor, más píxeles adicionales se mezclarán, dado que sus colores se encuentran dentro del rango sigmaColor.
Código:
Entrada: Imagen ruidosa.
Código: Implementación de filtrado bilateral
Python
import cv2 # Read the image. img = cv2.imread('taj.jpg') # Apply bilateral filter with d = 15, # sigmaColor = sigmaSpace = 75. bilateral = cv2.bilateralFilter(img, 15, 75, 75) # Save the output. cv2.imwrite('taj_bilateral.jpg', bilateral)
Salida de filtro bilateral
Comparación con los filtros Promedio y Mediano
A continuación se muestra la salida del filtro promedio (cv2.blur(img, (5, 5))).
A continuación se muestra la salida del filtro mediano (cv2.medianBlur(img, 5)).
A continuación se muestra la salida del filtro gaussiano (cv2.GaussianBlur(img, (5, 5), 0)).
Es fácil notar que todos estos filtros de eliminación de ruido manchan los bordes, mientras que el Filtrado Bilateral los retiene.
Publicación traducida automáticamente
Artículo escrito por Anannya Uberoi 1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA