Um guia para iniciantes em processamento de imagens com OpenCV e Python

Nó Fonte: 1074439

Este artigo foi publicado como parte do Blogathon de Ciência de Dados

Introdução

Pode haver muita informação escondida dentro de uma imagem e podemos interpretá-la de diferentes maneiras e perspectivas. Então, o que é uma imagem e como lidar com uma imagem? Em palavras simples, podemos dizer que uma imagem é uma representação visual de algo e poderia ser tratada facilmente usando a visão computacional (de uma perspectiva de aprendizado de máquina). E os vídeos? Um vídeo pode ser descrito como uma gravação de um conjunto de imagens em movimento ou quadros contínuos. Mas podemos lidar com vídeos usando visão computacional em outro blog! 🙂

Alguns de vocês já devem saber sobre Visão Computacional agora e podem pular este parágrafo, mas para aqueles que não têm uma idéia sobre isso, Visão Computacional, mais conhecida na forma abreviada de 'CV', poderia ser dito como um campo em Inteligência artificial que extrai informações úteis em quase todos os domínios nesta era moderna, incluindo o campo médico, automotivo, manufatura, agricultura, etc.

Processamento de imagens com OpenCV | visão de computador

1 imagem

Como um humano, que está lendo este post, você seria capaz de distinguir entre as coisas ou elementos presentes em uma imagem. Mas e as máquinas? Eles poderiam ver e pensar em distingui-lo por conta própria? NÃO? então vamos fazer sua máquina fazer isso.

Neste blog, você se familiarizaria com os conceitos básicos de visão computacional usando python.

Eu acredito que você já instalou Python Shell / Jupyter Notebook / PyCharm ou Visual Studio Code (para citar alguns) para programar em python. Vamos instalar o pacote amplamente usado (OpenCV) para começar e vamos executar os códigos em cada célula em um Notebook Jupyter.

Instalando o pacote OpenCV para pré-processamento de imagens

OpenCV é uma biblioteca (pacote) pré-construída, de código aberto, que é amplamente usada para visão computacional, aprendizado de máquina e aplicativos de processamento de imagem. Ele suporta uma boa variedade de linguagens de programação, incluindo Python.

Instale o pacote OpenCV usando:

pip instalar opencv-python

OR

pip instalar opencv-contrib-python

Execute qualquer um desses comandos em seu terminal ou se estiver usando Anaconda Navigator - Jupyter Notebook, você pode alterar o “pip” com o comando “conda” e instalar o mesmo.

Importando o Pacote

O que é um pacote em Python? Um pacote em Python é uma coleção de módulos que contém scripts pré-escritos. Esses pacotes nos ajudam a importar módulos inteiramente ou mesmo individualmente. Podemos importar o pacote chamando o módulo “cv2” assim:

importar cv2

Lendo uma imagem

As imagens digitais podem ser classificadas em; imagens coloridas, imagens em escala de cinza, imagens binárias e imagens multiespectrais. Uma imagem colorida inclui as informações de cor para cada pixel. Imagens com tons de cinza como única cor são imagens em tons de cinza, enquanto uma imagem binária tem exatamente duas cores, principalmente pixels em preto e branco. Imagens multiespectrais são imagens que capturam dados de imagem que abrangem o espectro eletromagnético dentro de algum comprimento de onda específico.

Vamos voltar para a parte de codificação e ler uma imagem, por exemplo, a imagem é mostrada abaixo:

lendo a imagem | Processamento de imagem com OpenCV

Esta é a imagem de um mandril. No momento, estou lendo a imagem do meu diretório local.

# cv2.imread (path_to_image_with_file_extension, flag)

O código de uso é parecido com este:

img = cv2.imread ("mandrill.jpg", 1)

Aqui estamos usando o método “imread” do pacote cv2 para ler a imagem e o primeiro parâmetro corresponde ao caminho da imagem com seu nome de arquivo e extensão, e o segundo é o sinalizador que você pode definir que indica o caminho, como ler na imagem. Se desejar, você pode substituir o caminho absoluto para a imagem aqui e tentar lê-lo de seu computador local ou até mesmo da internet! Se a imagem estiver presente em seu diretório de trabalho atual, você só precisa especificar o nome da imagem com seu tipo de extensão.

No que diz respeito ao segundo parâmetro, se você gosta de lê-lo como uma imagem em tons de cinza, você pode especificar o parâmetro para 0, -1 para ler a imagem como inalterada (lê a imagem como canal alfa ou de transparência se houver) e, por padrão, é 1, como uma imagem colorida. Você também pode tentar outros parâmetros deste link:

https://docs.opencv.org/4.5.2/d8/d6a/group__imgcodecs__flags.html#ga61d9b0126a3e57d9277ac48327799c80

sob o ImreadModes.

Propriedades de uma imagem

Shape:

Cada imagem tem uma forma. O comprimento dos limites exibidos pela imagem pode ser referido como a forma, ou seja, a altura e a largura. Agora que você sabe ler uma imagem, que tal verificarmos o formato da imagem?

imprimir (img.shape)

é a maneira básica de imprimir a forma da imagem, mas podemos extrair a forma usando:

h, w, c = img.shape print ("As dimensões da imagem são: nnAltura:", h, "pixelsnLargura:", w, "pixelsnNúmero de canais:", c)

para obter uma melhor compreensão.

Para o modo de cor e inalterado, ele retornaria 3 valores incluindo a altura, largura e o número de canais presentes na imagem. Se você usou o modo de escala de cinza, a forma seria 2, que retornará a altura e a largura da imagem, mas então você só precisa usar as variáveis ​​hew apenas (exclua usando "c"), caso contrário, você poderá obter um erro de valor dizendo “valores insuficientes para desempacotar (esperado 3, obtido 2)”.

Tipo:

Podemos saber o tipo de imagem usando o método “tipo”. Usar este método nos ajuda a saber como os dados da imagem são representados. Execute o código da seguinte maneira:

imprimir (tipo (img))

O resultado pode ser assim:

como o tipo de imagem. É um contêiner multidimensional de itens do mesmo tipo e tamanho. Você pode consultar mais sobre a matriz N-dimensional no seguinte link:

https://numpy.org/doc/stable/reference/arrays.ndarray.html

O tipo de dados da imagem que você acabou de ler:

Como a imagem é uma matriz N-dimensional, podemos verificar o tipo de dados da imagem:

imprimir (img.dtype)

Valores de pixel da imagem:

Podemos pensar em uma imagem como um conjunto de pequenas amostras. Essas amostras são chamadas de pixels. Para uma melhor compreensão, tente aumentar o zoom em uma imagem tanto quanto possível. Podemos ver o mesmo dividido em diferentes quadrados. Esses são os pixels e, quando combinados, formam uma imagem.

Uma das maneiras simples de representar uma imagem é na forma de uma matriz. Podemos até criar uma imagem usando uma matriz e salvá-la! Mostrarei como, mais tarde neste post. Dê uma olhada na foto abaixo:

Valores de pixel da imagem | Processamento de imagem com OpenCV

2 imagem

Esta imagem é antes um exemplo de como a representação matricial de uma imagem se parece. À esquerda, está uma imagem de Lincoln, no meio, os valores dos pixels são rotulados com números de 0 a 255, denotando sua intensidade ou brilho e à direita, os próprios números em forma de matriz. Cada valor da matriz corresponde a um pixel, que é o menor elemento de informação presente em uma imagem. Verifique os valores de pixel da imagem apenas imprimindo a variável que você carregou a imagem!

imprimir (img)

Resolução de imagem:

A resolução da imagem pode ser definida como o número de pixels presentes em uma imagem. A qualidade da imagem aumenta quando o número de pixels aumenta. Já vimos a forma da imagem que dá o número de linhas e colunas. Isso poderia ser dito como a resolução dessa imagem. Algumas das resoluções padrão que quase todo mundo conhece são 320 x 240 pixels (principalmente adequadas em dispositivos de tela pequena), 1024 x 768 pixels (apropriado para exibição em monitores de computador padrão), 720 x 576 pixels (bom para visualização em TV de definição padrão conjuntos com proporção de 4: 3), 1280 x 720 pixels (para exibição em monitores widescreen), 1280 x 1024 pixels (bom para exibição em tela cheia em monitores LCD com proporção de 5: 4), 1920 x 1080 pixels (para visualização em tvs de alta definição) e agora temos até resoluções de 4K, 5K e 8K que são 3840 x 2160 pixels, 5120 × 2880 pixels e 7,680 x 4,320 pixels, respectivamente, suportadas por monitores e televisões de ultra alta definição.

Quando multiplicamos o número de colunas e o número de linhas, podemos obter o número total de pixels presentes na imagem. Por exemplo, em uma imagem 320 x 240, o número total de pixels presentes nela é de 76,800 pixels.

Vendo a imagem

Vamos ver como exibir a imagem em uma janela. Para isso, temos que criar uma janela GUI para mostrar a imagem na tela. O primeiro parâmetro deve ser o título da tela da janela GUI, especificado no formato de string. Podemos mostrar a imagem em uma janela pop-up usando o método cv2.imshow (). Mas, ao tentar fechá-lo, você pode se sentir preso à janela. Então, para combater isso, podemos usar um método simples de “waitKey”. Experimente esta parte do código em uma nova célula:

cv2.imshow ('Mandrill', img) k = cv2.waitKey (0) se k == 27 ou k == ord ('q'): cv2.destroyAllWindows ()

Aqui, especificamos o parâmetro '0' no “waitKey” para manter a janela aberta até que seja fechada. (Você também pode dar o tempo em milissegundos, em vez de 0, especificando quanto tempo deve ser aberto.) Depois disso, podemos atribuir a variável para atuar no fechamento da janela quando pressionamos a tecla 'ESC' ou a tecla ' q '. O método cv2.destroAllWindows () é usado para fechar ou excluir as janelas GUI da tela / memória.

Salvando a imagem

Antes de salvar a imagem, que tal converter a imagem em tons de cinza e salvá-la? Converta a imagem em tons de cinza usando:

cinza = cv2.cvtColor (img, cv2.COLOR_BGR2GRAY)

Agora podemos salvar a imagem:

cv2.imwrite ('Mandrill_grey.jpg', cinza)

e verifique a imagem que está sendo salva no diretório de trabalho atual. O primeiro parâmetro corresponde ao nome do arquivo no qual a imagem deve ser salva e o segundo parâmetro é a variável que contém a imagem (informação do pixel).

Extrair os planos de bits da imagem e reconstruí-los

Podemos dividir uma imagem em diferentes níveis de planos de bits. Por exemplo, divida uma imagem em planos de 8 bits (0-7), onde os últimos planos contêm a maioria das informações de uma imagem.

planos de bits

3 imagem

Para fazer isso, podemos importar mais dois pacotes:

import matplotlib.pyplot as plt import numpy as np

Se receber um erro ao importar qualquer um dos pacotes, você pode instalá-los usando:

conda instalar -c conda-forge matplotlib conda instalar -c anaconda numpy

Agora estamos definindo uma função para extrair cada um dos planos de bits de 8 níveis da imagem.

def extract_bit_plane (cd): # extraindo todos os bits um por um # do 1º ao 8º na variável # de c1 a c8 respectivamente c1 = np.mod (cd, 2) c2 = np.mod (np.floor (cd / 2) , 2) c3 = np.mod (np.floor (cd / 4), 2) c4 = np.mod (np.floor (cd / 8), 2) c5 = np.mod (np.floor (cd / 16) ), 2) c6 = np.mod (np.floor (cd / 32), 2) c7 = np.mod (np.floor (cd / 64), 2) c8 = np.mod (np.floor (cd / 128), 2) # combinando a imagem novamente para formar o equivalente à imagem original em tons de cinza cc = 2 * (2 * (2 * c8 + c7) + c6) # reconstruindo a imagem com os 3 planos de bits mais significativos to_plot = [cd, c1, c2 , c3, c4, c5, c6, c7, c8, cc] fig, axes = plt.subplots (nrows = 2, ncols = 5, figsize = (10, 8), subplot_kw = {'xticks': [], ' yticks ': []}) fig.subplots_adjust (hspace = 0.05, wspace = 0.05) para ax, i in zip (axes.flat, to_plot): ax.imshow (i, cmap =' gray ') plt.tight_layout () plt.show () return cc

Agora estamos prontos para chamar a função.

reconstructed_image = extract_bit_plane (cinza)

Reconstruímos a imagem (quase semelhante) usando os últimos três planos de bits, ou seja, o sexto, o sétimo e o oitavo planos. E o resultado é o seguinte:

reconstruir imagem | Processamento de imagem com OpenCV

Que tal construirmos uma pequena imagem por conta própria? Vamos tentar agora!

Construindo uma pequena imagem sintética

Podemos tentar gerar uma imagem sintética contendo quatro quadrados concêntricos com quatro valores de intensidade de pixel diferentes,

40, 80, 160, e 220.

con_img = np.zeros ([256, 256]) con_img [0:32,:] = 40 # linha superior con_img [:,: 32] = 40 # coluna esquerda con_img [:, 224: 256] = 40 # coluna direita con_img [224 :,:] = 40 # linha inferior con_img [32:64, 32: 224] = 80 # linha superior con_img [64: 224, 32:64] = 80 # coluna esquerda con_img [64: 224, 192: 224] = 80 # coluna direita con_img [192: 224, 32: 224] = 80 # linha inferior con_img [64:96, 64: 192] = 160 # linha superior con_img [96: 192, 64:96] = 160 # coluna esquerda con_img [96: 192, 160: 192] = 160 # coluna direita con_img [160: 192, 64: 192] = 160 # linha inferior con_img [96: 160, 96: 160] = 220 plt.imshow (con_img)

A imagem resultante ficaria assim:

saída

Podemos examinar o uso de vários filtros e transformações em imagens em outro artigo.

Obrigado por ler o artigo.

meme

4 imagem

Sinta-se à vontade para adicionar suas sugestões nos comentários e compartilhar se você gostou deste artigo. O código de programação Python completo no Jupyter Notebook, mencionado neste artigo, está disponível no meu repositório Github:

https://github.com/jissdeodates/Beginner-s-Guide-to-Computer-Vision

Referências:

  1. Imagem 1 - https://seevisionc.blogspot.com/2013/09/computer-vision-is-everywhere.html
  2. Imagem 2- https://towardsdatascience.com/everything-you-ever-wanted-to-know-about-computer-vision-heres-a-look-why-it-s-so-awesome-e8a58dfb641e
  3. Image 3- https://nptel.ac.in/content/storage2/courses/117104069/chapter_8/8_13.html
  4. Imagem 4- https://memegenerator.net/instance/21508026/willy-wonka-oh-so-you-created-a-computer-vision-algorithm-you-must-never-lose-the-remote

https://docs.opencv.org/4.5.2/d1/dfb/intro.html

https://docs.opencv.org/4.5.2/db/deb/tutorial_display_image.html

As mídias mostradas neste artigo não são propriedade da Analytics Vidhya e são usadas a critério do autor.

Fonte: https://www.analyticsvidhya.com/blog/2021/09/a-beginners-guide-to-image-processing-with-opencv-and-python/

Carimbo de hora:

Mais de Análise Vidhya