En este artículo, veremos acerca de la función filter2d() de OpenCV. En pocas palabras, con esta función, podemos convolucionar una imagen con el kernel (típicamente una array 2d) para aplicar un filtro a las imágenes.
Sintaxis: filter2D (src, dst, d depth, kernel)
Parámetros:
- Src: la imagen de origen para aplicar el filtro.
- Dst: nombre de la imagen de salida después de aplicar el filtro
- Dprofundidad: profundidad de la imagen de salida [-1 le dará a la imagen de salida la misma profundidad que la imagen de entrada]
- Kernel: la array 2d con la que queremos que convolucione la imagen.
Usando esta función, podemos crear una convolución entre la imagen y el kernel dado para crear filtros como suavizado y desenfoque, nitidez y detección de bordes en una imagen. Esta función simplemente convolucionará la array 2d con la imagen a nivel de píxel y producirá una imagen de salida. Para entender este concepto, primero analizaremos el concepto del kernel.
Kernel: una array 2d simple utilizada en convolución o array de convolución o una máscara utilizada para desenfocar, agudizar y detectar bordes en una imagen.
Funcionamiento del kernel: Entonces, ¿cómo funciona este kernel? Veamos, todos sabemos que las imágenes se representan como valores de píxeles en OpenCV. Estos píxeles están dispuestos como una array para formar una imagen y, como sabemos, un kernel es una array 2d simple con valores específicos basados en la función del kernel, como si el kernel se usara para desenfocar y enfocar las imágenes son diferentes.
Tomemos un ejemplo, en esta imagen tome las primeras 3 filas y columnas como una array y tenemos un núcleo de array de 3 por 3. Cada uno de los píxeles de la imagen tiene un valor de píxel (es decir, intensidad de píxel) como se muestra. Ahora la convolución se realiza multiplicando los valores de cada valor de píxel con el valor del kernel en los lugares respectivos y sumando todos los valores que fueron ponderados por el kernel al multiplicar y formar un píxel (el píxel central que en este caso es [ 2,2]). Y este método se repite para el resto de las arrays de valor de píxel de la imagen.
Nota: Tenemos núcleos específicos [arrays de convolución 2d] para realizar tareas específicas como desenfoque, nitidez y detección de bordes. Y el kernel que se muestra en la imagen es solo un ejemplo y no un kernel específico.
Algunos núcleos comunes son,
- Núcleo de identidad
- Núcleo de detección de bordes
- Núcleo de afilado
- Núcleo de desenfoque de caja
- Núcleo de desenfoque gaussiano
Con el uso de estos núcleos, podemos formar la imagen filtrada simplemente convolucionando los valores de píxel de la imagen y los valores en el núcleo.
Desenfocar una imagen con una array de convolución 2d
Estamos creando un kernel por NumPy que se verá así y pasando el kernel como un parámetro de la función filter2d.
np.ones() creará una array de la forma deseada rellenada con los unos
Ejemplo 1: Desenfocar una imagen con una array de convolución 2d
Python3
# importing the modules needed import cv2 import numpy as np # Reading the image image = cv2.imread('image.png') # Creating the kernel(2d convolution matrix) kernel1 = np.ones((5, 5), np.float32)/30 # Applying the filter2D() function img = cv2.filter2D(src=image, ddepth=-1, kernel=kernel1) # Shoeing the original and output image cv2.imshow('Original', image) cv2.imshow('Kernel Blur', img) cv2.waitKey() cv2.destroyAllWindows()
Producción:
Ejemplo 2: Edge detecta una imagen con una array de convolución 2d
Estamos creando un kernel por array NumPy que se verá así y pasando el kernel como un parámetro de la función filter2d.
Python3
# importing the modules needed import cv2 import numpy as np # Reading the image image = cv2.imread('image.png') # Creating the kernel(2d convolution matrix) kernel2 = np.array([[-1, -1, -1], [-1, 8, -1], [-1, -1, -1]]) # Applying the filter2D() function img = cv2.filter2D(src=image, ddepth=-1, kernel=kernel2) # Shoeing the original and output image cv2.imshow('Original', image) cv2.imshow('Kernel Blur', img) 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