Skip to content

heliomeiralins/pds

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

27 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

#Projeto PDS

Hélio de Meira Lins Neto

Ferramentas

Todo o projeto foi feito usando ferramentas opensource. Seguem as ferramentas usadas:

  • Python
  • Pillow
  • Numpy
  • Scypy
  • Matplotlib
  • Tesseract-ocr ( pytesseract)
  • Octave

##Parte 1

###Questão 1

Código: parte1/q1.py

Gráficos das letras a), b) e c). Todos feitos usando Numpy/Scipy.

plot_y

plot_z

plot_w

d)

A função z tem o dobro da frequência da função y. Assim, a transformada de fourier Z(f)=Y(f/2) e seus picos são em pontos com o dobro da frequência dos de y. A transformada da função w, obtida a partir da concatenação das anteriores, possui os picos de Z e de Y. Note que, graficamente, não é possível inferir quando as frequências estão ativas.

e)

As bibliotecas Numpy e Scipy não tem uma função pronta do espectograma. Para evitar implementá-la, usei o GNU Octave. Seguem os comandos:

pkg load signal
t = [0:0.01:9.99];
w = [sin(20*pi*t) + cos(30*pi*t), sin(40*pi*t) + cos(60 * pi * t)];
specgram(w, 256, 100, 500)

spec

Agora vemos as componentes de frequência pelo tempo, o que não era claro na transformada de fourier. Isso acontece pois o espectrograma faz transformadas de fourier em subintervalos.

Parte2

Questão 1

Código: parte2/q1.py

A maneira mais simples de resolver o problema dos Ringings é aplicando um filtro passa baixa. Apliquei um filtro gaussiano (do scipy) com sigma 1.5. Segue o resultado:

gaussian

A desvantagem do filtro gaussiano é que ele embaça bastante a foto. Provavelmente, pode-se obter um resultado melhor usando filtro sinc. fonte: https://en.wikipedia.org/wiki/Ringing_artifacts#Causes

Questão 2

Código: parte2/q2.py Parte mais relevante do código:

text = pytesseract.image_to_string(img)
without_spaces = re.sub('\s+', '', text)

print(len(without_spaces))

Não obtive muito sucesso com meus algoritmos, então apelei para o Tesseract, que é uma ferramenta para reconhecer textos em imagens. Bastou apenas remover os espaços e os \n ( usei expressões regulares). Número de caracteres: 211.

Minha implementação está no arquivo parte2/alternativeq2.py. Basicamente, eu aplico uma transformação na imagem para eliminar os ruídos da imagem e separo em regiões que são mais escuras que a média da imagem. Infelizmente, algumas letras estão muito próximas e são consideradas juntas. Da mesma maneira, temos problemas com ruídos e devemos filtrar as regiões que são muito pequenas.

Obtive um resultado de 199 para regiões com tamanho maior que 5 pixels, e 197 para regiões com mais de 10. Não é muito relevante, mas regiões maiores que 2 pixels dá 211! Mesma resposta do outro algoritmo.

Obtive resultados melhores trocando a condição de ser mais escuro que a média por valores fixos, mas deixei dessa maneira para funcionar com mais imagens.

Questão 3

Analisando as componentes RGB da imagem separadamente( e em tons de cinza), notei que o número fica evidente ao comparar as imagens das componentes R e G ( passando de uma para outra, como em um slideshow). Comparar a componente azul com qualquer uma das outras duas não deixou o número evidente para mim. Assim, decidi trocar as componentes vermelhas e verdes assim:

cb[:, :, 0] = 255 / 2 + (dalton[:, :, 0] - dalton[:, :, 1])
cb[:, :, 1] = 255 / 2 + (dalton[:, :, 1] - dalton[:, :, 0])

Resulta em:

color_blind

É meio difícil explicar a motivação de tal transformação, mas devo dizer que foram várias tentativas até chegar nesta, que deixa bem evidente a distinção. Também é possível obter resultados ainda melhores aumentado o fator que multiplica a diferença das componentes R e G, ou deixando o vermelho mais claro e o verde mais escuro. Exemplo:

cb[:, :, 0] = 3*255 / 4 + (dalton[:, :, 0] - dalton[:, :, 1])
cb[:, :, 1] = 255 / 4 + (dalton[:, :, 1] - dalton[:, :, 0])

Retirando a cor azul da jogada:

no_blue

Parte 3

Código: parte3/parte3.py

Na parte 3, tomei a solução mais simples possível. Simplesmente:

imsave('inter_102.bmp', img101 / 2 + img103 / 2)
imsave('inter_110.bmp', img109 / 2 + img111 / 2)
imsave('inter_118.bmp', img117 / 2 + img119 / 2)

Frames:

inter_102 inter_110 inter_118

Parte 4

Questão 1

Código: parte4/q1.py

Analisamos os sinais nos domínios do tempo e da frequência:

freq

time

Percebemos que há atrasos e perdas.

Questão 2

Código: parte4/q2.py

Taxa de Amostragem: 8kHz

freq

time

Primeiramente, removi o ruído zerando uma banda de frequência na transformada de fourier, e depois tirando a transformada inversa. Só pra checar mesmo.

Apliquei um Filtro Fir ( janela de kaiser, width=1/fs, ripple_db = 11). Os coeficientes foram divididos por 10000 para diminuir o ruído. O resultado foi bastante satisfatório. Brinquei com vários valores de filtros de Kaiser e obtive resultados satisfatórios. Não consegui obter bons resultados com filtros de Chebyshev.

About

Projeto de Processamento Digital de Sinais

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages