2.3 Primeiro programa

Nesta seção seguiremos um passo a passo de construção de um primeiro programa. Será o nosso “Hello, World!”.

Nessa primeira experiência há duas opções: Criar e executar o comando utilizando o VSCode ou Criar um notebook e executar utilizando o Jupyter Notebook. Fique a vontade para escolher qual fluxo de trabalho mais lhe agradar.

De forma geral, o juypyter notebook possui uma apresentação mais agradável e possui utilização simplificada, além de ser fácil para realização de testes rápidos, anotações e apresentações. A execução na IDE apresenta as vantagens inerentes a IDE (autocompletar, refatorar, debug, entre outros) e normalmente é mais rápido para processamentos longos e em máquinas mais limitadas (com pouca memória RAM, por exemplo).

Para este primeiro programa, iremos utilizar o matplotlib para exibir as imagens, e o ImageIO para a leitura e escrita, instale as bibliotecas utilizando o comando:

conda activate pdi
conda install matplotlib, imageio

Utilizando Jupyter Notebook

  1. Crie uma pasta em um caminho de sua escolha, essa pasta será a raiz dos seus notebooks. Ative o ambiente pdi e execute o jupyter com o comando.

    conda activate pdi
    jupyter notebook
  2. Crie um novo notebook com o nome “Hello World”

  3. Na primeira célula, iremos importar todas as bibliotecas necessárias, insira o código a seguir:

    import cv2 as cv
    import numpy as np
    import imageio as io
    import matplotlib.pyplot as plt
    %matplotlib inline

o comando ‘%matplotlib inline’ informa ao notebook o modo de exibição de imagens da biblioteca matplotlib. Agora basta seguir a aula a partir da Seção helloworld.

Utilizando o VS Code

  1. Crie uma pasta em um caminho de sua escolha, essa pasta será a raiz dos seus projetos. Selecione o ambiente de execução pdi, selecionando o interpretador Python (pvi) no canto inferior esquerdo do Visual Studio code.

  2. Crie um arquivo chamado helloworld.py.

  3. Abra o arquivo e insira o código para importar as dependências desse primeiro programa:

    import cv2 as cv
    import numpy as np
    import imageio as io
  4. iremos encapsular todo o código em uma função main, criamos o seguinte esqueleto:

    def main():
      %TODO código aqui
    
    
    if __name__ == '__main__':
      main()
Observação
  • Em python o interpretador irá ler linha a linha e executar seu código.
  • A variável ‘__name__’ é utilizada para determinar se a thread executada é a thread principal do programa, esta checagem é importante principalmente quando se utiliza mais de uma thread de execução de seu programa.
  • Encapsular a função principal é uma boa prática de programação, além de permite maior controle da execução do seu programa pelo interpretador python, esta prática permite evitar a definição de variáveis no escopo global sem necessidade.

Agora basta seguir a aula a partir da próxima seção.

HelloWorld

Faça o download da imagem de exemplo disponível aqui, ou utilize outra imagem de sua preferência. Copie a imagem em um caminho no seu computador. Nesse tutorial a imagem se encontra em: G:\\UFABC\\pdi\\imagens\\ufabc.png. No windows, utilize barras duplas “\\” como separador do caminho da imagem.

img = cv.imread('G:\\UFABC\\pdi\\imagens\\ufabc.png', cv.IMREAD_COLOR) 
img = cv.cvtColor(img, cv.COLOR_BGR2RGB)
plt.figure(figsize = (15,5))
plt.imshow(img);
  • Nas primeira linha a imagem é lida, no formato de cor. O OpenCV utiliza o formato BGR, que não é tão comum quanto o formato de cor RGB;

  • Na linha 2 utilizamos a função cvtColor para converter do formato de cor BGR para o formato RGB.

  • Na linha 3 definimos uma figura com o tamanho 15x5;

  • Na linha 4 exibimos a imagem na tela.

Se você estiver executando pelo VSCode ou pela linha de comando, adicione o comando abaixo para exibir a imagem. No notebook não é necessário a inclusão desse comando, bastando executar a célula.

plt.show()

Ao executar o código acima, deverá ser exibido uma janela com uma imagem, ou uma célula do jupyter como abaixo:

A biblioteca ImageIO possui uma função de leitura de imagens semelhante ao padrão do openCV, porém ela permite uma variedade maior de formatos de imagem, além de realizar a leitura já no formato de cor RGB. Além disso, ela permite a leitura de imagens disponíveis na internet a partir de URLs. Substitua as linhas 1 e 2 do código anterior pela função imread da biblioteca ImageIO, o código completo ficará:

img = io.imread('G:\\UFABC\\pdi\\imagens\\ufabc.png') 
plt.figure(figsize = (15,5))
plt.imshow(img);

O OpenCV (e o ImageIO) cria uma imagem que pode ser facilmente manipulável como uma matriz do NumPy.

Para demonstrar essa operação, iremos utilizar a função de slice do NumPy para cortar a imagem:

img_crop = img[:, 220:660]
plt.figure(figsize = (15,5))
plt.imshow(img_crop);

Nas primeira linha criamos a variável img_crop onde realizamos o slice, mantendo todas as linhas da primeira dimensão (altura), e selecionamos as colunas 220 até 660 da imagem img;

O resultado deve ser algo como abaixo:

Para salvar o resultado no disco rígido, iremos utilizar a função imwrite:

io.imwrite('ufabc_crop.png', img_crop)

A extensão dada ao nome do arquivo determina o formato utilizado, nesse caso utilizamos o formato png.

Assim concluímos nosso primeiro exercício prático. Neste exercício aprendemos:

  • Abrir uma imagem
  • Salvar uma imagem
  • Utilizar o comando de conversão de cores
  • Exibir uma imagem
  • Manipular imagens utilizando comandos similares a manipulação de matrizes do numpy.
Exercício

Utilizando os conceitos vistos anteriormente, crie uma montagem da UFABC:

A sua montagem deve ter o seguinte aspecto:

  • Crie uma imagem inicial com dimensões adequadas para comportar a montagem.
  • Utilize a imagem do campus de Santo André e São Bernardo disponíveis no site da UFABC.
  • Posicione as imagens lado a lado e inclua dois cortes da imagem utilizada de exemplo no primeiro programa.
  • A segunda imagem ‘cortada’ deve ser espelhada horizontalmente.

Explore diferentes funções no NumPy para criar a sua montagem, tais como:

  • np.shape função que retorna o tamanho de uma matriz.

  • np.zeros para criar uma matriz preenchida inicialmente com zeros, esta será a sua imagem inicial.

    Essa função recebe como parâmetro o tamanho da matriz, e também o tipo de dado a ser utilizado. Exemplo para uma imagem com 3 canais de cores e de tamanho 800x600:

    np.zeros((600,800,3), dtype=np.uint)
  • np.fliplr função que retorna uma matriz espelhada horizontalmente;