Cómo empezar con el procesamiento de imágenes: un recorrido por la biblioteca OpenCV

Autor: Zen y el arte de la programación informática

1. Introducción

En el campo del procesamiento de imágenes, OpenCV (Biblioteca de visión por computadora de código abierto) es una biblioteca de visión por computadora multiplataforma de código abierto. Se utiliza principalmente en procesamiento de imágenes, visión artificial y otras aplicaciones. Debido a sus potentes funciones y su amplia gama de aplicaciones, se utiliza ampliamente en muchos campos, como el aprendizaje automático, el análisis de datos, la conducción autónoma, la recuperación de imágenes, el seguimiento de movimiento y el análisis de vídeo. Por lo tanto, dominar OpenCV es una habilidad imprescindible. Este artículo presentará brevemente cómo comenzar con el procesamiento de imágenes y cómo utilizar OpenCV para el procesamiento de imágenes.

2. Preparación del entorno experimental.

1) Hardware: computadora portátil (Windows/Mac OS); 2) Software: a) IDE: Visual Studio Code (vscode)/PyCharm Professional Edition (pago); b) Python: Anaconda 3+ (incluidos los paquetes NumPy y Matplotlib) /Python 3.x (no se requieren bibliotecas adicionales).

3.Esquema del curso

1) Introducción a OpenCV, descarga e instalación; 2) Cargar imágenes y mostrarlas; 3) Operaciones básicas de imágenes; 4) Conversión de espacio de color y separación de canales; 5) Filtrado de imágenes y detección de bordes; 6) Operaciones morfológicas y extracción de contornos; 7 ) Coincidencia de plantillas; 8) Introducción al aprendizaje profundo y algoritmos de detección de objetivos; 9) Resumen y sugerencias.

  1. Introducción a OpenCV, descarga e instalación OpenCV (Biblioteca de visión por computadora de código abierto) es una biblioteca de visión por computadora multiplataforma de código abierto. Se utiliza principalmente para procesamiento de imágenes, visión artificial y otras aplicaciones. Para las tareas principales de procesamiento de imágenes, puede utilizar varias interfaces de funciones proporcionadas por OpenCV. A continuación, presentamos brevemente OpenCV y lo descargamos e instalamos desde el sitio web oficial.

Sitio web oficial de OpenCV: https://opencv.org/

Dirección de descarga de OpenCV: https://github.com/opencv/opencv/releases

Tutorial de instalación: https://docs.opencv.org/master/d7/d9f/tutorial_linux_install.html

  1. Cargar imágenes y mostrarlas Primero, importe la biblioteca cv2 y cree una ventana. Luego lea la imagen y cárguela a través de la función imread.El parámetro especifica la ruta de la imagen o el nombre del archivo, y el segundo parámetro especifica el modo de lectura. El tercer parámetro indica si la imagen es transparente. Finalmente, llame a la función imshow para mostrar la imagen en la ventana.
import cv2 

cv2.namedWindow('image') # 创建一个窗口

cv2.imshow("image", img) # 在窗口显示图片

cv2.waitKey(0) # 等待按键
cv2.destroyAllWindows() # 销毁所有窗口
  1. Operaciones básicas de imágenes En OpenCV, las imágenes pueden entenderse como matrices multidimensionales y el valor de cada píxel de la imagen es el valor del elemento en la matriz. Puede realizar algunas operaciones básicas con matrices, como inversión, escalado, rotación, inversión, recorte, etc. Aquí, presentamos varias operaciones de imágenes básicas de uso común.

El método resize() puede cambiar el tamaño de la imagen:

img = cv2.resize(img,(int(w/2), int(h/2))) # 调整图片尺寸为原始大小的一半

El método rotar() puede rotar la imagen:

rows, cols, chnals = img.shape 
M = cv2.getRotationMatrix2D((cols / 2, rows / 2), 90, 1)
dst = cv2.warpAffine(img, M, (cols, rows))

El método cvtColor() convierte el espacio de color de una imagen:

gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # BGR 转灰度图

El método blur() puede desenfocar la imagen:

kernel = np.ones((5,5),np.float32)/25
blurred_img = cv2.filter2D(img,-1,kernel) # 对原图像做模糊化
  1. Conversión del espacio de color y separación de canales Las operaciones básicas de las imágenes se introdujeron anteriormente, incluido el cambio de tamaño, la rotación, la conversión del espacio de color, el desenfoque, etc. Hay muchas operaciones de procesamiento de imágenes en OpenCV, que se implementan modificando los elementos de la matriz. Sin embargo, en algunos casos nos encontraremos con situaciones en las que la matriz no se puede manipular directamente. Por ejemplo, si queremos dibujar un círculo en la imagen, podemos usar la función cv2.circle(). Sin embargo, esta función necesita conocer las coordenadas del centro y el radio, y esta información no se refleja en la matriz. Por lo tanto, para procesar imágenes de manera más intuitiva, necesitamos comprender los conceptos de espacio y canales de color.

Espacio de color: diferentes sistemas o dispositivos de color representan píxeles de diferentes maneras, lo que da como resultado imágenes en color que no pueden presentar intuitivamente su significado físico. El espacio RGB comúnmente utilizado en las computadoras no puede describir completamente las diferencias de color, por lo que es necesario definir un nuevo espacio de color. como YUV, HSV, etc.

Canal: cada píxel de la imagen se compone de varios componentes y se utilizan diferentes canales para expresar información diferente. Por ejemplo, los tres componentes de color de R, G y B en el espacio RGB representan la intensidad de los tres colores rojo, verde y azul, mientras que los tres componentes de color de L, U y V representan el brillo, el tono. y saturación. Generalmente, los valores de píxeles en el espacio RGB son continuos, mientras que los valores de píxeles en otros espacios son discretos.

OpenCV proporciona la función cvtColor() para convertir el espacio de color y la separación de canales de la imagen. A continuación, usamos cvtColor() para convertir la imagen del espacio de color BGR al espacio de color HSV y mostrar su componente V.

hsv_img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) # 从 BGR 色彩空间转换为 HSV 色彩空间
v_channel = hsv_img[:, :, 2] # 获取 HSV 空间的 V 分量

cv2.imshow('V channel', v_channel) # 显示 V 分量
cv2.waitKey(0)
cv2.destroyAllWindows()

El segundo parámetro de la función cv2.cvtColor () se utiliza para especificar el espacio de color de la imagen de origen y el espacio de color de la imagen de destino. Los dos números siguientes representan el número de canales de la imagen de origen y el número de canales de la imagen de destino. Si solo hay un parámetro, el valor predeterminado es el espacio de color RGB.

Separación de canales: existe cvtColor() en OpenCV que puede convertir una imagen de un espacio de color a otro, pero no se puede usar directamente para la separación de canales de una imagen. En este caso, solo podemos usar la función reshape() en la biblioteca numpy para completar la separación de canales. La función reshape() puede cambiar la forma de una matriz y convertir una matriz multidimensional en una matriz bidimensional.

A continuación, separamos el componente V del espacio de color HSV y mostramos sus imágenes originales y separadas.

v_original = img[:,:,2].copy() # 获取原图的 V 通道
v_hsv = hsv_img[:,:,2].copy() # 获取 HSV 色彩空间的 V 通道

v_original = np.expand_dims(v_original, axis=-1) # 扩展维度使得通道数为 3
v_hsv = np.expand_dims(v_hsv, axis=-1) # 扩展维度使得通道数为 3

v_decomposed = np.concatenate([v_hsv, v_original], axis=2) # 拼接 HSV 和原图的 V 分量

v_hsv_only = v_decomposed[:,:,:1] # 只保留 HSV 中的 V 分量
v_original_only = v_decomposed[:,:,1:] # 只保留原图中的 V 分量

cv2.imshow('Original image only V', v_original_only) # 显示原图的 V 分量
cv2.imshow('HSV only V', v_hsv_only) # 显示 HSV 的 V 分量
cv2.waitKey(0)
cv2.destroyAllWindows()

A través de los ejemplos anteriores, podemos ver que el color de la imagen no solo está determinado por los tres canales R, G y B, sino que también puede codificarse por los componentes V, H y S. Al mismo tiempo, mediante la separación de canales, podemos distinguir ciertos canales en la imagen original de ciertos canales en HSV, lo que mejora la eficiencia del procesamiento de imágenes.

  1. Filtrado de imágenes y detección de bordes El filtrado de imágenes es una operación importante en el procesamiento de imágenes. Suavizar y desenfocar la imagen mediante filtros puede eliminar el ruido y los puntos aislados, haciendo que la imagen sea clara y suave. OpenCV nos proporciona varios filtros, lo que nos permite lograr rápidamente varios efectos.

A continuación, utilizamos el filtro medio para desenfocar la imagen original y mostrar los resultados.

blur_img = cv2.blur(img,(5,5)) # 用均值滤波器对原图进行模糊化

cv2.imshow('Blur image', blur_img) # 显示模糊化后的图片
cv2.waitKey(0)
cv2.destroyAllWindows()

Detección de bordes: en las imágenes, los bordes a menudo representan la dirección cambiante o la información estructural de la imagen y son objetos muy importantes en el análisis de imágenes y la visión por computadora. OpenCV proporciona varios métodos de detección de bordes, como el filtro Sobel, el algoritmo de detección de bordes Canny, el método de gradiente de Hough, etc.

A continuación, utilizamos el método de detección de bordes Canny para realizar la detección de bordes y mostrar los resultados.

edges = cv2.Canny(img,100,200) # 使用 Canny 边缘检测方法

cv2.imshow('Edges detected', edges) # 显示检测出的边缘
cv2.waitKey(0)
cv2.destroyAllWindows()

Además del filtrado de imágenes y la detección de bordes, OpenCV también tiene algoritmos como operaciones de morfología de imágenes, coincidencia de plantillas, aprendizaje profundo y detección de objetivos. Estos algoritmos tienen diferentes funciones, pero todos pueden ayudarnos a resolver diferentes problemas de procesamiento de imágenes.

Supongo que te gusta

Origin blog.csdn.net/universsky2015/article/details/133504707
Recomendado
Clasificación