Python OpenCV: suavizado y desenfoque

En este artículo, vamos a aprender sobre suavizado y desenfoque con python-OpenCV.

Cuando tratamos con imágenes en algunos puntos, las imágenes serán más nítidas y nítidas, por lo que debemos suavizarlas o difuminarlas para obtener una imagen limpia, o a veces la imagen tendrá un borde realmente malo, por lo que también debemos suavizarla. la imagen utilizable. En OpenCV, tenemos más de un método para suavizar o desenfocar una imagen, analicémoslos uno por uno.

Método 1: con convolución 2D  

En este método de suavizado, tenemos total flexibilidad sobre el proceso de filtrado porque usaremos nuestro kernel personalizado [una array 2d simple de array NumPy que nos ayuda a procesar la imagen convolucionando con la imagen píxel por píxel]. Un kernel básicamente dará un peso específico para cada píxel en una imagen y sumará los píxeles vecinos ponderados para formar un píxel, con este método podremos comprimir los píxeles en una imagen y así podemos reducir la claridad de una imagen , Con este método, podemos suavizar o desenfocar una imagen fácilmente.  

Nota: al usar estos núcleos [arrays 2d] podemos realizar muchas funciones como afilar y detectar bordes en una imagen. Pero recuerde que cada proceso tiene un núcleo diferente, es decir, diferentes valores de arrays. El kernel que vamos a usar en este artículo es un kernel de promedio de 5 por 5 que es básicamente una array de unos que en su totalidad se divide por 25, que se verá así,

Para suavizar una imagen con un kernel personalizado, vamos a utilizar una función llamada filter2D() que básicamente nos ayuda a convolucionar un kernel personalizado con una imagen para lograr diferentes filtros de imagen, como nitidez, desenfoque y más.

Sintaxis: filter2D(imagenfuente, profundidad, núcleo)

Código :

Python3

# Importing the modules
import cv2
import numpy as np
 
# Reading the image
image = cv2.imread('image.png')
 
# Creating the kernel with numpy
kernel2 = np.ones((5, 5), np.float32)/25
 
# Applying the filter
img = cv2.filter2D(src=image, ddepth=-1, kernel=kernel2)
 
# showing the image
cv2.imshow('Original', image)
cv2.imshow('Kernel Blur', img)
 
cv2.waitKey()
cv2.destroyAllWindows()

Producción:

Método 2: con funciones preconstruidas

OpenCV viene con muchas funciones de desenfoque y suavizado preconstruidas, veamos brevemente,

1. Promedio:

Sintaxis: cv2.blur(imagen, formaDelKernel)

  • Imagen : la imagen que necesita suavizar
  • shapeOfTheKernel – La forma de la array 3 por 3 / 5 por 5

El método de promedio es muy similar al método de convolución 2D, ya que sigue las mismas reglas para suavizar o desenfocar una imagen y utiliza el mismo tipo de kernel que básicamente establecerá el valor del píxel central en el promedio de los píxeles circundantes ponderados del kernel. Y con esto, podemos reducir en gran medida el ruido de la imagen al reducir la claridad de una imagen al reemplazar el grupo de píxeles con valores similares, que es básicamente un color similar. Podemos reducir en gran medida el ruido de la imagen y suavizar la imagen. El núcleo que estamos usando para este método es la forma deseada de una array con todos los valores como «1» y toda la array se divide por el número de valores en la forma respectiva de la array [que básicamente es el promedio de los valores ponderados del núcleo en el rango de píxeles]. El kernel que usamos en este ejemplo es,

Código :

Python3

# Importing the modules
import cv2
import numpy as np
 
# Reading the image
image = cv2.imread('image.png')
 
# Applying the filter
averageBlur = cv2.blur(image, (5, 5))
 
# Showing the image
cv2.imshow('Original', image)
cv2.imshow('Average blur', averageBlur)
 
cv2.waitKey()
cv2.destroyAllWindows()

Producción:

2. Desenfoque gaussiano:

Sintaxis: cv2. GaussianBlur(imagen, formaDelKernel, sigmaX )

  • Imagen : la imagen que necesitas desenfocar
  • shapeOfTheKernel – La forma de la array 3 por 3 / 5 por 5
  • sigmaX : la desviación estándar del núcleo gaussiano, que es el valor predeterminado establecido en 0

En un desenfoque gaussiano, en lugar de usar un filtro de caja que consta de valores similares dentro del núcleo, que es una media simple, vamos a usar una media ponderada. En este tipo de kernel, los valores cercanos al píxel central tendrán un mayor peso. Con este tipo de desenfoque, probablemente obtendremos una imagen menos borrosa pero una imagen borrosa natural que se verá más natural porque maneja muy bien los valores de los bordes. En lugar de promediar la suma ponderada de los píxeles aquí, la dividiremos con un valor específico que es 16 en el caso de un kernel con forma de 3 por 3 que se verá así.

Nota: Podemos lograr el mismo resultado cuando usamos exactamente el mismo kernel en la función filter2D() pero, en este caso, no necesitamos crear el kernel porque esta función lo hará automáticamente por nosotros.

Código :

Python3

# Importing the module
import cv2
import numpy as np
 
# Reading the image
image = cv2.imread('image.png')
 
# Applying the filter
gaussian = cv2.GaussianBlur(image, (3, 3), 0)
 
# Showing the image
cv2.imshow('Original', image)
cv2.imshow('Gaussian blur', gaussian)
 
cv2.waitKey()
cv2.destroyAllWindows()

Producción:

3. Desenfoque medio:

Sintaxis: CV. mediana de Blur (imagen, tamaño del kernel)

  • Imagen : la imagen que necesitamos para aplicar el suavizado.
  • KernelSize : el tamaño del kernel, ya que siempre toma una array cuadrada, el valor debe ser un número entero positivo mayor que 2.

Nota : No hay valores de kernel específicos para este método.

En este método de suavizado, simplemente tomaremos la mediana de todos los píxeles dentro de la ventana del kernel y reemplazaremos el valor central con este valor. Lo único positivo de este método sobre el desenfoque gaussiano y de cuadro es que, en estos dos casos, el valor central reemplazado puede contener un valor de píxel que ni siquiera está presente en la imagen, lo que hará que el color de la imagen sea diferente y extraño, pero en caso de un desenfoque mediano, aunque toma la mediana de los valores que ya están presentes en la imagen, se verá mucho más natural.

Código :

Python3

# Importing the modules
import cv2
import numpy as np
 
# Reading the image
image = cv2.imread('image.png')
 
# Applying the filter
medianBlur = cv2.medianBlur(image, 9)
 
# Showing the image
cv2.imshow('Original', image)
cv2.imshow('Median blur', medianBlur)
 
cv2.waitKey()
cv2.destroyAllWindows()

Producción:

4. Desenfoque bilateral:

Sintaxis: cv2.bilateralFilter(imagen, diámetro, sigmaColor, sigmaSpace)

  • Imagen : la imagen que necesitamos para aplicar el suavizado.
  • Diámetro : similar al tamaño del grano.
  • SigmaColor : la cantidad de colores que se considerarán en el rango de píxeles dado [el valor más alto representa el aumento en la cantidad de colores en el área de píxeles dada]: no debe mantenerse muy alto
  • SigmaSpace : el espacio entre el píxel sesgado y el valor más alto del píxel vecino significa que los píxeles alejados del píxel manipularán el valor del píxel

Los métodos de suavizado que vimos anteriormente son rápidos, pero podríamos terminar perdiendo los bordes de la imagen, lo que no es tan bueno. Pero al usar este método, esta función se preocupa más por los bordes y suaviza la imagen al preservar las imágenes. Esto se logra realizando dos distribuciones gaussianas. Esto puede ser muy lento en comparación con los otros métodos que discutimos hasta ahora.  

Código:

Python3

# Importing the modules
import cv2
import numpy as np
 
# Reading the image
image = cv2.imread('image.png')
 
# Applying the filter
bilateral = cv2.bilateralFilter(image, 9, 75, 75)
 
# Showing the image
cv2.imshow('Original', image)
cv2.imshow('Bilateral blur', bilateral)
 
cv2.waitKey()
cv2.destroyAllWindows()

Producción:

Publicación traducida automáticamente

Artículo escrito por sanjaysdev0901 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 *