Sobre algumas especificações do EP4

Sobre algumas especificações do EP4

por José David Fernández Curado -
Número de respostas: 18
Eu estava olhando o enunciado do Ep4 e fiquei em duvida sobre alguns detalhes:
1) O comentario não pode ser colocado na primeira linha, mas eu imagino que ele também não possa ser colocado dentro da matriz em ASCII( e obviamente não pode ser colocado dentro da binaria ) , certo?
2) É necessario tomar como modelo o arquivo esqueleto ou eu posso "soltar a imaginação"?
3) Depois do exemplo tem um trecho: "Os parâmetros 'semi-variação horizontal' e 'semi-variação vertical' definem respectivamente o número de colunas (q) e o número de colunas (p)". P determina linhas, certo?
4) Na hora de ler a matriz em ASCII, eu posso ler com "scanf("%d", &variavel)", ou é necessario ler como um vetor de char e  depois fazer uma função que converte uma sequencia de algarismos em um numero?
5) O que é sscanf?
6) Por que o vetor de chars key tem 128 posições?
7) Ao calcular a matriz com o filtro de mediana, eu devo então calcular o novo maxval, pois ele mudou, certo?
8) No Linux é possivel fazer com que o terminal receba o controle imediatamente após chamar um programa usando o '&', pode-se usar algo do tipo 'system("eog tmpfile.pgm &");' para poder receber imediatamente o controle?
Obs : & = e comercial ( o caracter que está aparecendo no meu computador não parece um e comercial ).
Em resposta à José David Fernández Curado

Re: Sobre algumas especificações do EP4

por Igor dos Santos Montagner -
Acho que só posso responder duas coisas (o resto é com o professor mesmo):

5) sscanf é como um scanf normal, mas em vez de olhar o que foi digitado, ou como no caso do fscanf, o conteúdo de um arquivo, o sscanf usa uma string.
Se você der um sscanf(string,  "%d", &v) ele vai procurar um inteiro no meio dessa string (ou pelo menos seria pra fazer isso, usei esse comando muito pouco). Aqui está um exemplo : http://www.cplusplus.com/reference/clibrary/cstdio/sscanf.html
Referencia da biblioteca stdio.h -> tem todas as funções com exemplo. Em inglês

7) Sim, depois de fazer esse filtro você deve ficar com todos os parâmetros da imagem modificados, para quando salvar a imagem ela ter todos os parâmetros corretos. No caso do pgm são maxval, p (colunas) e q(linhas) (isso se o p e o q forem mesmo colunas e linhas)(não estou com o enunciado do EP aqui) . Se não esses parâmetros não forem modificados o próximo filtro será aplicado de forma errada.


Em resposta à José David Fernández Curado

Re: Sobre algumas especificações do EP4

por Francisco Reverbel -
1) Comentários seguramente não podem aparecer dentro da matriz binária. Como eu não sabia ao certo se eles podem aparecer dentro da matriz em ASCII, fui olhar a definição do formato PGM e continuei na dúvida...  Acho que comentários não podem aparecer dentro da matriz em ASCII, mas a definição do formato PGM não diz isso explicitamente. Para efeito do nosso EP, vocês podem supor que comentários nunca aparecerão dentro da matriz em ASCII. (Uma dica para vocês lidarem com comentários: olhem a função ungetc, definida em <stdio.h>. Com essa função fica muito fácil lidar com comentários em qualquer lugar, até mesmo dentro da matriz em ASCII.)

2) Pode "soltar a imaginação" sim.

3) Sim, p determina linhas. Vou corrigir o enunciado. (Já vi que também há um erro no arquivo esqueleto.c: em vez de "while (option != 0)", deveria ser "while (option != 9)". Corrigirei isso também. Quem achar outros erros, avise por favor!)

4) Sim, pode ler com scanf("%d", &variavel).

5)  É o que o Igor explicou. (Ótimo link, Igor. Esse eu não conhecia. Vou colocar na página da disciplina, sob "Recursos Adicionais na Internet".)

6) Porque eu escrevi aquele código às pressas e não pensei muito nisso... Essa parte ficou ruim, pois o fscanf(entrada, "%s", key) vai querer ler uma seqüência de caracteres delimitada pelo pŕoximo branco (whitespace: espaço, newline, tab, ...) e guardar essa seqüência em key. Se o branco demorar para aparecer e a seqüência tiver mais que 127 caracteres, o fscanf(entrada, "%s", key) colocará os caracteres "excedentes" nas posições de memória que vem depois do vetor key. Ou seja, vai dar pau. O certo é fazer o que eu fiz para ler o nome do arquivo de entrada (chamar fgets e depois sscanf) ou então ler os elementos de key caractere a caractere.

7) Sim, como o Igor já explicou.

8) Chamar
system("eog tmpfile.pgm &") resolve só
uma parte do problema. O controle volta imediatamente para o seu programa, mas aí o programa não tem como fechar a janela do visualizador. Cada ativação do visualizador abre uma nova janela e o usuário tem que ficar fechando as janelas que vão sendo abertas. Caso ele não feche essas janelas, elas permanecerão abertas mesmo depois que a execução do seu programa terminar.

Em resposta à Francisco Reverbel

Re: Sobre algumas especificações do EP4

por Henrique Stagni -
QUANTO A QUESTAO 7:

Devemos mesmo mudar o maxval???? O maxval é o valor máximo que os elementos da matriz PODEM assumir, pois o maxval(pelo q testei aqui) é a referência para a cor branca, certo? O maxval indica a sua range máxima de cores que vai de 0(preto) ateh maxval(branco)

Imagine uma imagem que deva ser escura e que não tenha nenhum ponto brancos. Todos os pontos da matriz serão MENORES que maxval, pois nenhum deles é branco. Se você aplica o filtro a essa imagem e muda o maxval, você estará forçando a ocorrência de pontos brancos nela, o que descaracterizaria a imagem....

Então, queria saber se essa mudança deve ser mesmo feita, mesmo que nos exemplos que testei aqui, ela tenha forçado o aparecimento da cor branca em imagens originalmente escuras.

Aqui tem um link dobre o pgm:
http://netpbm.sourceforge.net/doc/pgm.html

"Each gray value is a number proportional to the intensity of the pixel, adjusted by the ITU-R Recommendation BT.709 gamma transfer function. (That transfer function specifies a gamma number of 2.2 and has a linear section for small intensities). A value of zero is therefore black. A value of Maxval represents CIE D65 white and the most intense value in the image and any other image to which the image might be compared."
Em resposta à Henrique Stagni

Re: Sobre algumas especificações do EP4

por Francisco Reverbel -
Depois de ler com mais cuidado a especificação do formato PGM tenho que concordar com você, Henrique. O maxval é o valor que será considerado como "branco". Esse valor não precisa necessáriamente aparecer na matriz. Ao contrário do que diz o enunciado, o maxval não é necessariamente o valor do maior elemento da matriz. Ele deve ser maior que qualquer elemento da matriz, mas pode não aparecer nela.

O programa de vocês não deve recalcular o maxval. Mesmo que o valor do maior elemento da matriz diminua com a aplicação do filtro da mediana, o maxval após a transformação deve permanecer inalterado.

A razão para não mexer no maxval fica mais clara se pensarmos numa operação que não foi pedida no EP4, mas é muito útil: a que gera uma imagem com uma parte selecionada de uma imagem dada. Imaginemos que a imagem original tem um lado mais claro e um lado mais escuro. Se, a partir dessa imagem, gerarmos outras duas, uma delas contendo apenas o lado mais claro e a outra contendo só o lado mais escuro, muito provavelmente o valor do maior elemento da segunda imagem será menor que o valor do maior elemento da imagem original. Não queremos ajustar o maxval da imagem com o lado escuro, pois isso teria o efeito de clarear uma imagem que deve ser mais escura.

Consultei um colega que trabalha com processamento de imagens. Segundo ele, na maioria das situações práticas maxval é 255 (imagens em 8 bits) ou 65535 (imagens em 16 bits).

Em resposta à Francisco Reverbel

Re: Sobre algumas especificações do EP4

por Fernando Signorelli -

O EP4 tem q ler arquivo  binario?

Se tiver onde eu poderia arranjar uma imagem pra testar?

Obrigado

 

Em resposta à Fernando Signorelli

Re: Sobre algumas especificações do EP4

por Caio Braz -
Eu acho que tem que ler sim, pelo menos eu estou fazendo o meu ler binario sim.
Aqui esta, uma imagem binária.
Eu fiz ela pegando a kid.pgm e salvando ela no meu proprio EP como binária.
Em resposta à Fernando Signorelli

Re: Sobre algumas especificações do EP4

por Francisco Reverbel -
Sim, o EP4 deve ler (e também gerar) arquivos PGM binários.

No Linux você pode usar o programa gimp para abrir qualquer imagem e salvá-la num arquivo PGM binário. Na hora de salvar o PGM, você terá de escolhar entre "Raw" e "ASCII" para "Data formatting". Escolha "Raw" para gerar um arquivo PGM binário.
Em resposta à Francisco Reverbel

Re: Sobre algumas especificações do EP4

por Luciano Ramalho -
Sobre os comentários, a especificação do formato PGM [1] realmente não deixa explícito onde eles podem ocorrer, mas ela faz referência à especificação do PBM:

"13. Strings starting with "#" may be comments, the same as with PBM."

[1] http://netpbm.sourceforge.net/doc/pgm.html

Na especificação do PBM [2] é explícito que os comentários só podem ocorrer no cabeçalho:

"8. Before the whitespace character that delimits the raster, any characters from a "#" through the next carriage return or newline character, is a comment and is ignored. [...]"

Este parágrafo continua com a observação de que, se o comentário ocorrer na última linha do cabeçalho, são necessários dois LF logo após o texto do comentário: o primeiro marca o fim do comentário, e o segundo marca o início do raster, ou seja, dos bytes da imagem.

[2] http://netpbm.sourceforge.net/doc/pbm.html

[ ]s
Luciano
Em resposta à Luciano Ramalho

Re: Sobre algumas especificações do EP4

por Igor dos Santos Montagner -
tenho a impressão de que o comentário na última linha do cabeçalho só é possível no formato pbm, pois nos testes que fiz com comentários após o maxval a imagem era "estragada" por esse comentário.
Se você conseguir uma imagem assim seria legal colocar no fórum para a gente poder testar com ela.
Em resposta à Igor dos Santos Montagner

Re: Sobre algumas especificações do EP4

por Luciano Ramalho -
Igor, peguei aquela imagem comments.pgm (a rapariga oriental) cujo link está na página que você mandou outro dia. Salvei como ASCII e editei manualmente o cabeçalho para acrescentar um comentário depois do maxval, na mesma linha. Está aqui:

http://ramalho.org/usp/mac0110/imagens/com3a.pgm

Por via das dúvidas, fiz outra versão da imagem, com uma quebra de linha extra após o último comentário (ou seja, uma linha em branco entre a linha que contém o maxval+comentário e o início da matriz da imagem):

http://ramalho.org/usp/mac0110/imagens/com3b.pgm

As três imagens abriram normalmente no Eog, no GIMP e na versão final da minha implementação do EP4.

Boa sorte!

[ ]s
Luciano
Em resposta à Luciano Ramalho

Re: Sobre algumas especificações do EP4

por Igor dos Santos Montagner -
Acho que confundi as coisas.... Não tinha entendido que você estava falando de uma imagem ASCII. Nesse tipo de imagem funciona mesmo, estou testando meu ep com elas agora (e funcionou). A imagem fica estragada quando está em binário e tem um comentário depois do maxval, na mesma linha ou na próxima com duas quebras de linha.
Desculpa
Em resposta à Igor dos Santos Montagner

Re: Sobre algumas especificações do EP4

por Luciano Ramalho -
Eu fiz aquele teste dos comentários com imagens ASCII porque é mais fácil editá-las manualmente que uma imagem binária. Na verdade não faz diferença se a imagem é ASCII ou binária na hora de ignorar os comentários, porque nos dois casos o formato do cabeçalho é exatamente idêntico e a única diferença é o prefixo P2 ou P5. Apenas na hora de ler a matriz de pontos (raster), é que o programa passa a funcionar diferente.
Em resposta à Luciano Ramalho

Re: Sobre algumas especificações do EP4

por Igor dos Santos Montagner -
mas no caso dos comentários muda um pouco. Você já experimentou colocar comentários após o maxval em uma imagem binária? Comigo a imagem fica deslocada para o lado, estragando ela. Mesmo com os comentários na mesma linha (não estou no linux agora, mas testei faz pouco tempo e deu isso) a imagem fica estragada. Já na imagem texto funciona normalmente
Em resposta à José David Fernández Curado

Re: Sobre algumas especificações do EP4

por Fillipe Resina -
Eu tenho uma dúvida quanto ao cálculo da matriz Med...

Que algumas coordenadas, como (0,0), não tenham vizinhança bem-definida e recebam 0 está ok...
Mas vamos supor que p = q = 5
Na matriz exemplo da seção 1 do enunciado do EP, a única coordenada para a qual seria possível o cálculo da mediana seria a (3,3), enquanto as coordenadas restantes receberiam 0, é isso mesmo??? pq para as outras coordenadas, nesse caso, há "pontos fora da matriz", assim como no caso (0,0).

Obrigado!!
Em resposta à Fillipe Resina

Re: Sobre algumas especificações do EP4

por Francisco Reverbel -
Você quer dizer que a única coordenada para a qual se pode calcular a mediana seria a (2,2), certo? (Lembre-se que nossos índices começam de zero!)

É isso mesmo. O problema é que essa matriz é muito pequena. Imagens geralmente têm matrizes bem maiores.

 
Em resposta à Francisco Reverbel

Re: Sobre algumas especificações do EP4

por José David Fernández Curado -
Falando nisso, qual deve ser o tamanho da matriz, algo em torno de 1000 por 1000 será o suficiente? porque se não passar disso não é necessario usar muito de matrizes static...
Em resposta à José David Fernández Curado

Re: Sobre algumas especificações do EP4

por Luciano Ramalho -
Como os esqueletos usam:

#define MAX_DIM      512

Eu assumi que esta é a dimensão máxima que o EP4 deve tratar. Por sinal, todos os exemplos de PGM que o professor forneceu e aqueles que o Igor encontrou cabem dentro da matriz de 512x512.

No meu EP não foi necessário usar matrizes estáticas. Resolvi todas as transformações geométricas operando diretamente na matriz a, sem precisar criar uma matriz b temporária.

Somente no filtro da mediana eu usei duas matrizes auxiliares: aquela matriz b para salvar o resultado do processamento e um vetor para ordenar as vizinhanças e achar a mediana. Testei com semi-variacões de até 30x30; inicialmente o vetor estava pequeno e eu tive uns segmentation faults; depois aumentei bem o vetor e deu para testar até 30x30. Demora vários minutos em uma máquina razoavelmente rápida o filtro de 30x30 sobre a imagem do cameraman.

[ ]s
Luciano