2012-07-23 4 views
1

J'ai un tableau 128x128 de données d'altitude (les élévations de -400m à 8000m sont affichées en utilisant 9 couleurs) et j'ai besoin de le redimensionner à 512x512. Je l'ai fait avec une interpolation bicubique, mais le résultat semble bizarre. Dans l'image, vous pouvez voir original, le plus proche et bicubique. Remarque: seules les données d'altitude sont interpolées et non les couleurs elles-mêmes (la gamme est conservée). Ces artefacts sont-ils visibles sur le résultat de l'image bicubique de mon mauvais code d'interpolation ou sont-ils causés par l'interpolation de données discrètes (9 étapes)?Pourquoi mon interpolation bicubique de données discrètes est laide?

http://i.stack.imgur.com/Qx2cl.png

+0

Quel logiciel utilisez-vous pour effectuer l'interpolation bicubique? –

+0

J'utilise la bibliothèque de ce type: [link] (http://www.ee.ucl.ac.uk/~mflanaga/java/BiCubicSpline.html)
et l'extrait de code de ce type: [link] (http://www.paulinternet.nl/?page=bicubic)
mais les deux produisent le même résultat, donc je les implémente à tort ou l'interpolation bicubique n'est pas adaptée à ce cas. En tout cas il y en a un que je vais essayer: [link] (http://mrl.nyu.edu/~perlin/java/Bicubic.html) –

Répondre

2

Il doit y avoir un problème avec le code bicubique que vous utilisez. Voici mon résultat avec Python:

Bicubic resize

La bordure noire autour de l'extérieur est l'endroit où le résultat est hors de la palette en raison de la sonnerie.

Voici le programme qui a produit ci-dessus:

from PIL import Image 
im = Image.open(r'c:\temp\temp.png') 

# convert the image to a grayscale with 8 values from 10 to 17 
levels=((0,0,255),(1,255,0),(255,255,0),(255,0,0),(255,175,175),(255,0,255),(1,255,255),(255,255,255)) 
img = Image.new('L', im.size) 
iml = im.load() 
imgl = img.load() 
colormap = {} 
for i, color in enumerate(levels): 
    colormap[color] = 10 + i 
width, height = im.size 
for y in range(height): 
    for x in range(width): 
     imgl[x,y] = colormap[iml[x,y]] 

# resize using Bicubic and restore the original palette 
im4x = img.resize((4*width, 4*height), Image.BICUBIC) 
palette = [] 
for i in range(256): 
    if 10 <= i < 10+len(levels): 
     palette.extend(levels[i-10]) 
    else: 
     palette.extend((i, i, i)) 
im4x.putpalette(palette) 
im4x.save(r'c:\temp\temp3.png') 

Edit: Bicubic de De toute évidence Python est pas le meilleur non plus. Voici ce que j'ai pu faire à la main dans Paint Shop Pro, en utilisant à peu près la même procédure que ci-dessus.

Bicubic in Paint Shop Pro

+0

Cela ressemble exactement à ce que je souhaite. Donc le bicubique va bien. Maintenant, je sais où le problème est et peut aller de l'avant. Merci! –

0

Bien que l'interpolation bicubique peut parfois générer interpoler des valeurs en dehors de la gamme originale (pouvez-vous vérifier si cela vous arrive?) Il semble vraiment que vous pouvez avoir un bug, mais il est difficile de dire sans regarder le code. En règle générale, la solution bicubique doit être plus lisse que la solution du plus proche voisin.

Editer: Je prends cela en arrière, je ne vois pas de valeurs d'interpolation en dehors de la plage d'origine dans vos images. Pourtant, je pense que la partie étrange est la "difficulté" que vous obtenez lorsque vous utilisez bicubique, vous pouvez vouloir vérifier cela.

+1

C'était aussi ma première pensée, mais je ne pense pas que ce soit le cas ici en juger par l'échantillon. –

+0

Ouais ... Ce n'est pas ça. La difficulté est étrange, cependant. – carlosdc

+0

La mer a une valeur d'élévation de -9999 pour la différencier de la terre à une hauteur nulle, donc les points gris (niveau sous-marin) sont corrects. Oui, la difficulté est le problème. Je ferai bicubique sur les couleurs pour vérifier les routines. Et je pourrais poster le code mais je ne veux pas te déranger avec ça. –

Questions connexes