Introdução a processamento de imagens com Linguagem Python – Parte 2

1 – Introdução

No artigo anterior foi explicado como configurar o ambiente e fazer as primeiras edições em uma imagem gerada via código utilizando OpenCV. Neste artigo serão apresentadas algumas funções que aplicam algum efeito sobre imagens, como filtros de suavização e transformações geométricas.  

2 – Suavizar (Blur)

A suavização de imagens é geralmente utilizada para redução de ruídos e para isso é aplicado, através da convolução, um filtro que remove sinais de alta frequência da imagem (filtro passa-baixa). Nesta biblioteca podemos encontrar até 4 funções para desfoque, são elas:  

  • cv2.blur() – é um filtro linear que substitui cada pixel da imagem pelo valor médio dos pixels vizinhos.  
  • cv2.GaussianBlur() – é um filtro linear que usa uma distribuição Gaussiana para calcular os pesos dos pixels vizinhos.  
  • cv2.medianBlur() – é um filtro não linear que substitui cada pixel da imagem pelo valor mediano dos pixels vizinhos.  
  • cv2.bilateralFilter() – é um filtro não linear que combina a suavização espacial com a suavização de intensidade 

O kernel de convolução nada mais é que uma matriz com dimensões pequenas que é aplicada em cada pixel da imagem para gerar um efeito na imagem, como a suavização que é descrita neste tópico. Abaixo é possível ver as imagens resultantes dos filtros realizados: 

1 – Introdução

No artigo anterior foi explicado como configurar o ambiente e fazer as primeiras edições em uma imagem gerada via código utilizando OpenCV. Neste artigo serão apresentadas algumas funções que aplicam algum efeito sobre imagens, como filtros de suavização e transformações geométricas.  

2 – Suavizar (Blur)

A suavização de imagens é geralmente utilizada para redução de ruídos e para isso é aplicado, através da convolução, um filtro que remove sinais de alta frequência da imagem (filtro passa-baixa). Nesta biblioteca podemos encontrar até 4 funções para desfoque, são elas:  

  • cv2.blur() – é um filtro linear que substitui cada pixel da imagem pelo valor médio dos pixels vizinhos.  
  • cv2.GaussianBlur() – é um filtro linear que usa uma distribuição Gaussiana para calcular os pesos dos pixels vizinhos.  
  • cv2.medianBlur() – é um filtro não linear que substitui cada pixel da imagem pelo valor mediano dos pixels vizinhos.  
  • cv2.bilateralFilter() – é um filtro não linear que combina a suavização espacial com a suavização de intensidade 

O kernel de convolução nada mais é que uma matriz com dimensões pequenas que é aplicada em cada pixel da imagem para gerar um efeito na imagem, como a suavização que é descrita neste tópico. Abaixo é possível ver as imagens resultantes dos filtros realizados: 

ORIGINAL

Blur

GaussianBlur

medianBlur

bilateralFilter

3 – Transformações geométricas

Com OpenCV é possível realizar transformações de mudança de escala, rotação e translação que são comumente utilizadas para alinhar ou corrigir perspectivas. Nesse primeiro trecho de código uma imagem terá sua escala reduzida pela metade com a função cv2.resize(): 

O tamanho da imagem destino foi definido como (0,0) para que o tamanho seja calculado pelos fatores de escala fx e fy. O tipo de interpolação não precisa ser especificado, pois a biblioteca usará por padrão a cv2.INTER_LINEAR. Outros tipos que podem ser utilizados são: 

  • INTER_NEAREST 
  • INTER_CUBIC 
  • INTER_AREA 
  • INTER_LANCZOS4 
  • INTER_LINEAR_EXACT 
  • INTER_NEAREST_EXACT 

A seguir a comparativo entre a imagem original e a imagem resultante: 

Agora, para alterar a rotação de uma imagem é necessário definir a matriz de rotação, definindo o pronto sobre o qual a imagem irá girar, escala e o ângulo de rotação através da função cv2.getRotationMatrix2D() e aplicamos a transformação com cv2.warpAffine(). 

E assim fica a imagem resultante: 

7 - tabuleiro_rotacionado

Outras duas funções importantes são cv2.getPerspectiveTransform() e cv2.warpPerspective() que são utilizadas para correção de perspectiva de imagens para corrigir distorções e restaurar a forma do objeto. Neste exemplo, vamos corrigir a perspectiva da imagem original para que se tenha uma visão de cima do tabuleiro. 

A imagem utilizada tem 800 pixels e dela foram selecionados 4 pontos onde estão aproximadamente posicionados os vértices do tabuleiro. A partir disso, foram definidos os pontos da nova perspectiva para que o tabuleiro fosse reposicionado na imagem, lembrando sempre que 3 dos novos pontos escolhidos não podem ser colineares. A seguir a imagem resultante: 

8 - tabuleiro_nova_perspectiva

4 – Discussão Geral

A partir deste artigo, foi possível entender a lógica por trás de edições de imagens que são comumente utilizadas no dia a dia da maioria das pessoas, seja para edição de uma “selfie” que saiu com um pouco de ruído ou até mesmo endireitar a imagem de um documento que foi escaneado por um smartphone. E sobretudo, a biblioteca OpenCV também pode ser combinada com outras bibliotecas para realizar tarefas mais específicas e de fins mais nobres, como, por exemplo, analisar imagens de radiografias e ressonâncias para diagnosticar doenças ou em um sistema de um carro autônomo para detectar objetos e evitar colisões. Dessa forma, por se tratar de uma biblioteca bastante abrangente, seu uso depende unicamente do objetivo que o programador almeja. 

Referências 

[1] ______, OpenCV website, https://docs.opencv.org/4.x/  

[2] ______, Python Brasil website, https://docs.python.org/pt-br/3.11/tutorial/  

[3] ______, Numpy website, https://numpy.org/doc/stable/reference/index.html 

Compartilhar:

Facebook
Twitter
LinkedIn
Pinterest