Básico do OpenCV com Python – mostrar imagem

* elementos definidos em cor laranja estão sendo escritos e serão linkados posteriormente

Esse tutorial tem por objetivo mostrar o básico sobre a manipulação de imagens com a OpenCV codificada utilizando o Python. Os demais tutoriais básicos explorarão o uso de vídeo capturado da webcam e a inserção de elementos gráficos (formas geométricas) na imagem.

O tutorial pressupõem que você possui a OpenCV e o Python devidamente instalados na máquina. Caso não os tenha instalado consulte:

  • Instalar o Python e o OpenCV no Windows
  • Instalar o Python e o OpenCV no Linux
  • Utilizar a máquina virtual Linux no VirtualBox

Para o primeiro tutorial será utilizada a imagem a seguir. Eu não precisava citar, mas obtive esse imagem através do site pixabay.com. O tutorial consiste de ler a imagem, mostrá-la, adquirir a cor de determinados pixels, alterar a cor de determinados pixels, recortar  parte da imagem e salvar uma imagem editada.

lampada

Carregar e mostrar uma imagem e suas propriedades

Carregar e mostrar uma imagem na  OpenCV é bastante simples, bastando utilizar o método imread() que espera como parâmetro o endereço da imagem. Considerando que a imagem estará no mesmo diretório onde está salvo o script, basta indicar o nome da imagem como foi feito na linha 2 do código abaixo. Para mostrar a imagem é utilizado o método imshow() que gerará uma janela e exibirá a imagem nessa janela. O método espera um nome qualquer para a janela e o objeto de imagem (no caso, o objeto de imagem é a imagem carregada no passo anterior).

As linhas 5, 6 e 7 apenas mostrarão características da imagem carregada, sendo mostrada a altura, largura e número de canais da imagem. Essas informações são extraídas a partir da propriedade shape existente no objeto de imagem. Essa propriedade é um vetor, por isso foram acessadas posições (índices) do vetor para extrair apenas a propriedade desejada.

Canais de uma imagem são responsáveis por armazenar informações de quantidade de cor. No caso de uma imagem em escalas de cinza (que formam uma foto preto e branco), um canal é suficiente para informar a quantidade de cor em cada pixel. Para uma imagem colorida, mais canais são necessários. Em uma imagem no padrão RGB é preciso 3 canais  para armazenar a quantidade de vermelho (red), verde (green) e azul (blue) existentes na imagem.

A última instrução serve para que o código fique esperando alguma tecla ser apertada para finalizar, fechando as janela aberta. Se você estiver codificando utilizando alguma IDE de desenvolvimento, essa instrução pode não funcionar adequadamente, por isso recomendo utilizar o prompt de comando/terminal para rodar o código.

Pegando a cor de um pixel

A  continuação do código mostrada abaixo pega a cor em determinados pixels da imagem e mostra a quantidade de vermelho, verde e azul presentes na cor. A linha 10 do código (primeira linha desse subconjunto de código) é responsável por  pegar o pixel na coordenada 0,0 da imagem (pixel do topo superior esquerdo). Toda a imagem é considerada uma matriz por isso a aquisição do pixel necessita que seja informado a posição do pixel.

Dois detalhes importantes:

  • O padrão de cor da OpenCV não é RGB e sim BGR. Por isso a sequência de cores lidas do pixel é azul, verde e vermelho. No código, esses dados são armazenados em 3 variáveis diferentes (“b”, “g” e “r”).
  • As coordenadas na OpenCV não dada pela tradicional sequência linha e depois coluna. Primeiro é informado a coluna e depois a linha de coordenada da imagem. Isso fica mais claro nas obtenção das cores dos pixels seguintes (linhas 13, 14, 16 e 17).

Como resultado do código na imagem utilizada será exibido o resultado mostrado abaixo. Os valores de cada canal estão no intervalo de 0 a 255 e representam a quantidade da cor existente no canal. No caso do pixel da coordenada 0,0, esse possui a cor branca e por isso a quantidade de cada cor está no máximo (o branco é a presença de todas as cores). Já o segundo pixel está localizado na parte inferior da lâmpada que é preta (a cor preta é a ausência das cores – no código foi retornado o valor 2 para cada uma das cores o que mostra que o pixel não é totalmente preto, mas praticamente). Por fim, o terceiro pixel está na metade da lâmpada em sua parte superior que é laranja, sendo que sua cor é formada por uma quantidade máxima de vermelho, uma contribuição grande de verde e um pouco de azul.

Cor do pixel em (0, 0) – Vermelho: 255, Verde: 255, Azul: 255
Cor do pixel em (250, 305) – Vermelho: 2, Verde: 2, Azul: 2
Cor do pixel em (250, 30) – Vermelho: 255, Verde: 179, Azul: 65

Modificando o pixel de uma imagem

Para alterar uma imagem basta informar a cor do pixel em alguma coordenada. Na primeira linha do código abaixo é alterado o pixel da coordenada 0,0 para a cor azul. Essa alteração pode ficar imperceptível por isso a imagem a seguir é um recorte do resultado ampliado 3 vezes. Na linha 21 também é alterado os pixels de 10 até 50 (tanto na horizontal, quanto na vertical) e colocando a cor vermelha neles.

lampadapedacoImagem recortada e ampliada do resultado gerado pela alteração dos pixels

O código visto acaba desenhando um quadrado na imagem. Embora essa seja uma maneira de desenhar na imagem, a OpenCV possui uma forma mais simples de fazer desenhos geométricos e que será vista em LINK para o tutorial sobre desenhos na OpenCV.

Fatiando a imagem e salvando o pedaço

Recortar um pedaço desejado da imagem é também bastante simples. Na sequência do código isso é realizado através da criação de uma nova imagem que é parte da imagem original.  A nova imagem se chama “fatia” e é composta pelos pixels de 0 até 150 da parte vertical (do topo até praticamente a metade da imagem) e da parte horizontal indo das coordenada 150 até a de número 300. O resultado é mostrado na imagem abaixo e na tela será mostrado através do código da linha 26.

Para salvar a imagem gerada basta utilizar o método imwrite(), mostrado na linha 28, que espera um endereçamento da imagem e a matriz contendo a imagem. No caso do código apresentado, a imagem será gravada no mesmo local do script. Se for utilizado o nome de um arquivo que já existe, esse será substituído pela nova imagem gerada.

   newlampada
Fatia da imagem

Isso encerra a manipulação mais básica de uma imagem na OpenCV. Em princípio a parte mais complexa deve ser saber manipular matrizes no Python já que uma imagem é manipulada como se fosse uma matriz.

Sugestão de exercício

A partir da imagem fatiada, faça:

  1. Eespelhamento da imagem, invertendo os pixels da esquerda para a parte da direita e vice-versa.
  2. Rotacione a imagem em 90 graus no sentido horário.
Share

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.