Processamento de imagens em OpenCV - alteração do espaço de cores + transformação geométrica da imagem

Processamento de imagens em OpenCV - alteração do espaço de cores + transformação geométrica da imagem

Esta parte apresenta principalmente a alteração do espaço de cores e a transformação geométrica da imagem no processamento de imagens OpenCV. A alteração do espaço de cores é amplamente utilizada. No problema real do processamento de imagens, muitas vezes é necessário transformar a imagem em uma escala de cinza de canal único imagem. Haverá um pequeno exemplo de rastreamento de cores neste artigo para facilitar o entendimento. A transformação geométrica de uma imagem é algo corriqueiro, mas existem alguns novos conceitos no processamento de imagens, como transformação afim e transformação de perspectiva, vamos direto trabalhar sem falar besteira!

1. Altere o espaço de cores

Em relação à mudança do espaço de cores, precisamos dominar duas funções importantes: cv.cvtColor e cv.inRange

1.1 Alterando o espaço de cores

Existem mais de 150 métodos de conversão de espaço de cores no OpenCV, mas só dominamos os dois mais usados:

BGR <-> tons de cinza e BGR <-> HSV

A função de conversão de cores cv.cvtColor() é muito simples. Você pode simplesmente passar dois parâmetros para ela? O primeiro parâmetro é nosso objeto de imagem e o segundo parâmetro representa o sinalizador de tipo que queremos converter

Para BGR → conversão em tons de cinza usamos o sinalizador cv.COLOR_BGR2GRAY. Da mesma forma para BGR → HSV usamos o sinalizador cv.COLOR_BGR2HSV

Para obter outros sinalizadores, você só precisa exibir todos os nomes de sinalizadores na biblioteca do terminal python para visualizar

>>> import cv2 as cv
>>> flags = [i for i in dir(cv) if i.startswith('COLOR_')]
>>> print( flags )

1.2 Rastreamento de objetos coloridos

Usamos um exemplo para demonstrar o rastreamento de objetos coloridos, que basicamente exibe apenas as cores necessárias no vídeo exibido para obter o efeito de rastreamento de cores

Mais fácil de exibir cores em HSV do que em BGR

Código

import cv2 as cv
import numpy as np
cap = cv.VideoCapture(0)
while(1):
     # 读取帧
     _, frame = cap.read()
     # 转换颜色空间 BGR 到 HSV
     hsv = cv.cvtColor(frame, cv.COLOR_BGR2HSV)
     # 定义HSV中蓝色的范围
     lower_blue = np.array([110,50,50])
     upper_blue = np.array([130,255,255])
     # 设置HSV的阈值使得只取蓝色
     mask = cv.inRange(hsv, lower_blue, upper_blue)
     # 将掩膜和图像逐像素相加
     res = cv.bitwise_and(frame,frame, mask= mask)
     cv.imshow('frame',frame)
     cv.imshow('mask',mask)
     cv.imshow('res',res)
     k = cv.waitKey(5) & 0xFF
     if k == 27:
    	 break
cv.destroyAllWindows()

insira a descrição da imagem aqui

Primeiro, criamos um objeto VideoCapture para capturar o vídeo e, em seguida, lemos o vídeo quadro a quadro durante o while. No processo de leitura do vídeo, precisamos filtrar a cor azul separadamente, portanto, algumas operações são necessárias

HSV é mais fácil de exibir cores do que BGR. Para exibir melhor, optamos por usar imagens HSV. Esse processo usa cv.cvtColor() para converter BGR para HSV. Existe uma função muito importante cv.inRange() no código .Função, esta função é usada para filtrar imagens em um determinado intervalo de pixels, que possui três parâmetros, o primeiro é o "quadro" atual, o segundo e o terceiro parâmetros são o intervalo de pixels fornecido

Existe também uma função muito importante cv.bitwise_and(), que tem dois propósitos principais:

  • Extraia a área selecionada da máscara: cv.bitwise_and(img1,img2,mask = mask)

Antes de tudo, precisamos saber que somos uma máscara. Quando processamos algumas imagens, precisamos selecionar a parte que queremos processar. Como determinamos essa parte? Isso é usar uma máscara de máscara para cobrir esta área

  • Encontre a interseção de duas imagens: cv.bitwise_and(img1,img2)

Esse uso é muito simples, os dois parâmetros passados ​​são dois objetos de imagem e o resultado retornado é a interseção dessas duas imagens

2. Transformação geométrica da imagem

Para a transformação geométrica da imagem do OpenCV, ele fornece duas funções de conversão: cv.warpAffine() e cv.warpPerspective()

cv.warpAffine usa uma matriz de transformação 2x3, enquanto cv.warpPerspective usa uma matriz de transformação 3x3 como entrada

2.1 Zoom

Dimensionamento da imagem Podemos usar cv.resize() para redefinir o tamanho da imagem. Existem dois métodos de interpolação dignos de nota, um é cv.INTER_AREA para diminuir o zoom e o outro é cv.INTER_CUBIC para dimensionar

import numpy as np
import cv2 as cv
img = cv.imread('messi5.jpg')
res = cv.resize(img,None,fx=2, fy=2, interpolation = cv.INTER_CUBIC) 
#或者
height, width = img.shape[:2]
res = cv.resize(img,(2*width, 2*height), interpolation = cv.INTER_CUBIC)

2.2 Panorâmica

A tradução da imagem é feita criando uma matriz de transformação M, e precisamos usar a função cv.wrapAffine()

Colocamos a matriz de transformação em um array Numpy do tipo np.float32 e passamos para a função cv.wrapAffine()

import numpy as np
import cv2 as cv
img = cv.imread('messi5.jpg',0)
rows,cols = img.shape
M = np.float32([[1,0,100],[0,1,50]])
dst = cv.warpAffine(img,M,(cols,rows))
cv.imshow('img',dst)
cv.waitKey(0)
cv.destroyAllWindows()

insira a descrição da imagem aqui

Os parâmetros da função cv.wrapAffine(): o primeiro é a imagem exibida, o segundo é a matriz de transformação e o terceiro é o tamanho da imagem

2.3 Rotação

A rotação da imagem também requer uma matriz de transformação, que obtemos através da função **cv.getRotationMatrix2D()**, que precisa passar três parâmetros, o primeiro parâmetro são as coordenadas da posição de rotação, passa um binário O o segundo parâmetro é o ângulo de rotação e o terceiro parâmetro é o parâmetro usado para ajuste. Se for passado 1, ele girará no sentido anti-horário normal. Se for passado 0, a imagem não será exibida. Se for passado 0 a imagem não será exibida. Inserir -1 exibirá o resultado da rotação no sentido horário

import numpy as np
import cv2 as cv

# cols-1 和 rows-1 是坐标限制
img = cv.imread(r'E:\image\wqw.png', 0)
rows, cols = img.shape
M = cv.getRotationMatrix2D(((cols - 1) / 2.0, (rows - 1) / 2.0), 90, 1)
dst = cv.warpAffine(img, M, (cols, rows))
cv.imshow('img', dst)
cv.waitKey(0)
cv.destroyAllWindows()

insira a descrição da imagem aqui

2.4 Transformação Afim

Lembra da outra função cv.getAffineTransform de que falamos acima? Agora vamos começar a usá-lo

Em uma transformação afim, todas as linhas paralelas na imagem original permanecerão paralelas na imagem de saída. Para encontrar a matriz de transformação, precisamos das posições de três pontos na imagem de entrada e, em seguida, usar a função cv.getAffineTransform() para criar uma matriz 2*3 e, em seguida, passe-a para cv.wrapAffine() para concluir a transformação afim

img = cv.imread('drawing.png')
rows,cols,ch = img.shape
pts1 = np.float32([[50,50],[200,50],[50,200]])
pts2 = np.float32([[10,100],[200,50],[100,250]])
M = cv.getAffineTransform(pts1,pts2)
dst = cv.warpAffine(img,M,(cols,rows))
plt.subplot(121),plt.imshow(img),plt.title('Input')
plt.subplot(122),plt.imshow(dst),plt.title('Output')

insira a descrição da imagem aqui

2.5 Transformação de perspectiva

Para transformação de perspectiva, é necessária uma matriz de transformação 3x3, mesmo após a transformação, as retas permanecerão retas, para encontrar esta matriz de transformação, você precisa de 4 pontos na imagem de entrada (destes quatro pontos, três deles devem não ser colinear)

A matriz de transformação pode ser encontrada pela função cv.getPerspectiveTransform . Em seguida, aplique cv.warpPerspective a esta matriz de transformação 3x3

img = cv.imread('sudoku.png')
rows,cols,ch = img.shape
pts1 = np.float32([[56,65],[368,52],[28,387],[389,390]])
pts2 = np.float32([[0,0],[300,0],[0,300],[300,300]])
M = cv.getPerspectiveTransform(pts1,pts2)
dst = cv.warpPerspective(img,M,(300,300))
plt.subplot(121),plt.imshow(img),plt.title('Input')
plt.subplot(122),plt.imshow(dst),plt.title('Output')
plt.show()

insira a descrição da imagem aqui


(Observação: para o conteúdo do artigo, consulte o documento oficial chinês do OpenCV4.1)
Se o artigo for útil para você, lembre-se de apoiá-lo com um clique e três links

Acho que você gosta

Origin blog.csdn.net/qq_50587771/article/details/123596875
Recomendado
Clasificación