Skip to content

Latest commit

 

History

History
112 lines (73 loc) · 3.94 KB

File metadata and controls

112 lines (73 loc) · 3.94 KB

String Code Decoder (Decodificador de Código de Cadeia)

Este projeto implementa um decodificador e codificador (normalizador) de Código de Cadeia (Chain Code) em C++. Ele permite converter entre imagens bidimensionais e representações compactadas canônicas.

  • Codificação: Extrai o contorno de uma imagem binária PBM (Portable Bitmap) e gera um arquivo .ctn normalizado.
  • Decodificação: Reconstrói contornos 2D a partir do formato compactado .ctn, gerando uma imagem PBM de saída.

📚 Introdução Teórica

Em Processamento Digital de Imagens (PDI), o Código de Cadeia é uma técnica clássica para representar fronteiras/contornos de objetos de forma extremamente compacta. Em vez de armazenar todas as coordenadas da fronteira, o algoritmo armazena uma coordenada inicial e uma sequência de direções de deslocamento para os pixels subsequentes.

Este decodificador utiliza a conectividade 8-direcional, cujo mapeamento padrão de direções a partir de um pixel central (x) é:

  3   2   1
   \  |  /
  4 - x - 0
   /  |  \
  5   6   7

Cada número de 0 a 7 representa um deslocamento na matriz de pixel em relação à posição atual (onde a origem (0,0) está no canto superior esquerdo).


📂 Arquitetura do Projeto

O código-fonte foi estruturado de forma modular e orientada a objetos na pasta src/:

  • Image.hpp / .cpp: Responsável pela alocação e manipulação da matriz de pixels e leitura segura de arquivos .pbm (com tratamento para quebras de linha no Windows/Linux).
  • Encoder.hpp / .cpp: Lógica de localização do ponto inicial, rastreamento de contornos (chain generation) e normalização canônica para encontrar a menor sequência.
  • Decoder.hpp / .cpp: Descompactação da cadeia hexadecimal para gerar o caminho de pixels ativo.
  • Common.hpp: Estruturas compartilhadas (coordenadas bidimensionais e configuração da vizinhança de deslocamento).
  • main.cpp: Ponto de entrada que disponibiliza uma Interface de Linha de Comandos (CLI) simplificada, gerando os nomes dos arquivos de saída automaticamente.

🛠️ Compilação e Execução

O projeto inclui um Makefile configurado para ser totalmente multiplataforma (Windows/Linux/macOS).

Pré-requisitos

  • Compilador g++ (com suporte C++17).
  • Ferramenta make (ou mingw32-make no Windows).

1. Compilar o Projeto

Para gerar o executável decoder (ou decoder.exe no Windows) dentro da pasta build/:

  • Windows (MSYS2/MinGW): mingw32-make
  • Linux / macOS: make

2. Executar o Teste Padrão Automatizado

Compila (se necessário) e roda sequencialmente o decodificador e o codificador com os dados de exemplo da pasta data/:

  • Windows: mingw32-make run
  • Linux / macOS: make run

🚀 Como Utilizar (Interface de Comandos Simplificada)

O programa agora utiliza geração automática do arquivo de saída. O arquivo processado será salvo automaticamente no mesmo diretório do arquivo original, acrescentando o sufixo _new.

Decodificar (Converter .ctn para .pbm)

./build/decoder -d <caminho/arquivo.ctn>

Exemplo: ./build/decoder -d data/triangle.ctn -> Gera automaticamente o arquivo data/triangle_new.pbm

Codificar (Converter .pbm para .ctn)

./build/decoder -e <caminho/arquivo.pbm>

Exemplo: ./build/decoder -e data/square_new.pbm -> Gera automaticamente o arquivo data/square_new_new.ctn

📥 Formatos de Arquivo

O Arquivo .ctn (Código de Cadeia)

Contém sequencialmente: Dimensões (linhas, colunas), Ponto Inicial (linha, coluna), Quantidade de Pontos, e a Cadeia Hexadecimal de deslocamentos.

7 7
2 1
13
F700124648

O Arquivo .pbm (Portable Bitmap)

Formato ASCII em que 1 representa o contorno ativo (preto) e 0 representa o fundo (branco).

P1
#contour decoding image
7 7
0 0 0 0 0 0 0 
0 0 1 1 1 1 0 
0 1 0 0 1 0 0 
0 0 1 0 1 0 0 
...