2012-06-05 2 views
0

Je suis en train d'exécuter ce code pour un projet étudiant:Wavelet Transform en Python -> IndexError: index d'affectation de liste hors de portée

The authors blog with complete Python-code

Seulement cette fonction:

def fwt97(s, width, height): 
''' Forward Cohen-Daubechies-Feauveau 9 tap/7 tap wavelet transform 
performed on all columns of the 2D n*n matrix signal s via lifting. 
The returned result is s, the modified input matrix. 
The highpass and lowpass results are stored on the left half and right 
half of s respectively, after the matrix is transposed. ''' 

# 9/7 Coefficients: 
a1 = -1.586134342 
a2 = -0.05298011854 
a3 = 0.8829110762 
a4 = 0.4435068522 

# Scale coeff: 
k1 = 0.81289306611596146 # 1/1.230174104914 
k2 = 0.61508705245700002 # 1.230174104914/2 
# Another k used by P. Getreuer is 1.1496043988602418 

for col in range(width): # Do the 1D transform on all cols: 
    ''' Core 1D lifting process in this loop. ''' 
    ''' Lifting is done on the cols. ''' 

    # Predict 1. y1 
    for row in range(1, height-1, 2): 
     s[row][col] += a1 * (s[row-1][col] + s[row+1][col]) 
    s[height-1][col] += 2 * a1 * s[height-2][col] # Symmetric extension 

    # Update 1. y0 
    for row in range(2, height, 2): 
     s[row][col] += a2 * (s[row-1][col] + s[row+1][col]) 
    s[0][col] += 2 * a2 * s[1][col] # Symmetric extension 

    # Predict 2. 
    for row in range(1, height-1, 2): 
     s[row][col] += a3 * (s[row-1][col] + s[row+1][col]) 
    s[height-1][col] += 2 * a3 * s[height-2][col] 

    # Update 2. 
    for row in range(2, height, 2): 
     s[row][col] += a4 * (s[row-1][col] + s[row+1][col]) 
    s[0][col] += 2 * a4 * s[1][col] 

# de-interleave 
temp_bank = [[0]*width for i in range(height)] 
for row in range(height): 
    for col in range(width): 
     # k1 and k2 scale the vals 
     # simultaneously transpose the matrix when deinterleaving 
     if row % 2 == 0: # even 
      temp_bank[col][row/2] = k1 * s[row][col] 
     else:   # odd 
      temp_bank[col][row/2 + height/2] = k2 * s[row][col] 

# write temp_bank to s: 
for row in range(width): 
    for col in range(height): 
     s[row][col] = temp_bank[row][col] 

return s 

Selon pour l'auteur, le code doit s'exécuter, mais je reçois cette erreur:

Traceback (most recent call last): 
File “wavelet_02.py”, line 200, in 
m = fwt97_2d(m, 3) 
File “wavelet_02.py”, line 27, in fwt97_2d 
m = fwt97(m, w, h) # cols 
File “wavelet_02.py”, line 108, in fwt97 
temp_bank[col][row/2 + height/2] = k2 * s[row][col] 
IndexError: list assignment index out of range 

Testé sur: Windows 7/ Mac OS 10.7.3
Python 2.7.3
PIL 1.1.7

Toute aide serait génial!

Cheers, Tobi

+0

L'erreur indique fondamentalement 'row/2 + height/2'>' height'. Pourrait être un point de départ ... – ChristopheD

Répondre

1

(1) vous que vous utilisez python 2, parce que dans la division python 3 changé (pour ne pas rond int lors de la division ints) d'une manière qui causerait cette erreur? (Hmm, bien que l'erreur exacte rapporté est différent, donc je suppose que ce n'est pas)

(2) malgré l'utilisation width et height des variables les commentaires en haut du code indique qu'il est pour matrices carrées que ("n * n "). Avez-vous height = width? il est clair que le code ne fonctionnera pas autrement parce que la transposition est assignée à la matrice originale.

pour moi, ce qui suit fonctionne très bien en python 2.7:

print(fwt97([[1,2],[3,4]], 2, 2)) 

tout

print(fwt97([[1,2],[3,4]], 2, 1)) 

donne votre erreur, comme prévu.

En fait, le code en général est bizarre. On dirait qu'il a été écrit par un programmeur fortran ou c, parce que vous n'avez pas du tout besoin de passer dans les dimensions. il serait préférable d'avoir:

def fwt97(s): 
    height = len(s) 
    width = height 
    for row in s: 
     assert len(row) == width, "not square" 
    ... 
+0

Merci pour votre réponse! Je stocke une image à l'intérieur de la matrice. Donc, maintenant j'ai découvert que mon erreur est causée par une image non-carré. Vous pouvez trouver le code entier sur cette page [Le blog des auteurs avec le code Python complet] (http://www.olhovsky.com/2009/03/2d-cdf-97-wavelet-transform-in-python/) comme je dois modifier l'ensemble du code .. soupir .. – digitobe

+0

le plus sera probablement mener à bien. mais lorsque vous calculez la transposition, n'essayez pas de coller chaque élément sur place dans la matrice originale; générer une nouvelle matrice (avec une forme différente). bonne chance ... –

+0

Acclamations Andrew, je vais creuser dedans la semaine prochaine !! Jusqu'à présent, j'aime la bibliothèque PIL. -Tobi – digitobe

Questions connexes