Post

Serialização de dados em ponto flutuante via FileStorage 📂

Programa que gere uma imagem de dimensões 256x256 pixels contendo uma senóide de 4 períodos com amplitude igual 127 desenhada na horizontal. A imagem é gravada formato YML e também exportada no formato PNG. Comparando os arquivos gerados, extraindo uma linha correspondente de cada imagem gravada e comparando a diferença entre elas é traçado um gráfico da diferença calculada ao longo da linha correspondente extraída nas imagens.

Uma função senoidal pode ser definida pela equação:

\[y(t) = A \cdot \sin(2\pi f t + \phi) + B\]

Onde:

  • $ A $ é a amplitude da senoide.
  • $ f $ é a frequência da senoide (número de ciclos por unidade de tempo).
  • $ t $ é a variável independente (tempo).
  • $ \phi $ é a fase da senoide.
  • $ B $ é um deslocamento vertical (offset).

No caso deste exercício, a amplitude $ A $ é definida como 127, a frequência $ f $ determina o número de períodos da senoide (4 períodos horizontais), $ t $ é a coordenada horizontal dos pixels na imagem, e $ B $ é 128 para garantir que os valores dos pixels estejam no intervalo de 0 a 255.

Assim, foi criada a função generateSinusoidalImageque gera uma imagem senoidal com as dimensões especificadas (256x256 pixels) e um número de períodos dado. A amplitude da senoide é definida como 127, e a função senoidal é gerada para cada ponto na imagem usando a equação da senoide. A imagem é salva tanto em formato YAML quanto PNG. Usando a calculateLineDifference calculamos a diferença entre dois conjuntos de valores de linha. Os valores de cada linha são comparados ponto a ponto, e a diferença absoluta é calculada e a diferença entre as duas linhas é retornada como um array de floats.

Para verificar o código correspondente, acesse: Github.com/ErnaneJ/pdi/filestorage

Aqui estão os exemplos dos arquivos YAML gerados para as imagens senoidais com 8 e 4 períodos:

1
2
3
4
5
6
7
8
9
10
11
# sinusoidal-256-4.yml
# %YAML:1.0
# ---
mat: !!opencv-matrix
   rows: 256
   cols: 256
   dt: f
   data: [ 128., 1.34231598e+02, 1.40448181e+02, 1.46634766e+02,
       1.52776474e+02, 1.58858490e+02, 1.64866150e+02, 1.70785019e+02,
       1.76600800e+02, 1.82299500e+02, 1.87867386e+02, 1.93291046e+02,
       # ...
1
2
3
4
5
6
7
8
9
10
11
# sinusoidal-256-8.yml
# %YAML:1.0
# ---
mat: !!opencv-matrix
   rows: 256
   cols: 256
   dt: f
   data: [ 128., 1.40448181e+02, 1.52776474e+02, 1.64866150e+02,
       1.76600800e+02, 1.87867386e+02, 1.98557419e+02, 2.08567947e+02,
       2.17802567e+02, 2.26172333e+02, 2.33596634e+02, 2.40003998e+02,
       # ...

Ao executar o programa e analisar os gráficos gerados, podemos observar que a diferença entre as duas imagens senoidais é maior nos pontos onde as curvas se afastam uma da outra, ou seja, nos pontos de máximo e mínimo das senoides.

Senoide 4 períodos 256x256Senoide 8 períodos 256x256
sinusoidal-256-4Referente à sinusoidal-256-4.ymlsinusoidal-256-8Referente à sinusoidal-256-8.yml

Essa discrepância é percebida principalmente onde os picos correspondem aos pontos onde as senoides têm valores mais distintos. Portanto, a diferença entre as imagens é diretamente influenciada pelo número de períodos das senoides geradas e isso é notório quando observamos a representação em YML com os valores em ponto flutuante.

Esta postagem está licenciada sob CC BY 4.0 pelo autor.