- O que são imagens?
- Como o computador armazena imagens
- Por que é difícil para uma máquina identificar imagens
- Aplicação e usos do OpenCV
- Instalando OpenCV com Python e Anaconda
- Abrindo e salvando imagens no OpenCV
- Imagem em escala de cinza em OpenCV
- Espaços de cores
- Explorando componentes individuais da imagem RGB
- Converter imagem em componente RGB individual
- Histograma de representação de imagem
- Desenho de imagens e formas usando OpenCV
Arte é uma forma de ver, e eles dizem que ver para crer, mas o oposto também é verdadeiro, acreditar é ver e é muito difícil imaginar viver neste mundo sem o dom da visão - nossos olhos, como é maravilhoso ser uma criança quando nossos olhos simplesmente se abrem, vemos o mundo e começamos a reconhecer e ver o mundo ao nosso redor, mas com o passar do tempo, a mesma experiência maravilhosa torna-se mundana. Mas à medida que avançamos com a tecnologia, chegamos a um ponto em que as máquinas também são capazes de ver e entender. Atualmente, não parece ser uma ficção científica se você apenas desbloquear o telefone com o rosto, mas a história do desenvolvimento da visão de máquina remonta a mais de 20 anos.
O passo formal inicial neste campo foi dado em 1999 em uma iniciativa da Intel, quando toda a pesquisa em andamento foi colaborada sob o OPEN CV (Open Source computer vision), originalmente escrito em C ++, com seu primeiro grande lançamento 1.0 em 2006, segundo em 2009, o terceiro em 2015 e o quarto apenas agora em 2018. Agora o OpenCV tem interfaces C ++, Python e Java e oferece suporte a Windows, Linux, Mac OS, iOS e Android. Portanto, ele pode ser facilmente instalado no Raspberry Pi com ambiente Python e Linux. E o Raspberry Pi com OpenCV e câmera conectada pode ser usado para criar muitos aplicativos de processamento de imagem em tempo real, como detecção de rosto, bloqueio de rosto, rastreamento de objeto, detecção de placa de carro, sistema de segurança residencial etc.
Antes de começar a aprender o processamento de imagens usando openCV, é importante saber o que são imagens e como humanos e máquinas percebem essas imagens.
O que são imagens?
As imagens são uma representação bidimensional do espectro de luz visível. E o espectro de luz visível é apenas uma parte do espectro eletromagnético situado entre o espectro infravermelho e ultravioleta.
Como as imagens são formadas: - quando uma luz reflete de um objeto em um filme, um sensor ou na retina.
É assim que nossos olhos funcionam, usando uma barreira para bloquear a maior parte dos pontos de luz, deixando uma pequena abertura pela qual a luz pode passar, é chamada de abertura, forma uma imagem muito focada e é um modelo funcional para uma câmera pin hole, mas há um problema em uma câmera pin hole, essa mesma quantidade de luz estará entrando na abertura, o que poderia não ser adequado para o filme ou imagem formada também não podemos obter uma imagem focada, para focalizar a imagem que nós precisa mover o filme para frente e para trás, mas isso é problemático em muitas situações.
Ou podemos corrigir esse problema usando lentes, isso nos permite controlar o tamanho da abertura, e na fotografia é conhecido como f Stop, geralmente reduz o valor de f Stop é melhor na fotografia.
O tamanho da abertura também nos permite entrar em uma boa profundidade de campo chamada Bokeh na fotografia, nos permite ter um fundo desfocado enquanto focamos na imagem.
Como o computador armazena imagens
Você deve ter ouvido falar de vários formatos de imagem, como.png,.jpgG e etc., tudo isso é representação digital do nosso mundo analógico, os computadores fazem isso traduzindo a imagem em código digital para armazenamento e, em seguida, interpretam o arquivo de volta em uma imagem exibição. Mas no básico eles usam uma plataforma comum para armazenar as imagens, e o mesmo é verdade para o openCV.
OpenCV usa espaço de cores RGB (vermelho, verde e azul) por padrão para suas imagens, onde cada coordenada de pixel (x, y) contém 3 valores variando para intensidades na forma de 8 bits, ou seja (0-255, 2 8).
A mistura de diferentes intensidades de cada cor nos dá o espectro completo, é por isso que na pintura ou na arte essas três cores são consideradas cores primárias e todas as outras como secundárias, porque a maioria das cores secundárias pode ser formada por cores primárias. Como para o amarelo, temos os seguintes valores: Vermelho - 255; Verde - 255; Azul - 0.
Agora as imagens são armazenadas em matrizes multidimensionais. Na programação, array é uma série de coleções de objetos. E aqui lidamos com três tipos de matrizes 1D, 2D e 3D, onde 'D' significa dimensional.
As imagens coloridas são armazenadas em matrizes tridimensionais, onde a terceira dimensão representa as cores RGB (que veremos mais tarde), e juntas formam diferentes intensidades de pixels para uma imagem, enquanto as imagens em preto e branco são armazenadas em matrizes bidimensionais e também existem dois tipos de imagens em preto e branco em tons de cinza e imagens binárias.
As imagens em escala de cinza são formadas a partir dos tons de cinza de uma matriz bidimensional, enquanto as imagens binárias são de pixels em preto ou branco.
Por que é difícil para uma máquina identificar imagens
A visão computacional é uma tarefa desafiadora em si mesma, você pode imaginar como é difícil dar a uma máquina um senso de visão, reconhecimento e identificação. Os seguintes fatores tornam a visão computacional tão difícil.
- Sensor de câmera e limitações de lente
- Variações do ponto de vista
- Mudança de iluminação
- Dimensionamento
- Oclusões
- Variações de classe de objeto
- Imagens ambíguas / ilusões ópticas
Aplicação e usos do OpenCV
Apesar da dificuldade, a visão computacional tem muitas histórias de sucesso
- Navegação robótica - Carros sem condutor
- Detecção e reconhecimento de rosto
- Search Engine Image Search
- Leitura de matrículas
- Reconhecimento de caligrafia
- Filtros Snapchat e Face
- Reconhecimento de objeto
- Rastreamento de bola e jogador em esportes
- E muitos mais!
Instalando OpenCV com Python e Anaconda
OpenCV é escrito em C ++, mas é muito difícil implementá-lo com C ++ e, portanto, escolhemos implementá-lo com uma linguagem de alto nível como python, e também há benefícios adicionais de implementar OpenCV com python, pois Python é uma das linguagens mais fáceis também para iniciantes É extremamente poderoso para aplicativos de ciência de dados e aprendizado de máquina e também armazena imagens em matrizes numpy que nos permite fazer algumas operações muito poderosas com bastante facilidade.
A programação básica é útil com o Exposure to High School Level Math, uma webcam, Python 2.7 ou 3.6 (o pacote Anaconda é preferível).
Etapa 1. Baixe e instale o pacote Anaconda Python
Vá para: https://www.anaconda.com/download e escolha de acordo com o clima da sua máquina, Linux ou Mac e você pode escolher a versão python 2.7 ou python 3.7 para sistemas de 64 bits ou sistemas de 32 bits, mas agora por dia, a maior parte do sistema é de 64 bits.
A distribuição Anaconda de python vem junto com o Spyder Studio, notebooks jupyter e prompt do anaconda, o que torna o python super amigável de usar. Estaríamos usando o Spyder Studio para fazer os exemplos.
A escolha entre python 2.7 ou 3.7 é completamente neutra, mas no entanto, para os exemplos , usaríamos o python 3.7, pois é o futuro do python e assumirá o python 2.7 formulário 2020, também a maioria das bibliotecas estão sendo desenvolvidas em python 3.7 mantendo o aspecto futuro do python em mente. Também dá os resultados esperados em operações matemáticas básicas, como (2/5 = 2,5), enquanto o python 2.7 avaliaria para 2. Também print é tratado como uma função no python 3.7 (print (“hello”)), por isso, dá prática aos programadores.
Etapa 2. Criando uma plataforma virtual com OpenCV
Vamos instalar o OpenCV criando uma plataforma virtual para spyder usando o prompt do Anaconda e o arquivo YML carregado aqui.
Com os arquivos YML, instalaremos todos os pacotes e bibliotecas que seriam necessários, mas, no entanto, se você deseja instalar quaisquer pacotes adicionais, você pode instalar facilmente através do prompt do anaconda, executando o comando desse pacote.
Vá para o ícone de pesquisa do Windows e encontre o terminal de prompt do anaconda, você pode encontrá-lo dentro da pasta do anaconda que acabou de instalar.
Então você tem que encontrar seu arquivo YML baixado, e a partir daqui você tem duas opções: alterar o diretório do seu terminal para o local onde o seu arquivo YML foi baixado ou copiar seu arquivo YML para o diretório onde o seu anaconda está instalado casos, ele estaria dentro da unidade C: \, depois de copiar seu arquivo YML para o local especificado RUN o seguinte comando em seu prompt
conda env create –f virtual_platform_windows.yml
Como meu sistema está rodando em windows o arquivo YML e o comando correspondem ao windows, porém você pode modificar de acordo com seu sistema substituindo windows por linux ou mac conforme os respectivos.
Nota: - Se a extração do pacote der erro, instale primeiro o pytorch e o numpy e depois execute o comando acima.
Agora encontre o navegador anaconda e haverá um menu suspenso de “Aplicativos em ___” e, a partir daí, selecione o ambiente virtual e, a partir daí, você terá que iniciar o Spyder Studio.
E é isso, você está pronto para começar!
Abrindo e salvando imagens no OpenCV
Aqui estamos explicando alguns comandos básicos e terminologia para usar Python no OpenCV. Vamos aprender sobre três funções básicas em OpenCV imread, imshow e imwrite.
# comentários em python são fornecidos pelo símbolo #
Importar opencv em python por comando
import cv2
Carregue uma imagem usando 'imread' especificando o caminho para a imagem
image = cv2.imread ('input.jpg')
Agora essa imagem está carregada e armazenada em python como uma variável que chamamos de imagem
Agora, para exibir nossa variável de imagem, usamos 'imshow' e o primeiro parâmetro para a função imshow é o título mostrado na janela da imagem, e deve ser inserido em ('') para representar o nome como uma string
cv2.imshow ('hello world', imagem)
waitkey nos permite inserir informações quando a janela da imagem é aberta, deixando-a em branco, ela apenas espera que qualquer tecla seja pressionada antes de continuar, colocando números (exceto 0), podemos especificar um atraso de quanto tempo você mantém a janela aberta (tempo em milissegundos aqui).
cv2.waitKey ()
'destroyAllWindows' fecha todas as janelas abertas, a falha em colocar isso fará com que seu programa trave.
cv2.destroyAllWindows ()
, para isso usaremos numpy, numpy é uma biblioteca para programação python para adicionar suporte a grandes arrays e matrizes multidimensionais.
import cv2 #importing numpy import numpy as np image = cv2.imread ('input.jpg') cv2.imshow ('hello_world', image) a função #shape é muito útil quando estamos olhando para as dimensões de um array, retorna uma tupla que dá a dimensão de uma imagem print (image.shape) cv2.waitKey () cv2.destroyAllWindows ()
saída do console - (183, 275, 3), as duas dimensões da imagem são 183 pixels de altura e 275 pixels de largura e 3 significa que existem três outros componentes (R, G, B) que fazem esta imagem (mostra que as imagens coloridas são armazenadas em matrizes tridimensionais).
print ('Altura da imagem:', (image.shape, 'pixels')) print ('Largura da imagem:', (image.shape, 'pixels'))
saída do console - Altura da imagem: (183, 'pixels')
Largura da imagem: (275, 'pixels')
Salvando a imagem editada no OpenCV
Usamos 'imwrite' para especificar o nome do arquivo e a imagem a ser salva.
cv2.imwrite ('output.jpg', imagem) cv2.imwrite ('output.png', imagem)
O primeiro argumento é o nome do arquivo que queremos salvar, {para ler ou salvar o arquivo que usamos ('') para indicá-lo como uma string} e o segundo argumento é o nome do arquivo.
OpenCV permite que você salve a imagem em diferentes formatos.
Imagem em escala de cinza em OpenCV
Escalonamento de cinza é o processo pelo qual uma imagem é convertida de uma cor total para tons de cinza (preto e branco)
No opencv, muitas funções escalonam as imagens antes do processamento. Isso porque simplifica a imagem, agindo quase como uma redução de ruído e aumentando o tempo de processamento, pois há menos informação na imagem (já que as imagens em tons de cinza são armazenadas em matrizes bidimensionais).
import cv2 # carregue nossa imagem de entrada image = cv2.imread ('input.jpg') cv2.imshow ('original', imagem) cv2.waitKey () # usamos cvtcolor, para converter para escala de cinza gray_image = cv2.cvtColor (imagem, cv2.COLOR_BGR2GRAY) cv2.imshow ('grayscale', gray_image) cv2.waitKey () cv2.destroyALLWindows ()
Uma forma mais simples de converter a imagem em tons de cinzaéapenas adicionar o argumento 0 na função imread ao lado do nome da imagem
import cv2 grey_image = cv2.imread ('input.jpg', 0) cv2.imshow ('grayscale', grey_image) cv2.waitKey () cv2.destroyAllWindows ()
import cv2 import numpy as np image = cv2.imread ('input.jpg') print (image.shape) cv2.imshow ('original', image) cv2.waitKey () gray_image = cv2.cvtColor (image, cv2.COLOR_BGR2GRAY) cv2.imshow ('grayscale', gray_image) print (gray_image.shape) cv2.waitKey () cv2.destroyALLWindows ()
Saída do console: - (183, 275, 3) - para imagem colorida
(183, 275) - para imagem em tons de cinza
Portanto, mostra claramente que as imagens coloridas são representadas por matrizes tridimensionais, enquanto as imagens em escala de cinza por matrizes bidimensionais.
Espaços de cores
Os espaços de cores são a forma como as imagens são armazenadas. RGB, HSV, CMYK são os diferentes espaços de cores, essas são apenas maneiras simples de representar cores.
RGB - Vermelho, Verde e Azul.
HSV - Matiz, Saturação e Valor.
E CMYK é comumente usado em impressoras jato de tinta.
Espaço de cor RGB ou BGR
O espaço de cores padrão do OpenCV é RGB. RGB é um modelo de cores aditivo que gera cores combinando as cores azul, verde e vermelho de diferentes intensidades / brilhos. No OpenCV, usamos profundidades de cor de 8 bits.
- Vermelho (0-255)
- Azul (0-255)
- Verde (0-255)
No entanto, o OpenCV realmente armazena cores no formato BGR.
Curiosidade: - Usamos a ordem BGR em computadores devido à forma como os inteiros de 32 bits não assinados são armazenados na memória, mesmo assim acaba sendo armazenado como RGB. O número inteiro que representa uma cor, por exemplo: - 0X00BBGGRR será armazenado como 0XRRGGBB.
Espaço de cor HSVHSV (Hue, Saturation & value / Brightness) é um espaço de cores que tenta representar as cores que os humanos percebem. Ele armazena informações de cores em uma representação cilíndrica de pontos de cores RGB.
Matiz - valor da cor (0-179)
Saturação - vibração da cor (0-255)
Valor - Brilho ou intensidade (0-255)
O formato de espaço de cores HSV é útil na segmentação de cores. Em RGB, filtrar cores específicas não é fácil, no entanto, o HSV torna muito mais fácil definir faixas de cores para filtrar cores específicas conforme as percebemos.
Matiz representa a cor em HSV, o valor de matiz varia de 0 a 180 e não 360, portanto, não está completando o círculo completo e, portanto, é mapeado de forma diferente do padrão.
Filtros de gama de cores
- Vermelho - (165-15)
- Verde - (45-75)
- Azul - (90-120)
Como sabemos as imagens sendo armazenadas no espaço de cores RGB (vermelho, verde e azul), o OpenCV nos mostra o mesmo, mas a primeira coisa a lembrar sobre o formato RGB do opencv é que ele é na verdade BGR e podemos saber disso olhando para o forma da imagem.
import cv2 import numpy as np image = cv2.imread ('input.jpg') # B, G, R valor para o primeiro 0,0 pixel B, G, R = imagem imprimir (B, G, R) imprimir (imagem.shape) #now se aplicarmos isso na imagem em tons de cinza gray_img = cv2.cvtColor (image, cv2.COLOR_BGR2GRAY) print (gray_img.shape) #gray_image valor de pixel para impressão de 10,50 pixels (gray_img)
Saída do console: imprimir (B, G, R) - 6 11 10
imprimir (imagem.shape) - (183, 275, 3)
imprimir (gray_img.shape) - (183, 275)
imprimir (gray_img) - 69
Agora existem apenas duas dimensões em uma imagem em escala de cinza, pois lembramos que a imagem colorida é armazenada em três dimensões, a terceira dimensão sendo o (R, G, B) enquanto em escala de cinza apenas duas dimensões estão presentes, uma vez que (R, G, B) está ausente e para uma determinada posição de pixel obtemos apenas um único valor, enquanto na imagem colorida obtemos três valores.
Outro espaço de cores útil é o HSV
import cv2 image = cv2.imread ('input.jpg') hsv_image = cv2.cvtColor (image, cv2.COLOR_BGR2HSV) cv2.imshow ('HSV image', hsv_image) cv2.imshow ('Hue channel', hsv_image) cv2. imshow ('saturation channel', hsv_image) cv2.imshow ('value channel', hsv_image) cv2.waitKey () cv2.destroyAllWindows ()
Depois de executar o código, você pode ver as quatro imagens, das quais três são dos canais individuais e uma é a imagem HSV combinada.
A imagem do canal de matiz é bastante escura porque seu valor varia apenas de 0 a 180.
Além disso, observe que a função imshow tenta mostrar a você a imagem RGB ou BGR, mas a conversão de HSV a sobrepõe.
Além disso, o canal de valor será semelhante à escala de cinza da imagem devido ao seu brilho.
Explorando componentes individuais da imagem RGB
import cv2 image = cv2.imread ('input.jpg') # função de divisão do opencv divide o imageinti cada índice de cor B, G, R = cv2.split (image) cv2.imshow ("Red", R) cv2.imshow ("Green", G) cv2.imshow ("Blue", B) #fatizando a imagem original mesclando os componentes de cores individuais mesclados = cv2.merge () cv2.imshow ("mesclados", mesclados) #amplificando a cor azul mesclada = cv2.merge () cv2.imshow ("mesclado com amplificar azul", mesclado) # representando a forma de componentes de cores individuais. # a saída seria de apenas duas dimensões, sendo altura e largura, uma vez que o terceiro elemento do componente RGB é representado individualmente print (B.shape) print (R.forma) imprimir (G.shape) cv2.waitKey (0) cv2.destroyAllWindows ()
Saída do console: #dimensions of image from shape function
(183, 275)
(183, 275)
(183, 275)
Converter imagem em componente RGB individual
No código abaixo criamos uma matriz de zeros com as dimensões da imagem HxW, zero retorna um array preenchido com zeros, mas com as mesmas dimensões.
A função de forma é muito útil quando estamos olhando para a dimensão de uma imagem, e aqui fizemos o fatiamento dessa função de forma. Portanto, a forma pegaria tudo até os pontos designados, ou seja, até os segundos pontos designados que seriam a altura e a largura da imagem, pois o terceiro representa o componente RGB da imagem e não precisamos disso aqui.
import cv2 import numpy as np image = cv2.imread ('input.jpg') B, G, R = cv2.split (image) zeros = np.zeros (image.shape, dtype = "uint8") cv2.imshow ("RED", cv2.merge ()) cv2.imshow ("Green", cv2.merge ()) cv2.imshow ("Blue", cv2.merge ()) cv2.waitKey (0) cv2.destroyAllWindows ()
Histograma de representação de imagem
A representação de histograma da imagem é o método de visualização dos componentes das imagens.
O código a seguir permite que você analise a imagem por meio do histograma de cores de seus componentes de cor combinados e individuais.
import cv2 import numpy as np # precisamos importar matplotlib para criar gráficos de histograma import matplotlib.pyplot as plt image = cv2.imread ('input.jpg') histogram = cv2.calcHist (,, None,,) #we plot a histograma, ravel () nivela nossa matriz de imagem plt.hist (image.ravel (), 256,) plt.show () #visualizando canais de cores separados color = ('b', 'g', 'r') # nós sabemos separe a cor e plote cada uma no histograma para i, col in enumerate (color): histogram2 = cv2.calcHist (,, None,,) plt.plot (histogram2, color = col) plt.xlim () plt.show ()
Vamos entender a função calcHist com cada um de seus parâmetros individuais
cv2.calcHist (imagens, canais, máscara, tamanho de hist , intervalos)
Imagens: é a imagem de origem do tipo uint 8 ou float 32. Deve ser fornecida entre colchetes, ou seja, “”, que também indica sua matriz de segundo nível, pois uma imagem para opencv são dados em uma forma de matriz.
Canais: também é fornecido entre colchetes. É o índice do canal para o qual calculamos o histograma, por exemplo se a entrada for uma imagem em tons de cinza seu valor é, para imagens coloridas você pode passar, ou para calcular o histograma do canal azul, verde e vermelho respectivamente.
Máscara: imagem de máscara. para encontrar o histograma da imagem inteira, é dado como “nenhum”. mas se você quiser encontrar o histograma de uma região específica da imagem, você deve criar uma imagem de máscara para ela e dar-lhe como uma máscara.
Histsize: representa nossa contagem BIN. Precisa ser dado entre colchetes para que a escala completa seja aprovada.
Intervalos: este é o nosso intervalo, normalmente é
Desenho de imagens e formas usando OpenCV
Abaixo estão alguns exemplos para desenhar linhas, retângulo, polígono, círculo, etc. em OpenCV.
import cv2 import numpy as np #criando uma imagem quadrada preta = np.zeros ((512,512,3), np.uint8) #também podemos criar isso em preto e branco, no entanto, não haveria alterações image_bw = np.zeros ((512.512), np.uint8) cv2.imshow ("retângulo preto (cor)", imagem) cv2.imshow ("retângulo preto (P&B)", image_bw)
Linha
#criar uma linha sobre o quadrado preto # cv2.line (imagem, coordenadas iniciais, coordenadas finais, cor, espessura) # desenhar uma linha diagonal de espessura 5 pixels imagem = np.zeros ((512,512,3), np.uint8) cv2.line (imagem, (0,0), (511.511), (255.127,0), 5) cv2.imshow ("linha azul", imagem)
Retângulo
#criar um retângulo sobre um quadrado preto # cv2.rectangle (imagem, coordenadas iniciais, coordenadas finais, cor, espessura) # desenhar um retângulo de espessura 5 pixels image = np.zeros ((512,512,3), np.uint8) cv2.rectangle (imagem, (30,50), (100,150), (255,127,0), 5) cv2.imshow ("retângulo", imagem)
Círculo#criando um círculo sobre um quadrado preto # cv2.circle (image, center, radius, color, fill) image = np.zeros ((512.512,3), np.uint8) cv2.circle (image, (100.100), (50), (255,127,0), - 1) cv2.imshow ("círculo", imagem)
Polígono#criando uma imagem de polígono = np.zeros ((512,512,3), np.uint8) #lets define quatro pontos pts = np.array (,,,], np.int32) # agora redefina nossos pontos na forma exigida por polilinhas pts = pts.reshape ((- 1,1,2)) cv2.polilinhas (imagem,, Verdadeiro, (0,255,255), 3) cv2.imshow ("polígono", imagem)
Texto#putting text using opencv # cv2.putText (image, 'text to display', bootom ponto inicial esquerdo, fonte, tamanho da fonte, cor, espessura) image = np.zeros ((512,512,3), np.uint8) cv2. putText (image, "hello world", (75.290), cv2.FONT_HERSHEY_COMPLEX, 2, (100,170,0), 3) cv2.imshow ("hello world", image) cv2.waitKey (0) cv2.destroyAllWindows ()
Visão computacional e OpenCV são tópicos muito vastos para cobrir, mas este guia seria um bom ponto de partida para aprender OpenCV e processamento de imagens.