Python | Filtrado Bilateral

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í,  GA[I]_p  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. I_q  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. \sigma_s  denota la extensión espacial del núcleo, es decir, el tamaño de la vecindad, y  \sigma_r  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  \sigma_r  , más nítido será el borde. Como  \sigma_r  tiende al infinito, la ecuación tiende a un desenfoque gaussiano.
OpenCV tiene una función llamada bilateralFilter() con los siguientes argumentos: 
 

  1. d: Diámetro de cada vecindad de píxeles.
  2. sigmaColor: Valor de  \sigma  en el espacio de color. Cuanto mayor sea el valor, los colores más alejados entre sí comenzarán a mezclarse.
  3. sigmaSpace: Valor de  \sigma  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

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *