Como o computador entende a imagem e a famosa OpenCV

Ariane Lima
Syngenta Digital Insights
6 min readJul 24, 2023

Se você já ouviu falar sobre Visão Computacional, sabe que a imagem digital é o componente principal dessa ciência, mas o que de fato é uma imagem, falando de modo geral? Se procurarmos no dicionário vamos encontrar coisas do tipo: “representação, reprodução ou imitação da forma de uma pessoa ou de um objeto” ou “aspecto particular pelo qual um ser ou um objeto é percebido; cena, quadro”. A imagem digital que tanto nos referimos na Visão Computacional também é uma representação de algo no mundo real, mas de forma digital, aí que surge alguns questionamentos do tipo: Como é essa representação digital? Como o computador entende a imagem? Como manipular esse dado?

Calma, essas e outras perguntas vão ser respondidas nesse artigo.

Imagem Digital

Você já deve ter ouvido o termo pixel alguma vez na vida, por exemplo, quando olhou a resolução de uma foto ou as configurações de alguma câmera. Esse termo Pixel surgiu da união de duas palavras em inglês: Picture (imagem) e Element (elemento). Pois bem, a imagem digital é composta por pixels distribuídos em forma de uma matriz retangular (x,y,u) onde cada um possui uma localização (x,y) e uma intensidade (u). Resumidamente, uma imagem é formada por um conjunto de pixels e cada um deles possui uma localização e um valor de intensidade.

Em relação à localização o sistema de coordenadas adotado para representar essa matriz de pixels é o da mão esquerda, onde x representa as colunas e y as linhas, conforme a imagem abaixo:

Sistema de coordenadas de mão esquerda. Olhando como referência a palma
da mão, o polegar define o eixo x (colunas), e o indicador o eixo y (linhas). Adaptado de (KETTLE,2019)

Em relação ao valor de intensidade do pixel, as imagens podem ser escalares, binárias ou vetoriais.

  • Escalares: Nesse caso, os valores de pixel são valores inteiros que começam no 0 e vão até 2^a — 1, onde a equivale o número de bits, geralmente usamos variáveis de 8 bits, então os valores são de 0 a 255.
  • Binárias: Quando uma imagem é binária os valores de pixel podem ser somente dois valores. Geralmente trata-se o 0 como falso e não 0 como verdadeiro.
  • Vetoriais: uma imagem com valor vetorial em seus pixels contém mais de um canal ou banda, ou seja, cada pixel da imagem possui um vetor com valores escalares de tamanho Ncanais. Um exemplo de imagens vetoriais são as imagens que estão em algum espaço de cor, como no RGB.

Você percebeu que surgiu um termo novo aí, o tal de ‘espaço de cor’. Pelo nome dá para termos uma ideia do que é, mas vou explicar melhor para vocês.

Espaço de cores

Em visão computacional as cores são representadas de acordo com o espaço de cor em que a imagem se apresenta, sendo RGB e HSV, os espaços de cor mais comuns. Tanto um quanto o outro para representar uma cor específica, é necessário a combinação de três componentes, ou seja, imagens desse tipo possuem um vetor de 3 posições no valor de pixel.

Vimos então que as cores são representadas pela combinação de componentes, mas que componentes são esses? Vamos lá.

RGB

O espaço de cor RGB possui um canal para representar o vermelho (Red — R), o verde ( Green — G) e o Azul (Blue -B). Cada um desses canais pode ter valores de 0 a 255, gerando assim 16.777.216 cores possíveis. É muita cor, não é?!

O conjunto com todas as cores é comumente representado por um cubo (o famoso cubo RGB), conforme a imagem abaixo:

O cubo RGB medido pelos eixos de coordenadas Vermelho, Verde e Azul,
ilustrando uma cor q no cubo definida por um valor triplo (R,G, B ). Adaptado de (KETTLE,219)

HSV

Para obtermos o espaço de cor HSV basta realizarmos um corte hexagonal ao eixo da diagonal principal do cubo RGB, assim teremos um cone, o qual representa esse espaço. Talvez essa definição seja um pouco difícil de imaginar, então para facilitar, imagina pegando a diagonal principal do cubo RGB, e alinhando-a com o eixo y, assim você obtém também o cone HSV. A imagem abaixo mostra o cone do HSV.

Cone HSV. Adaptado de (Ibraheem,2012)

Igual o RGB, o HSV possui três componentes para representar uma cor, sendo a matiz ( Hue — H), a saturação (S) e o valor (V).

  • Matiz — O componente matiz indica as diferentes cores, de acordo com a variação do anglo ao redor de eixo vertical indo de 0 a 360 graus.
  • Saturação — A saturação representa a pureza da cor, medido pela distância do centro a extremidade do cone variando de 0 (cor acinzentada) a 1 (cor pura). Se tivermos a saturação bem no centro o valor de H é insignificante porque teremos a escala de cinza.
  • Valor — Esse componente indica a intensidade da cor, o brilho, o grau de cor clara ou escura, variando de 0 a 1.

    Depois de tanta teoria você deve estar pensando, como manipular esse tipo de dado em um script? Calma, que para ajudar nós programadores de Visão Computacional temos a famosa biblioteca OpenCV.

Opencv

A OpenCV (Open Source Computer Vision Library) é uma biblioteca de visão computacional e aprendizado de máquina de código aberto. Ela fornece uma gama de funções e algoritmos para manipulação de imagens e vídeos, detecção de objetos, calibração de câmera, entre outros.

A OpenCV foi inicialmente escrita em C e C++, porém oferece suporte para várias linguagens de programação, como Python, Java e MATLAB, tornando-a acessível a uma ampla comunidade de desenvolvedores, ou seja, independente da sua linguagem de programação de preferência, a OpenCV está lá para te ajudar.

A lista de funções e algoritmos disponíveis é gigante, mas separei alguns para ilustrar:

  • Para processamento de imagens, a OpenCV fornece uma variedade de funções, incluindo redimensionamento, rotação, recorte, filtragem, suavização, equalização de histograma e transformações de cores.
  • A OpenCV possui algoritmos para detecção e reconhecimento de objetos em imagens e vídeos. Isso inclui detecção de rostos, detecção de objetos em geral (usando algoritmos como Haar cascades ou HOG), rastreamento de objetos em movimento e reconhecimento de padrões.
  • Se você precisa de calibração de câmera, a OpenCV oferece métodos para essa tarefa, determinando seus parâmetros intrínsecos e extrínsecos, o que é muito útil em aplicações que envolvem reconstrução 3D, realidade aumentada, mapeamento de câmera, entre outros.

Além desses recursos principais, a OpenCV possui muitas outras funcionalidades, como manipulação de contornos, detecção de linhas e círculos, segmentação de imagem, análise de textura e muito mais. A biblioteca é bem documentada e possui uma comunidade ativa de desenvolvedores, o que facilita o aprendizado e a resolução de problemas.

Aqui na Syngenta Digital, no time de Visão Computacional, a OpenCV é uma aliada para o desenvolvimento de novas soluções para reinventar o agro. Se você ficou curioso(a) para saber como tudo isso funciona na prática, já que nem só de teoria vive o dev, recentemente eu fiz uma LiveCode usando a OpenCV para segmentação de objetos em vídeo utilizando somente filtros de cor.

Confere aqui, o vídeo na íntegra: http://bit.ly/3zIfSi3

E a pergunta que fica é: o que está esperando para começar a explorar esse campo fascinante da tecnologia?

Referências:

https://opencv.org/

KLETTE, R. CONCISE COMPUTER VISION: An Introduction Into Theory and Algorithms. SPRINGER, 2019

EISSA, A. A.; KHALIK, A. A.; ABDEL, A. Understanding color image processing by machine vision for biological materials. Structure and Function of Food Engineering, BoD–Books on Demand, p. 227–274, 2012.

Ibraheem, Noor & Hasan, Mokhtar & Khan, Rafiqul Zaman & Mishra, Pramod. (2012). Understanding Color Models: A Review. ARPN Journal of Science and Technology. 2.

--

--