Universidade Tecnológica Federal do Paraná (UTFPR) Departamento Acadêmico de Informática (DAINF) Algoritmos II Professor: Alex Kutzke (alexk@dainf.ct.utfpr.edu.br) Especificação do Primeiro Trabalho Prático Componentes conexas de imagem PPM 1 Sumário e Objetivo O trabalho aqui especificado visa implementar um programa em linguagem C capaz de determinar as componentes conexas existentes em uma imagem I de formato PPM. O programa deve, além de apresentar uma lista das componentes conexas encontradas e seus tamanhos, ser capaz, ainda, de gerar uma nova imagem I x com as mesmas dimensões da imagem I que contenha apenas as componentes maiores que N e menores do que M pixels. Cada componente aprensentada na imagem I x deve possuir apenas uma cor. O trabalho deve ser implementado inteiramente em Linguagem C. Um pequeno relatório no formato PDF deve ser enviado juntamente ao(s) código(s) fonte do programa. A entrega deve ser realizada pelo site da disciplina até a seguinte data: 04/11/2015 às 23:59h. O trabalho deve ser realizado em dupla ou individualmente. As próximas Seções descrevem a especificação do trabalho em detalhes. 2 Segmentação de imagens e Componentes conexas A função básica do programa a ser implementado é definida como a extração de componentes conexas identificáveis em um arquivo de imagem digital. Essa função é bastante relevante para o campo de estudo de Processamento de imagens, especificamente no que se refere à segmentação de imagens digitais. 1
Segundo o site Wikipedia 12, segmentação de imagens se refere ao processo de dividir uma imagem digital em múltiplas regiões (conjunto de pixels) ou objetos, com o objetivo de simplificar e/ou mudar a representação de uma imagem para facilitar a sua análise. A segmentação de imagens é, tipicamente, usada para localizar objetos e formas (linhas, curvas, etc) em imagens. O resultado da segmentação de imagens é um conjunto de regiões/objetos ou um conjunto de contornos extraídos da imagem. Como resultado, cada um dos pixels em uma mesma região é similar com referência a alguma característica ou propriedade computacional, tais como cor, intensidade, textura ou continuidade. Regiões adjacentes devem possuir diferenças significativas com respeito a mesma característica(s). Como salientado no trecho acima, o resultado do processo de segmentação de uma imagem digital é um conjunto de regiões ou objetos. É comum chamar cada um dessas regiões/objetos de componentes conexas. Bastante similar ao conceito de Conectividade de Grafor, o termo componente conexa se refere a um conjunto de objetos (no caso da imagem digital, de pixels) que se conectam de alguma forma (novamente, no contexto de uma imagem digital, os pixel compartilham de alguma característica específica [cor, intensidade entre outras]). As Figuras 1, 2 e 3 apresentam exemplos de segmentações de imagens. O trabalho aqui especificado visa a implementação de um programa capaz de segmentar uma imagem digital no formato PPM. Este formato é descrito na próxima Seção. 3 Formato PPM Os formatos de imagem digital nomeados PBM (Portable BitMap), PGM (Portable GrayMap) e PPM (Portable PixMap) são protocolos de imagem digital criados pelo projeto Netpbm 3. Suas características são: simplicidade e ausência de compressão. 1 https://pt.wikipedia.org/wiki/segmenta\%c3\%a7\%c3\%a3o_ (processamento_de_imagem) 2 Refere-se aqui ao site Wikipedia apenas como uma fonte rápida de informações. O que se encaixa bem ao objetivo dessa especificação. Entretanto, é importante deixar claro que o site Wikipedia não é (por enquanto) uma fonte ciêntífica de informação e o seu uso neste texto tem um objetivo apenas informativo. 3 https://en.wikipedia.org/wiki/netpbm 2
Figura 1: Exemplo de segmentação de imagem digital. A seguir são descritas as regras de formatação para esses formatos. 3.1 Descrição do formato Cada arquivo dos formatos PBM, PGM e PPM são iniciados com dois caracteres que identificam o tipo do arquivo, também chamados de número mágico. A seguinte Tabela 1 define os tipos possíveis: Tabela 1: Tipos de imagem dos formatos PBM, PGM e PPM. Formato Número Mágico Tipo de dados Extensão Cores Portable BitMap P1 ASCII.pbm 0 1 (preto e branco) Portable GrayMap P2 ASCII.pgm 0 255 (escala cinza) Portable PixMap P3 ASCII.ppm 0 255 (RGB) Portable BitMap P4 binário.pbm 0 1 (preto e branco) Portable GrayMap P5 binário.pgm 0 255 (escala cinza) Portable PixMap P6 binário.ppm 0 255 (RGB) Os formatos com tipo de dados ASCII é legível para humanos, uma vez que utiliza caracteres da tabela ASCII na descrição da imagem. Já o tipo de 3
Figura 2: Exemplo de segmentação de imagem digital. dados binário, como o nome já sugere, apresenta os dados das imagens em formato de máquina. As linhas imediatamente seguintes ao número mágico podem conter comentários se iniciadas pelo caractér #. Essas linhas são ignoradas. Na sequência, dois números inteiros são apresentados, os quais representam a largura (W ) e a altura (H) da imagem em pixels, respectivamente. A próxima linha (com excessão do formato PBM), exibe um único número inteiro, o qual representa o valor máximo encontrado nos pixels da imagem (em geral, esse valor é igual a 255). As linhas seguintes descrevem os W H pixels que compõem a imagem. Para o formato PBM, os pixels são representados por 0 (preto) ou 1 (branco). Para o formato PGM, cada pixel é descrito por um valor de 0 a 255, indicando o nível de cinza. Por fim, no formato PPM, cada pixel é representado por 3 inteiros. Cada um representa o nível de uma das cores RGB (vermelho, verde e azul) e varia de 0 a 255. A seguir são apresentados exemplos de imagens nos formatos PGM e PPM. 4
Figura 3: Exemplo de segmentação de imagem digital. 3.2 Exemplo de imagem PGM O seguinte arquivo PGM gera a imagem exibida pela Figura 4. P2 # Shows the word "FEEP" (example from Netpbm man page on PGM) 24 7 15 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 3 3 3 0 0 7 7 7 7 0 0 11 11 11 11 0 0 15 15 15 15 0 0 3 0 0 0 0 0 7 0 0 0 0 0 11 0 0 0 0 0 15 0 0 15 0 0 3 3 3 0 0 0 7 7 7 0 0 0 11 11 11 0 0 0 15 15 15 15 0 0 3 0 0 0 0 0 7 0 0 0 0 0 11 0 0 0 0 0 15 0 0 0 0 0 3 0 0 0 0 0 7 7 7 7 0 0 11 11 11 11 0 0 15 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 5
Figura 4: Imagem gerada a partir do arquivo PGM apresentado (imagem aumentada). O seguinte arquivo PPM gera a imagem exibida pela Figura 5. P3 # The P3 means colors are in ASCII, then 3 columns and 2 rows, # then 255 for max color, then RGB triplets 3 2 255 255 0 0 0 255 0 0 0 255 255 255 0 255 255 255 0 0 0 Figura 5: Imagem gerada a partir do arquivo PPM apresentado (imagem aumentada). As implementações deste trabalho devem considerar apenas o formato PPM, com tipo de dados ASCII, ou seja, com número mágico P3. 4 Instruções de implementação O trabalho deve ser realizado em duplas ou individualmente. A implementação deve ser inteiramente em linguagem C e deve fazer uso dos Tipos 6
Abstratos de Dados Lista e Pilha apresentados durante as aulas da disciplina. O programa deverá receber 4 parâmetros através da linha de comando: $./componentes_conexas arquivo_entrada.ppm arquivo_saida.ppm MIN MAX São eles: arquivo entrada.ppmnome do arquivo de imagem em formato PPM a ser analisado; arquivo saida.ppm: Nome do arquivo de imagem em formato PPM a ser gerado pelo programa; MIN: Número mínimo de pixels que uma componente conexa deve possuir para ser apresentada no arquivo de saída; MAX: Número máximo de pixels que uma componente conexa pode possuir para ser apresentada no arquivo de saída. A especificação das estruturas de dados utilizadas na implementação, bem como o uso da pilha e da lista, é livre. Cada dupla ou aluno pode definir a forma que lhes parecer melhor. Entretanto, é importanto que essas escolhas de implementação estejam explicadas no relatório entregue junto à implementação. Uma sugestão seria utilizar a pilha para auxiliar no algoritmo de detecção de componentes conexas, a lista para armazenar estruturas que representam uma componente conexa e uma matriz de estrutura para armazenar a imagem. Por exemplo (é só um exemplo, não foi testado): typedef struct{ // valores de rgb int r,g,b; // informa se o pixel ja foi visitado int visitado; // informa a qual componente o pixel pertence int id_componente; }ponto_rgb; typedef struct{ 7
int id, tamanho; }componente; ponto_rgb ** imagem; Dois pixels P 1 e P 2 devem ser considerados similares através da seguinte regra: diferenca = ( P 1.r P 2.r ) + ( P 1.g P 2.g ) + ( P 1.b P 2.b ) (1) Se diferenca < 30, então pixel P1 e pixel P2 são similares entre si. Não é permitido o uso de recursão na implementação deste trabalho. A seguir seguem alguns exemplos de execução do programa a ser implementado: 8
4.1 Exemplo 1: U Imagem u.ppm MAX: 50000 MIN: 5000 Componentes conexas: 2 - Componente 1: XXXXX pixels - Componente 2: YYYYY pixels Figura 6: Imagem original à esquerda e imagem gerada pelo programa à direita. 9
4.2 Exemplo 2: Manchas Imagem 4comp_conex.ppm MAX: 30000 MIN: 1000 Componentes conexas: 4 - Componente 1: XXXXX pixels - Componente 2: YYYYY pixels - Componente 3: ZZZZZ pixels - Componente 4: WWWWW pixels Figura 7: Imagem original à esquerda e imagem gerada pelo programa à direita. 10
4.3 Exemplo 3: Imagem real Imagem paisagem.ppm MAX: 3000000 MIN: 50 Componentes conexas: 27878 - Componente 1: XXXXX pixels - Componente 2: YYYYY pixels... - Componente 27878: WWWWW pixels Figura 8: Imagem original acima e imagem gerada abaixo. 11
5 Relatório O trabalho entregue deve conter um pequeno relatório (não mais de 3 páginas) que descreva os principais detalhes de implementação e apresente alguns testes realizados com imagens de teste. Os testes devem apresentar a imagem de entrada, a saída do programa e a imagem gerada. 6 Entrega O trabalho deve ser entregue através do site da disciplina: http://http://alex.kutzke.com.br/courses/2 Na opção Atividades, encontre a atividade Trabalho 1 e preencha o formulário para a submissão do trabalho. Utilize a senha dada pelo professor durante a aula. Cada grupo pode realizar quantas submissões forem necessárias, pois apenas a mais recente será considerada. Qualquer dúvida entre em contato através do email: alexk@ct.dainf. utfpr.edu.br 12