# 📖 README - TRABALHO 1, PROG2
> Este projeto implementa um sistema para processamento de imagens usando o método Local Binary Patterns (LBP). O sistema é capaz de calcular histogramas LBP, comparar imagens e gerar imagens LBP a partir de imagens de entrada. Abaixo está a descrição da estrutura do programa e dos arquivos que o compõem.
# 💻 1. Estrutura do Programa
* ### LBP.c : Contém a função principal do programa e gerencia a lógica de execução.
* ### leitura.c : Contém funções para leitura e escrita de arquivos de imagem no formato PGM e de arquivos LBP.
* ### operações.c : Implementa funções relacionadas ao cálculo de LBP, histogramas e manipulação de imagens.
* ### processamento.c : Contém a lógica de processamento de imagem, incluindo a geração de histogramas LBP.
* ### LBP.h : Cabeçalho que declara as funções implementadas em LBP.c e outros arquivos.
* ### Makefile : Script para compilar o programa.
# 💻 2. Descrição dos Arquivos
## 2.1 LBP.c
* ### Gerencia a execução com base nos argumentos fornecidos na linha de comando. Verifica se os argumentos estão corretos para encontrar a imagem mais similar ou para verificar a imagem de entrada. Dependendo da condição atendida, chama as funções achar_imagem_similar ou verificar_pgm. O programa termina com return 0, indicando uma execução bem-sucedida.
## 2.2 leitura.c
### Função ler_cabeçalho
* ### A função ler_cabeçalho é responsável por ler o cabeçalho de uma imagem PGM. Ela recebe um ponteiro para o arquivo de entrada e variáveis para armazenar informações como o número mágico (tipo da imagem), largura, altura e valor máximo dos pixels. O processo é realizado da seguinte forma:
### Função ignorar_comentarios
* ### A função ignorar_comentarios lê o arquivo de entrada e ignora linhas de comentários que começam com #. Quando encontra um caractere que não é #, usa ungetc para devolver o caractere ao fluxo, permitindo que a leitura continue normalmente.
### Função ler_p5
* ### A função ler_p5 lê os dados da imagem em formato P5 (imagem binária). Ela recebe o arquivo de entrada e um ponteiro para um array que armazena os dados da imagem. Utiliza fread para ler o número total de pixels.
### Função ler_p2
* ### A função ler_p2 lê os dados da imagem em formato P2 (imagem ASCII). Para cada pixel, lê um valor inteiro e o converte para unsigned char, armazenando-o no array correspondente.
### Função salvar_arquivo_lbp
* ### A função salvar_arquivo_lbp salva o histograma LBP em um arquivo binário. Ela recebe o nome do arquivo e um ponteiro para o histograma LBP, utilizando fwrite para gravar os dados. Fecha o arquivo após a escrita.
### Função carregar_arquivo_lbp
* ### A função carregar_arquivo_lbp carrega um histograma LBP a partir de um arquivo. Se o arquivo não puder ser aberto, retorna 0. Caso contrário, utiliza fread para ler os dados do histograma e retorna 1 se a leitura for bem-sucedida.
## 2.3 operação.c
* ### Este conjunto de funções é responsável pela listagem de imagens no formato PGM em um diretório, verificação da existência de arquivos, extração do nome do arquivo a partir de um caminho, e busca de uma imagem similar com base no histograma LBP.
### Função listar_imagem_diretorio
* ### A função listar_imagem_diretorio abre um diretório e lista todos os arquivos com a extensão .pgm.
### Função verificar_arquivo_existe
* ### A função verificar_arquivo_existe utiliza stat para verificar se um arquivo existe no caminho fornecido.
### Função extrair_nome_arquivo
* ### A função extrair_nome_arquivo utiliza strrchr para localizar a última ocorrência do caractere / em um caminho de arquivo. Se encontrado, retorna o nome do arquivo; caso contrário, retorna o caminho completo.
### Função achar_imagem_similar
* ### A função achar_imagem_similar procura pela imagem mais similar a uma imagem de entrada em um diretório, utilizando a comparação de histogramas LBP.
### Função verificar_pgm
* ### A função verificar_pgm valida se a imagem de entrada possui a extensão .pgm e, se a validação for bem-sucedida, chama a função para gerar a imagem LBP correspondente.
## 2.4 processamento.c
* ### Este relatório descreve funções para calcular o LBP de uma imagem, gerar e salvar histogramas LBP, além de manipular arquivos de imagem no formato PGM.
### Função calcular_lbp
* ### A função calcular_lbp determina o valor LBP de um pixel específico na imagem.Define um array de deslocamentos para os 8 vizinhos do pixel central. Comparação com o Pixel Central, para cada vizinho, verifica se ele está dentro dos limites da imagem. Se o valor do vizinho for maior ou igual ao do pixel central, acumula um valor que corresponde a uma potência de 2.
### Função calcular_histograma
* ### A função calcular_histograma gera o histograma LBP para toda a imagem, Percorre cada pixel, calculando seu valor LBP usando a função calcular_lbp. Incrementa a contagem correspondente no histograma para cada valor LBP encontrado. Normalização: Divide cada entrada do histograma pelo total de pixels, normalizando os valores.
### Função distancia_euclidiana
* ### A função distancia_euclidiana calcula a distância Euclidiana entre dois histogramas LBP:
### Função processar_imagem
* ### A função processar_imagem carrega uma imagem, calcula e salva seu histograma LBP Tenta carregar o histograma LBP de um arquivo. Se o histograma não estiver disponível, lê o cabeçalho da imagem e os dados dos pixels. Chama calcular_histograma para gerar o histograma a partir dos dados da imagem. Salva o histograma em um arquivo para uso futuro.
### Função gerar_imagem_lbp
* ### A função gerar_imagem_lbp cria uma nova imagem LBP a partir de uma imagem de entrada Lê a imagem de entrada e seus dados. Cálculo do LBP: Para cada pixel, calcula seu valor LBP e armazena na nova imagem. Salva a imagem LBP gerada no formato P5 ou P2, dependendo do formato da imagem de entrada.
### Funções salvar_imagem_p5 e salvar_imagem_p2
* ### Essas funções salvam os dados da imagem LBP em arquivos no formato P5 e P2, respectivamente. Elas escrevem o cabeçalho correto e os dados da imagem nos arquivos de saída.