Como começar com o processamento de imagens: um tour pela biblioteca OpenCV

Autor: Zen e a arte da programação de computadores

1. Introdução

No campo do processamento de imagens, OpenCV (Open Source Computer Vision Library) é uma biblioteca de visão computacional de plataforma cruzada de código aberto. É usado principalmente em processamento de imagens, visão de máquina e outras aplicações. Devido às suas funções poderosas e ampla gama de aplicações, é amplamente utilizado em muitos campos, como aprendizado de máquina, análise de dados, direção autônoma, recuperação de imagens, rastreamento de movimento e análise de vídeo. Portanto, dominar o OpenCV é uma habilidade obrigatória. Este artigo apresentará resumidamente como começar a processar imagens e usar OpenCV para processamento de imagens.

2. Preparação do ambiente experimental

1) Hardware: Laptop (Windows/Mac OS); 2) Software: a) IDE: Visual Studio Code (vscode)/PyCharm Professional Edition (pago); b) Python: Anaconda 3+ (incluindo pacotes NumPy e Matplotlib) /Python 3.x (não são necessárias bibliotecas adicionais).

3. Esboço do curso

1) Introdução ao OpenCV, download e instalação; 2) Carregar imagens e exibi-las; 3) Operações básicas de imagem; 4) Conversão de espaço de cores e separação de canais; 5) Filtragem de imagens e detecção de bordas; 6) Operações morfológicas e extração de contornos; 7 ) Correspondência de modelos; 8) Introdução aos algoritmos de aprendizagem profunda e detecção de alvos; 9) Resumo e sugestões.

  1. Introdução ao OpenCV, download e instalação OpenCV (Open Source Computer Vision Library) é uma biblioteca de visão computacional de plataforma cruzada de código aberto. É usado principalmente para processamento de imagens, visão de máquina e outras aplicações. Para tarefas primárias de processamento de imagem, você pode usar várias interfaces de função fornecidas pelo OpenCV. A seguir, apresentamos brevemente o OpenCV, baixamos e instalamos do site oficial.

Site oficial do OpenCV: https://opencv.org/

Endereço de download do OpenCV: https://github.com/opencv/opencv/releases

Tutorial de instalação: https://docs.opencv.org/master/d7/d9f/tutorial_linux_install.html

  1. Carregando imagens e exibindo-as Primeiro, importe a biblioteca cv2 e crie uma janela. Em seguida, leia a imagem e carregue-a por meio da função imread.O parâmetro especifica o caminho da imagem ou nome do arquivo e o segundo parâmetro especifica o modo de leitura. O terceiro parâmetro indica se a imagem é transparente. Por fim, chame a função imshow para exibir a imagem na janela.
import cv2 

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

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

cv2.waitKey(0) # 等待按键
cv2.destroyAllWindows() # 销毁所有窗口
  1. Operações básicas de imagem No OpenCV, as imagens podem ser entendidas como matrizes multidimensionais, e o valor de cada pixel na imagem é o valor do elemento na matriz. Você pode realizar algumas operações básicas em matrizes, como inversão, dimensionamento, rotação, inversão, corte, etc. Aqui, apresentamos várias operações básicas de imagem comumente usadas.

O método resize() pode redimensionar a imagem:

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

O método rotate() pode girar a imagem:

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

O método cvtColor() converte o espaço de cores de uma imagem:

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

O método blur() pode desfocar a imagem:

kernel = np.ones((5,5),np.float32)/25
blurred_img = cv2.filter2D(img,-1,kernel) # 对原图像做模糊化
  1. Conversão do espaço de cores e separação de canais As operações básicas de imagens foram introduzidas anteriormente, incluindo redimensionamento, rotação, conversão do espaço de cores, desfoque, etc. Existem muitas operações de processamento de imagem no OpenCV, que são implementadas modificando os elementos da matriz. Porém, em alguns casos, encontraremos situações em que a matriz não pode ser manipulada diretamente. Por exemplo, se quisermos desenhar um círculo na imagem, podemos usar a função cv2.circle(). Porém, esta função precisa conhecer as coordenadas do centro e o raio, e esta informação não é refletida na matriz. Portanto, para processar imagens de forma mais intuitiva, precisamos entender os conceitos de espaço de cores e canais.

Espaço de cores: Diferentes sistemas ou dispositivos de cores representam pixels de maneiras diferentes, resultando em imagens coloridas incapazes de apresentar intuitivamente seu significado físico. O espaço RGB comumente usado em computadores não pode descrever completamente as diferenças de cores, portanto, um novo espaço de cores precisa ser definido. como YUV, HSV, etc.

Canal: Cada pixel da imagem é composto por vários componentes, e diferentes canais são usados ​​para expressar diferentes informações. Por exemplo, os três componentes de cor de R, G e B no espaço RGB representam a intensidade das três cores vermelho, verde e azul, enquanto os três componentes de cor de L, U e V representam o brilho, matiz e saturação. Geralmente, os valores de pixel no espaço RGB são contínuos, enquanto os valores de pixel em outros espaços são discretos.

OpenCV fornece a função cvtColor() para converter o espaço de cores e a separação de canais da imagem. A seguir, usamos cvtColor() para converter a imagem do espaço de cores BGR para o espaço de cores HSV e exibir seu 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()

O segundo parâmetro da função cv2.cvtColor() é usado para especificar o espaço de cores da imagem de origem e o espaço de cores da imagem de destino. Os dois números a seguir representam o número de canais da imagem de origem e o número de canais de a imagem alvo. Se houver apenas um parâmetro, o padrão será o espaço de cores RGB.

Separação de canais: Existe cvtColor() no OpenCV que pode converter uma imagem de um espaço de cores para outro, mas não pode ser usado diretamente para separação de canais de uma imagem. Nesse caso, só podemos usar a função reshape() na biblioteca numpy para completar a separação dos canais. A função reshape() pode alterar a forma de uma matriz e converter um array multidimensional em um array bidimensional.

Abaixo, separamos o componente V do espaço de cores HSV e exibimos suas imagens originais e 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()

Através dos exemplos acima, podemos ver que a cor da imagem não é apenas determinada pelos três canais R, G e B, mas também pode ser codificada pelos componentes V, H e S. Ao mesmo tempo, através da separação de canais, podemos distinguir determinados canais da imagem original de determinados canais no HSV, melhorando a eficiência do processamento da imagem.

  1. Filtragem de imagens e detecção de bordas A filtragem de imagens é uma operação importante no processamento de imagens. Suavizar e desfocar a imagem através de filtros pode eliminar ruídos e pontos isolados, tornando a imagem nítida e suave. OpenCV nos fornece vários filtros, permitindo-nos obter rapidamente vários efeitos.

Abaixo, usamos o filtro médio para desfocar a imagem original e exibir os resultados.

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

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

Detecção de bordas: Em imagens, as bordas geralmente representam a mudança de direção ou informações estruturais da imagem e são objetos muito importantes na análise de imagens e na visão computacional. OpenCV fornece vários métodos de detecção de bordas, como filtro Sobel, algoritmo de detecção de bordas Canny, método de gradiente Hough, etc.

Abaixo, usamos o método de detecção de bordas Canny para realizar a detecção de bordas e exibir os resultados.

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

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

Além de filtragem de imagem e detecção de bordas, OpenCV também possui algoritmos como operações de morfologia de imagem, correspondência de modelos, aprendizado profundo e detecção de alvo.Esses algoritmos têm funções diferentes, mas todos podem nos ajudar a resolver diferentes problemas de processamento de imagem.

Acho que você gosta

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