Este é um Desafio de Projeto: Redução de Dimensionalidade em Imagens para Redes Neurais da DIO.me com o objetivo de criar um programa em Python que processa imagens de uma URL fornecida pelo usuário e converte para escala de cinza e binarizando-as.
A redução de dimensionalidade é a técnica utilizada para simplificar os dados, eliminando informações irrelevantes ou redundantes.
Imagine que você está lidando com uma base de dados gigante. Essa base pode conter muitas colunas e linhas cheias de valores, mas nem todos esses dados são necessários para o aprendizado do sistema. Às vezes, há informações duplicadas ou até irrelevantes — como a data de nascimento em um banco de dados sobre clientes, que não é tão importante quanto o sexo ou a renda.
Por exemplo: um veículo autônomo detectando pedestres na rua, ele precisa se concentrar nas pessoas que estão realmente atravessando. Mas e se eu reduzir as informações? Pode ser útil para focar apenas nos dados relevantes — como o movimento das pessoas ou a presença de obstáculos.
A principal razão é diminuir a complexidade do processamento. Quanto mais dados você tiver, maior será a carga computacional para analisar e armazenar essas informações - e isso pode até atrapalhar o sistema.
Por exemplo, em um banco de dados sobre clientes:
- A data de nascimento talvez nem seja necessária.
- O sexo também pode ser simplificado (feminino/masculino).
Mas cuidado: não podemos eliminar tudo! Temos que garantir que as informações essenciais para a tarefa não sejam descartadas.
Um carro autônomo pode estar processando imagens de alta resolução em tempo real, mas nem sempre precisa analisar todos os detalhes com exatidão. Por exemplo:
- Calçadas próximas à rua podem ser ignoradas.
- Detalhes como a marca de um carro ou o número da placa não são tão importantes quanto sua posição e movimento.
Mas quando se trata de placas de trânsito, semáforos ou outros objetos que exigem precisão — então é necessário manter uma resolução maior. O desafio está em identificar quais dados são realmente relevantes para cada caso.
Na robótica, podemos pensar no exemplo de um jogo de futebol com robôs. Os robôs precisam detectar a bola, mas não importa o modelo ou a cor exata — apenas sua localização.
- A imagem pode ser convertida para tons de cinza (redução de dimensionalidade).
- Mesmo em preto e branco, é possível identificar os objetos importantes.
Já no caso da representação facial, como a famosa "Lena", que foi usada historicamente nos primeiros experimentos com computadores:
# Exemplo simplificado usando biblioteca de processamento de imagem
import cv2 # Biblioteca OpenCV
imagem = cv2.imread("lena.jpg")
cinza = cv2.cvtColor(imagem, cv2.COLOR_BGR2GRAY) # Converte para tons de cinza (redução de dimensionalidade)
# Visualização da imagem original e convertida
cv2.imshow("Original", imagem)
cv2.imshow("Tons de Cinza", cinza)Um dos exemplos mais comuns é o Binarizador, que reduz a imagem para apenas dois valores — preto ou branco.
# Exemplo de binarização usando OpenCV (biblioteca de visão computacional)
import cv2 # Biblioteca OpenCV
imagem = cv2.imread("foto.jpg")
binaria = cv2.threshold(imagem, 160, 255, cv2.THRESH_BINARY)[1] # Aplica um limiar para binarizar a imagemNesse caso:
- Valores abaixo do limiar (ex: 160) são convertidos em preto.
- Valores acima são convertidos em branco.
Isso permite que o sistema se concentre apenas nas bordas e objetos definidos, ignorando detalhes menores.
Você já deve ter notado isso: quando compartilhamos fotos no WhatsApp ou outras redes sociais, elas são enviadas com menor qualidade. Mas ainda assim conseguimos entender o que está acontecendo na imagem! Isso é possível graças à redução de dimensionalidade.
Outro exemplo:
- Veículos teleguiados (como os usados em Marte) transmitem imagens simplificadas para a Terra.
- A redução ajuda no armazenamento e processamento mais rápido dos dados, sem perder a essência da informação transmitida.
Nesta atividade, é implementada uma função Python que reduza as dimensões das imagens. Isso inclui converter imagens coloridas para tons de cinza e realizar a binarização (conversão para preto e branco).
Converter uma imagem colorida em uma imagem com tons de cinza. Cada pixel da imagem colorida terá três valores de cor (vermelho, verde, azul). Para obter o valor do cinza, podemos usar a média ponderada desses valores.
-
Requisitos
- A função deve receber uma imagem em formato RGB.
- Deve retornar uma nova imagem com tons de cinza.
-
Lógica da Conversão
O valor do pixel em tons de cinza pode ser calculado pela fórmula:
cinza = 0.299 * R + 0.587 * G + 0.114 * B
Substituir cada componente RGB (R, G, B) do pixel pelo valor de cinza.
-
Implementação
- Ler a imagem e obtenha os valores RGB para cada pixel.
- Para cada pixel, calcule o valor de cinza usando a fórmula acima.
- Criar uma nova imagem onde cada pixel tenha apenas um valor (cinza).
-
Exemplo
Supor um pixel com valores RGB:(70, 120, 50).
cinza = 0.299 * 70 + 0.587 * 120 + 0.114 * 50
≈ (20.93) + (70.44) + (5.7)
≈ 97
O pixel resultante será (97, 97, 97).
Converta uma imagem de tons de cinza em uma imagem preto e branco (binária). Defina um limiar para converter os pixels abaixo desse valor em preto e os demais em branco.
-
Requisitos
- A função deve receber uma imagem em tons de cinza.
- Deve retornar uma imagem binária com apenas dois valores:
0(preto) ou255(branco).
-
Lógica da Binarização Escolha um valor de limiar (threshold). Por exemplo, se o limiar for 128:
- Valores de cinza abaixo de 128: preto (
0) - Valores de cinza acima ou igual a 128: branco (
255)
- Valores de cinza abaixo de 128: preto (
-
Implementação
- Leia a imagem em tons de cinza.
- Para cada pixel, compare o valor com o limiar definido.
- Se o valor for menor que o limiar, converta para
0(preto). - Caso contrário, converta para
255(branco).
Exemplo
Supor uma imagem em tons de cinza com um pixel de valor 97 e outro de 150.
Limiar = 128
Pixel 97: abaixo do limiar → preto (0)
Pixel 150: acima do limiar → branco (255)
- Usar a biblioteca
Pillowpara manipular imagens, mas se preferir uma abordagem mais básica, pode usar listas e estruturas de dados. - A função deve manter as dimensões originais da imagem.
- Faz o download de uma imagem a partir de uma URL.
- Converte a imagem original para tons de cinza.
- Realiza a binarização da imagem (preto e branco) com base na média dos valores de pixel.
- Exibe as três versões da imagem (original, escala de cinza, binarizada) lado a lado.
- Python 3.10+
- Bibliotecas:
Pillowpara manipulação de imagens.numpypara processamento de arrays de pixels.matplotlibpara exibição das imagens.requestspara realizar o download da imagem.
-
Clone este repositório:
git clone https://github.com/jocile/reducao-de-dimensionalidade.git cd reducao-de-dimensionalidade -
Instale as dependências:
pip install -r requirements.txt- Execute o programa:
python binarizacao_de_imagem.py- Siga as instruções no terminal:
- Insira a URL de uma imagem para processar.
- Escolha se deseja processar outra imagem ou encerrar o programa.
Exemplo de Entrada e Saída Entrada URL da imagem: https://example.com/imagem.jpg
Saída: O programa exibirá as três versões da imagem:
- Original (colorida).
- Escala de cinza.
- Preto e branco.
Nesta atividade, foram implementadas funções que realizam a redução de dimensionalidade em imagens. Isso é uma base sólida para entender conceitos mais avançados como processamento de imagem e aprendizado de máquina.