-
Notifications
You must be signed in to change notification settings - Fork 0
/
main.py
executable file
·125 lines (111 loc) · 4.19 KB
/
main.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
#! /usr/bin/python
# -*- coding: iso-8859-1 -*-
# Script para cálculo do erro quadrático médio
# embutido no cálculo computacional de
# descritores de curvatura de imagens
# Recebe como parâmetro de entrada
# o diretório raiz da onde se encontra o banco de imagens
# e os valores analíticos de referência para comparação do cálculo
import sys
import os
import shutil
import tempfile
from os.path import *
from re import *
from numpy import *
from scipy.interpolate import interp1d
from curvature import curvature
# Esta função é chamada pelo método os.path.walk()
# Coloca em três listas (arg[0], arg[1] e arg[2])
# os nomes dos arquivos das figuras que calcularemos a curvatura
# , os respetivos dados para curvaturas analíticas e o nome para
# o arquivo de armazenamento das saídas.
# Qualdo o método os.path.walk() executa, este se encarrega de visitar
# cada diretório abaixo da raíz fornecida chamando esta função.
# Antes de chamar visit() os.path.walk() passa como parâmetro, em d,
# o nome do diretório visitado e em fl uma lista de arquivos
# contidos neste mesmo diretório
def visit(arg,d,fl):
for f in fl:
aux = join(d,f)
if isfile(aux):
r = compile("K_ana.dat")
if r.search(aux):
# arquivo .dat (curvatura analítica)
arg[0].append(aux)
else:
r = compile("bmp$")
if r.search(aux):
# arquivo .bmp (imagem para calculo da curvatura)
arg[1].append(aux)
# nome do arquivo .dat para saída
aux = r.sub("dat",aux)
r = compile(d)
aux = r.sub("./"+OUTPUTDIR,aux)
arg[2].append(aux)
# Esta funcao auxiliar calcula o erro RMS entre dois vetores
# de mesmo tamanho
def rms_err(a,b):
e = diff(array([a,b]),axis = 0)
n = float(e.size)
e_rms = sqrt(sum(square(e))/n)
e_mean = mean(e)
e_stdv = std(e)
return(e_rms,e_mean,e_stdv)
#######################################
# #
# Programa Principal #
# #
#######################################
OUTPUTDIR = "saida"
# s : Faixa de valores e número de pontos para o
# desvio padrão do filtro passa baixas Gaussiano.
# Este fator determina a frequência de corte deste
# filtro, que é aplicado antes de se calcular a curvatura.
# Quanto mais pontos mais curvaturas serão calculadas por imagem
sigma_range = logspace(0,1.2,40.,endpoint = True)
# s é apenas um apelido para sigma_range
s = sigma_range
# lista para armazenamento do nome dos arquivos
# de entrada e saída
# lista_de_arquivos[0] -> Lista dos nomes dos arquivos de imagens de entrada
# lista_de_arquvos[1] -> Lista dos nomes dos arquivos de curvaturas analíticas correspondentes na forma de vetor coluna.
# lista_de_arquivos[2] -> Lista dos nomes Arquivos de saída para armazenamento do erro calculado
lista_de_arquivos = [[],[],[]]
# Obtém listas dos nomes dos arquivos a partir da
# raiz fornecida ao script
if sys.argv[1]:
walk(sys.argv[1],visit,lista_de_arquivos)
else: os.exit(-1)
# Loop externo para cada imagem
# Computa curvatura e calcula o erro quadrático médio
# em relacao a resposta analitica
for ana_str,im_str,fout_str in zip(lista_de_arquivos[0],lista_de_arquivos[1],lista_de_arquivos[2]):
print im_str
# Leitura dos dados para Vetor com reposta analítica
ana = fromfile(ana_str,sep="\n")
# arquivo de saída
fout = open(fout_str,"w")
# Instancializa objeto para calculo de curvaturas
c = curvature(im_str,s)
# curvs -> Curvograma k(sigma,t)
#curvs = ndarray((s.size,c.t.size),dtype="float")
# Erro quadrático médio do calculo da curvatura
# da forma sob análise para cada valor de sigma
#err = ndarray((s.size),dtype="double")
# Parâmetro t para interpolação da função curvatura
# para reamostragem com o mesmo número de pontos que
# a resposta analítica
tf = linspace(0,1,ana.size)
# Interage para cada valor de sigma
print >> fout,"sigma\terr_rms\tmean\t"
for i in arange(s.size):
# obtém curvaturas para o curvograma
#curvs[i] = c(i,c.t)
# obtém o erro quadrático médio entre curvatura analítica
# e a reamostrada
e,mi,sd = rms_err(ana,c(i,tf))
#err[i] = e
#print "sigma = {0}, err_rms = {1}, mean = {2}, std = {3}".format(s[i],e,mi)
print >> fout,"{0}\t{1}\t{2}".format(s[i],e,mi)
fout.close()