Processamento de imagem

01.Bibliotecas Necessárias

Para trabalhar com visão computacional utilizamos uma biblioteca em Python chamada de OpenCV (também chamada de cv2). Uma função importante que também precisa ser importada é a cv2_imshow, este comando nos permite mostrar a imagem que estamos trabalhando.

1#Importar OpenCV
2import cv2
3
4#Importar comando cv2_imshow
5from google.colab.patches import cv2_imshow

Note

O comando from google.colab.patches import cv2_imshow é uma forma de adaptar o OpenCV a rodar no Google Colaboratory, caso esteja utilizando uma IDE não é necessário utilizar este comando.

01.a.Importar uma imagem

Após realizar o upload de uma imagem no Google Colaboratory podemos importá-la para nosso código e começar a trabalhar com ela, igual fazemos com os Datasets.

Para importar uma imagem usando a biblioteca OpenCV usamos o método imread()

1#Importar a imagem
2imagem_ponte = cv2.imread("/content/san_francisco.jpg")

01.b.Mostrar a imagem

Para mostrar a imagem atribuída a variável imagem_ponte, usamos o método cv2_imshow()

1#Mostrar a imagem
2cv2_imshow(imagem_ponte)

Este será o output do código:

images/imagem_ponte.png

Que é justamente a imagem que fizemos o upload.

02.O que é uma imagem

02.a.Pixels

A menor parte de uma imagem é chamada de pixel e cada imagem é formada por muitos pixels.

images/pixel.png

02.b.Cores

As cores de um pixel estão no formato RGB, ou seja, a cor de cada pixel é uma mistura de três cores Vermelho, Verde,**Azul** (na sigla em inglês: RGB - R ed,**G** reen,**B** lue).

Note

Por padrão o OpenCV usa as cores na ordem contrária, ou seja, BGR (azul, verde, vermelho).

Em cada pixel, cada uma destas três cores correspondem a um valor numérico que vai de 0 até 255, sendo:
  • 0: ausência da cor.

  • 255: valor máximo da cor.

images/cores.png

Note

Caso você queira descobrir qual o valor RGB de uma cor pode utilizar esse link de um selecionador de cor RGB:

https://www.w3schools.com/colors/colors_rgb.asp

Cada cor é chamada de canal, portanto nesta imagem temos um total de 3 canais, um para cada cor. Caso a imagem esteja em preto e branco ela terá apenas um canal.

images/um_canal.png

02.c.Formato de uma imagem

O formato de uma imagem é composto por:

  • Altura (em quantidade de pixels).

  • Largura (em quantidade de pixels).

  • Canais (quantidade de canais):

    • Imagem em RGB: 3 canais (um para cada cor).

    • Imagem em preto e branco: 1 canal.

Para visualizarmos o formato de uma imagem usamos a propriedade shape:

1#Mostrar o formato da imagem
2imagem_ponte.shape

O output será justamente a altura, largura e a quantidade de canais, respectivamente.

1(420, 640, 3)

Caso queira salvar em variáveis e exibir com o comando print() pode fazer assim:

1#Salvando em variáveis
2altura, largura, quantidade_de_canais = imagem_ponte.shape
3
4#Exibindo com o comando print()
5print("Altura: ", altura)
6print("Largura: ", largura)
7print("Quantidade de canais: ", quantidade_de_canais)

Neste exemplo o output será esse:

images/print.png

02.d.Transformar uma imagem para tons de cinza

Ao transformarmos uma imagem colorida para tons de cinza, esta imagem passa a ter apenas um canal de cor, que é justa mente vários tons de cinza que vão desde o valor 0 para a cor preta até 255 para a cor branca.

Para converter uma imagem colorida para uma imagem em tons de cinza, usamos o método `cvtColor()`, ou seja, “converter para cor”. Também usamos os seguintes parâmetros:

  • nome da imagem: pedaco_imagem_ponte

  • conversão a realizar: cv2.COLOR_BGR2GRAY

(ou seja, converter de RGB para tons de cinza)

1#Converter a imagem para cinza
2imagem_ponte_cinza = cv2.cvtColor(pedaco_imagem_ponte, cv2.COLOR_BGR2GRAY)
3
4#Mostrar a imagem em tons de cinza
5cv2_imshow(imagem_ponte_cinza)

A saída do código será justamente a imagem em tons de cinza:

images/ponte_cinza.png

02.d.I.Matriz

O computador basicamente é uma máquina de fazer contas com números, assim, ele entende uma imagem como uma matriz. - Na matemática, uma matriz nada mais é do que uma forma de armazenarmos valores em linhas e colunas.

Como a imagem está em tons de cinza, cada elemento desta matriz tem o seu valor numérico correspontente ao tom de cinza (de 0 até 255).

Agora, vamos observar a imagem, como o computador a observa, ou seja, um conjunto de números organizado em uma matriz.

images/matriz.png

03.Operações básicas com uma imagem

images/op_basica.png

Dimensões de uma imagem

1#Imprimir altura e largura
2print("Altura: ", altura)
3print("Largura: ", largura)

O resultado será esse:

1Altura: 426
2Largura: 640

Centro da imagem

 1#Calcular o centro de uma imagem
 2(centro_X, centro_Y) = (largura//2,altura//2)
 3
 4#Imprimir os resultados
 5
 6print("Tamanho do eixo X: {}".format(largura))
 7print("Centro do eixo X: {}".format(centro_X))
 8print("---------------------")
 9print("Tamanho do eixo Y: {}".format(altura))
10print("Centro do eixo Y: {}".format(centro_Y))

O resultado será esse:

1Tamonho do eixo X: 640
2Centro do eixo X: 320
3----------------------
4Tamnho do eixo Y: 426
5Centro do eixo Y: 213

03.a.Cortar uma imagem

Vamos selecionar uma região da imagem, que é justamente o canto superior esquerdo. Para isso temos que informar o início e o fim desta região da imagem. - início: x=0 e y=0. - fim: x=centro_x e y=centro_y.

Agora vamos pegar esta região e salvar em uma variável `canto_superior_esquerdo`:

1#Selecionar o canto superior esquerdo da imagem
2canto_superior_esquerdo = imagem_ponte[0:centro_X, 0:centro_Y]
3
4#Mostrar o canto superior esquerdo da imagem
5cv2_imshow(canto_superior_esquerdo)

O resultado será esse:

images/canto.png

04.Desenhar em uma imagem

Podemos fazer diferentes desenhos em uma imagem: linhas, retângulos, quadrados, círculos e etc.

Antes de tudo, vamos definir a cor que terá o traçado destes desenhos:

1#Definir cor
2cor_verde = (0,255,0)

04.a.Linha

Para desenhar uma linha na imagem, usamos o método line( ) e os seguintes parâmetros:

  • nome da imagem em que desenharemos: imagem_ponte

  • local do início da linha: (x,y)

  • local do fim da linha: (x,y)

  • cor da linha: `cor_verde`

  • grossura da linha: 3

1#Desenhar uma linha na imagem
2imagem_ponte_com_linhha = cv2.line(imagem_ponte, (0,0), (250,250), cor_verde, 3)
3
4#Visualizar imagem desenhada
5cv2_imshow(imagem_ponte_com_linha)

O resultado será esse:

images/linha.png

04.b.Retângulo

Para desenharmos um retângulo na imagem, usamos o método rectangle( ) e os seguintes parâmetros:

  • nome da imagem a ser desenhada: imagem_ponte

  • ponta superior esquerda do retângulo: (x,y)

  • ponta inferior direita do retângulo: (x,y)

  • cor da linha: `cor_verde`

  • grossura da linha: 3 - Obs: caso o valor seja “-1”, o retângulo ficará preenchido.

1#Desenhar um retângulo na imagem
2imagem_ponte_com_retangulo = cv2.rectangle(imagem_ponte,(100,100), (200,200), cor_verde,3)
3
4#Visualizar imagem desenhada
5cv2_imshow(imagem_ponte_com_retangulo)

O resultado será esse:

images/retangulo.png

04.c.Círculo

Para desenharmos um círculo na imagem, usamos o método circle( ), com os seguintes parâmetros:

  • nome da imagem a ser desenhada: imagem_ponte

  • centro do círculo: (x,y)

  • raio do círculo: 80

  • cor do círculo: `cor_verde`

  • grossura da linha: 3 - Caso o valor seja “-1”, o círculo será preenchido.

1#Desenhar um ciruclo na imagem
2imagem_ponte_com_circulo = cv2.circle(imagem_ponte, (400,200), 80, cor_verde, 3)
3
4#Visualizar imagem desenhada
5cv2_imshow(imagem_ponte_com_circulo)

O resultado será esse:

images/circulo.png

04.d.Escrever um texto na imagem

Para escrever um texto em uma imagem, usamos o método putText( ) com os seguintes parâmetros:

  • nome da imagem a ser usada:

  • texto: texto a ser escrito na imagem.

  • posicao: posição (x,y) na imagem em que ficará o texto.

  • fontFace: fonte da letra usada no texto.

  • fontScale: tamanho da fonte da letra.

  • color: cor do texto.

 1#Salvando os parâmetros
 2texto = "San Francisco"
 3posicao = (30,100)
 4cor_azul = (255,0,0)
 5
 6#Escrever texto na imagem
 7imagem_ponte_com_texto = cv2.putText(imagem_ponte,
 8                                  texto,
 9                                  posicao,
10                                  fontFace = cv2.FONT_HERSHEY_PLAIN,
11                                  fontScale=2,
12                                  color=cor_azul)
13
14#Visualizar imagem
15cv2_imshow(imagem_ponte_com_texto)

O resultado será esse:

images/texto.png

05.Salvando uma imagem

Para salvar uma imagem, usamos o método imwrite( ) e os seguintes parâmetros:

  • nome do arquivo/imagem que será criado: “imagem_ponte_texto.jpg”

  • nome da imagem: imagem_ponte

1#Gravar uma imagem nova
2cv2.imwrite("imagem_ponte_texto.jpg", imagem_ponte)

A saída desse código será True caso tenha dado certo ou False caso tenha dado errado. Depois de rodar esse código repare que o arquivo já aparece na lateral do Google Colaboratory

images/colab.png