- 1. Transformações de imagem - transformação afim e não afim
- 2. Traduções de imagens - Movendo a imagem para cima, para baixo, para a esquerda e para a direita
- 3. Rotação da imagem - Girando a imagem
- 4. Escala, redimensionamento e interpolação
- 5. Pirâmides de imagens - Outra maneira de redimensionar
- 6. Recorte - Recorte a região da imagem que você deseja
- 7. Operações aritméticas para clareamento e escurecimento de imagens
No tutorial anterior, aprendemos sobre o OpenCV e fizemos alguns processamentos básicos de imagem usando-o como escala de cinza, saturação de cor, histograma, espaços de cores, componente RGB etc. Como dito no tutorial anterior, OpenCV é uma biblioteca Open Source Commuter Vision que tem Interfaces C ++, Python e Java e suporta Windows, Linux, Mac OS, iOS e Android. Portanto, ele pode ser facilmente instalado no Raspberry Pi com ambiente Python e Linux. E o Raspberry Pi com OpenCV e câmera conectada pode ser usado para criar muitos aplicativos de processamento de imagem em tempo real, como detecção de rosto, bloqueio de rosto, rastreamento de objeto, detecção de placa de carro, sistema de segurança residencial etc.
Neste tutorial, vamos ver como vamos manipular a imagem usando OpenCV. Aqui, aprenderemos a aplicar a seguinte função em uma imagem usando OpenCV:
- Transformações de imagem - transformação afim e não afim
- Traduções de imagens - Movendo a imagem para cima, para baixo, para a esquerda e para a direita
- Rotação da imagem - Girando a imagem
- Dimensionamento, redimensionamento e interpolação
- Pirâmides de imagens - Outra forma de redimensionar
- Recorte - recortando a região da imagem que você deseja
- Operações aritméticas para clareamento e escurecimento de imagens
1. Transformações de imagem - transformação afim e não afim
Transformações são distorções geométricas efetuadas em uma imagem, distorções certamente aqui não significam erros, mas um tipo de correção para corrigir os problemas de perspectiva decorrentes do ponto onde a imagem foi capturada. Existem dois tipos de transformações de imagem - afins e não afins
As transformações afins são de três tipos: escala, rotação e translação, o importante nas transformações afins é que as linhas sejam paralelas antes e depois das transformações da imagem.
Transformações não afins ou transformações projetivas não preservam paralelismo, comprimento ou ângulo, mas preservam a colinearidade e a incidência, colinearidade significa que os dois pontos estão na mesma linha reta.
As transformações não afins são muito comuns na visão computacional e são geradas de diferentes ângulos de câmera. As transformações não afins ou projetivas também são chamadas de homografia.
2. Traduções de imagens - Movendo a imagem para cima, para baixo, para a esquerda e para a direita
A tradução da imagem move a imagem para cima, para baixo, para a esquerda e para a direita e até na diagonal se implementarmos a tradução xey ao mesmo tempo.
Agora, para realizar traduções de imagens, usamos a função warpAffine do opencv, cv2.warpAffine é usado para implementar essas traduções, mas para isso precisamos de uma matriz de tradução.
Matriz de tradução, T = 1 0 Tx
0 1 ty
T X, T y são as direções nas quais a imagem muda.
Em que T X é deslocado ao longo do eixo X (horizontal)
T Y é o deslocamento ao longo do eixo Y (vertical)
# esta é uma transformação afim que simplesmente muda a posição de uma imagem # usamos cv2.warpAffine para implementar essas transformações. import cv2 import numpy as np image = cv2.imread ('input.jpg') # armazena a altura e largura da altura da imagem , width = image.shape print (image.shape) quater_height, quater_width = height / 4, width / 4 T = np.float32 (,]) img_translation = cv2.warpAffine (image, T, (largura, altura)) print (T) cv2.imshow ('original_image', image) cv2.waitKey (0) cv2.imshow (' Tradução ', img_translation) cv2.waitKey (0) cv2.destroyAllWindows ()
Saída do console - (183, 275) - altura e largura
- matriz T
]
3. Rotação da imagem - Girando a imagem
A rotação da imagem é girar uma imagem em torno de um ponto ou do ponto no centro da imagem, assim como o ponto de rotação atua como um pivô.
Como na translação temos a matriz T, provavelmente na rotação temos a matriz M
Matriz de rotação, matriz M = Cosθ -Sinθ
Sinθ Cosθ
Onde o θ é o ângulo de rotação, medido no sentido anti-horário.
Além disso, há uma coisa a observar que o OpenCV permite que você venda e gire a imagem ao mesmo tempo usando a função cv2.getRotationMatrix2D (rotation_center_x, rotation_center_y, ângulo de rotação, escala)
Ainda usamos a função warpAffine do opencv para obter a rotação da imagem, mas em vez da matriz de translação, como no caso anterior, usamos a matriz de rotação.
import cv2 import numpy as np image = cv2.imread ('input.jpg') height, width = image.shape #divide a altura e a largura por 2 para girar a imagem sobre seu centro rotation_matrix = cv2.getRotationMatrix2D ((largura / 2, height / 2), 90,1) rotated_image = cv2.warpAffine (imagem, rotação_matriz, (largura, altura)) cv2.imshow ('imagem original', imagem) cv2.waitKey (0) cv2.imshow ('imagem girada ', rotated_image) cv2.waitKey (0) cv2.destroyAllWindows ()
Agora a imagem é girada 90 graus, ela é cortada por causa do tamanho da tela, já que o tamanho da tela permanece o mesmo, mas devido ao tamanho da imagem de rotação não se ajusta ao tamanho da tela. Ele pode ser ajustado definindo o fator de escala para negativo, mas permite um fundo preto atrás da imagem.
Portanto, você pode definir a altura e a largura da imagem antecipando-a ou adivinhando-a, ou existe outro método de girar a imagem transpondo -a, mas isso giraria a imagem em múltiplos de 90 graus no sentido anti-horário.
4. Escala, redimensionamento e interpolação
Dimensionamento e redimensionamento são transformações afins, redimensionar a imagem é o que temos feito há bastante tempo e também lidamos com interpolação, como quando você está redimensionando a imagem para um tamanho maior no qual estamos expandindo os pixels, existem algumas lacunas no pixels e é aí que entra a interpolação.
Pode ocorrer ao aumentar o tamanho da imagem de menor para maior ou ao diminuir o tamanho da imagem de maior para menor.
Tecnicamente, a interpolação é um método de construção de novos pontos de dados (pixels), dentro de um conjunto discreto de pontos de dados conhecidos.
Existem vários tipos de métodos de interpolação no OpenCV, como
cv2.INTER_AREA - bom para reduzir ou diminuir a amostragem
cv2.INTER_NEAREST - mais rápido
cv2.LINEAR - bom para zoom ou amostragem (padrão)
cv2.CUBIC - melhor
cv2.INTER_LANCZOS4 - melhor
# redimensionar é muito fácil usando a função cv2.resize, seus argumentos são # cv2.resize (imagem, dsize (tamanho da imagem de saída), x_scale, y_scale, interpolação) import cv2 import numpy as np image = cv2.imread ('input. jpg ') cv2.imshow (' Original_image ', image) cv2.waitKey (0) # vamos deixar a imagem 3/4 do tamanho da imagem original, ou seja, reduz para 75% image_scaled = cv2.resize (image, None, fx = 0,75, fy = 0,75) # visto que a interpolação linear é o método padrão para cv aberto, não precisamos implementá-lo como uma função. cv2.imshow ('scaling_linear interpolation', image_scaled) cv2.waitKey (0) # vamos dobrar o tamanho da nossa imagem img_double = cv2.resize (image, None, fx = 2, fy = 2, interpolation = cv2.INTER_CUBIC) cv2.imshow ('scaing_cubicInterpolation', img_double) cv2.waitKey (0) # vamos fazer o redimensionamento por dimensões exatas image_resize = cv2.resize (image, (200.300), interpolation = cv2.INTER_AREA) cv2.imshow ('scaling_exact', image_resize) cv2.waitKey (0) cv2.destroyAllWindows ()
5. Pirâmides de imagens - Outra maneira de redimensionar
A pirâmide de imagem refere-se a aumento (ampliação de imagens) ou redução (redução de imagens).
É simplesmente uma maneira diferente de redimensionar que nos permite dimensionar as imagens de forma fácil e rápida, diminuindo a altura e a largura da nova imagem pela metade.
Isso é útil ao fazer detectores de objetos que dimensionam as imagens cada vez que procuram um objeto.
import cv2 image = cv2.imread ('input.jpg') menor = cv2.pyrDown (imagem) maior = cv2.pyrUp (menor) cv2.imshow ('original', imagem) cv2.waitKey (0) cv2.imshow ('menor', menor) cv2.waitKey (0) cv2.imshow ('maior', maior) cv2.waitKey (0) cv2.destroyAllWindows ()
Na imagem maior você notará que ainda sendo do mesmo tamanho da imagem original fica um pouco borrado porque está sendo convertido de imagem menor para imagem maior diretamente. Mas se interpolarmos, a qualidade da imagem melhora como a anterior, porque a interpolação estima os pixels enquanto preenche os espaços quando a imagem é ampliada.
Agora rodar o mesmo código, mas com interpolação cúbica, dá uma melhor qualidade de imagem grande. As imagens abaixo mostram a comparação entre a imagem original, a versão em escala aumentada da imagem, a imagem menor e a versão interpolada cúbica da imagem menor.
import cv2 image = cv2.imread ('input.jpg') menor = cv2.pyrDown (imagem) maior = cv2.pyrUp (menor) cv2.imshow ('original', imagem) cv2.waitKey (0) cv2.imshow ('menor', menor) cv2.waitKey (0) cv2.imshow ('maior', maior) cv2.waitKey (0) # aumentando a qualidade da imagem maior convertida de imagem menor usando interpolação cúbica img_double = cv2.resize (menor, Nenhum, fx = 2, fy = 2, interpolação = cv2.INTER_CUBIC) cv2.imshow ('scaing_cubicInterpolation', img_double) cv2.waitKey (0) cv2.destroyAllWindows ()
NOTA: Se você quiser criar várias pequenas cópias das imagens vai cada vez menor em tamanho ou várias grandes cópias de imagens continuamente crescendo em tamanho, então podemos usar para voltas ou enquanto loops de manter dentro pyrDown ou pyrUp função.
6. Recorte - Recorte a região da imagem que você deseja
Cortar imagens refere-se à extração de um segmento de imagem.
O OpenCV diretamente não tem função de recorte, mas pode ser facilmente feito numpy usando o código abaixo
Cortado = imagem
Colocamos o array de imagens e usando ferramentas ou métodos de indexação em numpy, definimos linha inicial para linha final e coluna inicial para coluna final separada por uma vírgula que extrai o retângulo que queremos cortar para obter a imagem.
import cv2 import numpy as np image = cv2.imread ('input.jpg') height, width = image.shape # vamos obter as coordenadas de pixel iniciais (canto superior esquerdo do retângulo de recorte) start_row, start_col = int (height *.25), int (largura *.25) # vamos obter as coordenadas finais dos pixels (canto inferior direito) end_row, end_col = int (altura *.75), int (largura *.75) # simplesmente use a indexação para cortar o retângulo que desejamos cortar = imagem cv2.imshow ("imagem original", imagem) cv2.waitKey (0) cv2.imshow ("imagem recortada”, recortada) cv2.waitKey (0) cv2.destroyAllWindows ()
Note que você pode usar valores de pixel diretamente em vez de start_col ou start_row , eles são fornecidos apenas para facilitar a identificação do usuário.
7. Operações aritméticas para clareamento e escurecimento de imagens
As operações aritméticas no OpenCV basicamente são adicionar ou subtrair matrizes à imagem, adicionar ou subtrair matrizes tem efeito no aumento ou diminuição do brilho.
Então, para adicionar ou subtrair matrizes, temos que criá-las e numpy tem uma função chamada np.ones que fornece matrizes de 1 do mesmo tamanho da nossa imagem.
import cv2 import numpy as np image = cv2.imread ('input.jpg') #cria uma matriz de um, depois multiplica por um scaler de 100 ' # np.ones dá uma matriz com a mesma dimensão da nossa imagem com todos os valores sendo 100 neste caso M = np.ones (image.shape, dtype = "uint8") * 100 # usamos isso para adicionar esta matriz M à nossa imagem # note o aumento no brilho adicionado = cv2.add (imagem, M) cv2.imshow ("Adicionado", adicionado) cv2.waitKey (0) # da mesma forma, também podemos subtrair #notar a diminuição do brilho subtraído = cv2.subtract (imagem, M) cv2.imshow ("subtraído", subtraído) cv2.waitKey (0) cv2.destroyAllWindows ()
É assim que o OpenCV pode ser usado para aplicar muitas operações diferentes de processamento de imagem na imagem. Continuaremos com outras funções de manipulação de imagens no próximo tutorial.