Efectos de filtro simples de OpenCV

OpenCV proporciona una gran cantidad de algoritmos de procesamiento de imágenes y visión por computadora, ampliamente utilizados en áreas como el procesamiento de imágenes, el análisis de video y la detección de objetos.

Este artículo explicará cómo utilizar OpenCV para implementar varios efectos de filtro simples, incluyendo escala de grises, vintage y relieve.

A continuación se muestran los principales efectos de filtro:

Efecto de filtroMétodo de implementación
Filtro de escala de grisescv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
Filtro vintageAjustando los pesos de los canales de color, se simula el efecto de una foto antigua.
Filtro de relieveUsando un núcleo de convolución[[-2, -1, 0], [-1, 1, 1], [0, 1, 2]]para realizar la operación de convolución.
Filtro de desenfoquecv2.GaussianBlur(image, (15, 15), 0)
Filtro de nitidezUsando un núcleo de convolución[[0, -1, 0], [-1, 5, -1], [0, -1, 0]]para realizar la operación de convolución.
Filtro de detección de bordescv2.Canny(gray_image, 100, 200)

1. Filtro de escala de grises

El filtro de escala de grises es uno de los filtros más simples; convierte una imagen en color a una imagen en escala de grises.

La imagen en escala de grises tiene un solo canal, y el valor de cada píxel representa la luminosidad.

Pasos de implementación

  1. Leer la imagen.
  2. Usarcv2.cvtColor()la función para convertir la imagen del espacio de color BGR al espacio de color de escala de grises.

Ejemplo

import cv2

# Leer la imagen
image = cv2.imread('input.jpg')

# Convertir a imagen en escala de grises
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# Guardar la imagen en escala de grises
cv2.imwrite('gray_output.jpg', gray_image)

# Mostrar la imagen en escala de grises
cv2.imshow('Gray Image', gray_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

Análisis del código:

  • cv2.imread('input.jpg'): Lee el archivo de imagen.
  • cv2.cvtColor(image, cv2.COLOR_BGR2GRAY): Convierte la imagen del espacio de color BGR al espacio de color de escala de grises.
  • cv2.imwrite('gray_output.jpg', gray_image): Guarda la imagen en escala de grises.
  • cv2.imshow('Gray Image', gray_image): Muestra la imagen en escala de grises.

2. Filtro vintage

El filtro vintage ajusta los canales de color de la imagen para darle un aspecto retro.

Normalmente, el filtro vintage aumenta la intensidad de los canales rojo y verde, mientras reduce la intensidad del canal azul.

Pasos de implementación

  1. Leer la imagen.
  2. Separar los canales BGR de la imagen.
  3. Ajustar la intensidad de cada canal.
  4. Fusionar los canales para generar una imagen con efecto vintage.

Ejemplo

import cv2
import numpy as np

# Leer la imagen
image = cv2.imread('input.jpg')

# Separar los canales BGR
b, g, r = cv2.split(image)

# Ajustar la intensidad de los canales
r = np.clip(r * 0.393 + g * 0.769 + b * 0.189, 0, 255).astype(np.uint8)
g = np.clip(r * 0.349 + g * 0.686 + b * 0.168, 0, 255).astype(np.uint8)
b = np.clip(r * 0.272 + g * 0.534 + b * 0.131, 0, 255).astype(np.uint8)

# Fusionar los canales
vintage_image = cv2.merge((b, g, r))

# Guardar la imagen vintage
cv2.imwrite('vintage_output.jpg', vintage_image)

# Mostrar la imagen vintage
cv2.imshow('Vintage Image', vintage_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

Análisis del código:

  • cv2.split(image): Separa los canales BGR de la imagen.
  • np.clip(): Asegura que los valores de píxel estén entre 0 y 255.
  • cv2.merge((b, g, r)): Fusiona los canales ajustados para generar una imagen con efecto vintage.

3. Filtro de relieve

El filtro de relieve calcula la diferencia entre píxeles adyacentes en la imagen para generar un efecto similar a un relieve; este filtro se utiliza generalmente para realzar los bordes y las texturas de la imagen.

Pasos de implementación

  1. Leer la imagen.
  2. Convertir la imagen a escala de grises.
  3. Usar un núcleo de convolución para calcular el efecto de relieve.

Ejemplo

import cv2
import numpy as np

# Leer la imagen
image = cv2.imread('input.jpg')

# Convertir a imagen en escala de grises
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# Definir el núcleo de convolución
kernel = np.array([[-2, -1, 0],
                   [-1,  1, 1],
                   [ 0,  1, 2]])

# Aplicar el núcleo de convolución
emboss_image = cv2.filter2D(gray_image, -1, kernel)

# Guardar la imagen en relieve
cv2.imwrite('emboss_output.jpg', emboss_image)

# Mostrar la imagen en relieve
cv2.imshow('Emboss Image', emboss_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

Análisis del código:

  • cv2.cvtColor(image, cv2.COLOR_BGR2GRAY): Convierte la imagen a escala de grises.
  • cv2.filter2D(gray_image, -1, kernel): Aplica el núcleo de convolución para generar el efecto de relieve.

4. Filtro de desenfoque

El filtro de desenfoque suaviza la imagen, reduciendo el ruido y los detalles de la imagen.

Ejemplo

import cv2

# Leer la imagen
image = cv2.imread("path/to/image.jpg")

# Filtro de desenfoque
blurred_image = cv2.GaussianBlur(image, (15, 15), 0)

# Mostrar el resultado
cv2.imshow("Blur Filter", blurred_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

5. Filtro de nitidez

El filtro de nitidez realza los bordes de la imagen para hacerla más nítida.

Ejemplo

import cv2
import numpy as np

# Leer la imagen
image = cv2.imread("path/to/image.jpg")

# Filtro de nitidez
sharpen_kernel = np.array([[0, -1, 0],
                           [-1, 5, -1],
                           [0, -1, 0]])
sharpened_image = cv2.filter2D(image, -1, sharpen_kernel)

# Mostrar el resultado
cv2.imshow("Sharpen Filter", sharpened_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

6. Filtro de detección de bordes

El filtro de detección de bordes detecta los bordes de la imagen para resaltar los contornos de los objetos.

Ejemplo

import cv2

# Leer la imagen
image = cv2.imread("path/to/image.jpg")

# Convertir a imagen en escala de grises
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# Filtro de detección de bordes
edges_image = cv2.Canny(gray_image, 100, 200)

# Mostrar el resultado
cv2.imshow("Edges Filter", edges_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
Otras extensiones