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
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
Crie um novo notebook com o nome “Hello World”
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
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.
Crie um arquivo chamado
helloworld.py
.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
iremos encapsular todo o código em uma função main, criamos o seguinte esqueleto:
- 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.
= cv.imread('G:\\UFABC\\pdi\\imagens\\ufabc.png', cv.IMREAD_COLOR)
img = cv.cvtColor(img, cv.COLOR_BGR2RGB)
img = (15,5))
plt.figure(figsize ; 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.
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á:
= io.imread('G:\\UFABC\\pdi\\imagens\\ufabc.png')
img = (15,5))
plt.figure(figsize ; 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[:, 220:660]
img_crop = (15,5))
plt.figure(figsize ; 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:
'ufabc_crop.png', img_crop) io.imwrite(
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.
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:
600,800,3), dtype=np.uint) np.zeros((
np.fliplr
função que retorna uma matriz espelhada horizontalmente;