2012-07-23 59 views
1

我有一個128x128的高程數據陣列(使用9種顏色顯示從-400m到8000m的高程),我需要將其大小調整爲512x512。我用雙三次插值做了它,但結果看起來很奇怪。在圖片中,您可以看到原始的,最近的和雙立方的。注意:只有高程數據被內插,而不是顏色本身(色域被保留)。這些僞影是否出現在我的不良插值代碼的雙三次圖像結果上,或者是由離散(9步)數據的插值引起的?爲什麼我的離散數據的雙三次插值看起來很醜?

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

+0

你用什麼軟件來做雙三次插值? – 2012-07-23 17:46:06

+0

我正在使用這個人的圖書館:[鏈接](http://www.ee.ucl.ac.uk/~mflanaga/java/BiCubicSpline.html)
和這個人的代碼片段:[鏈接](http:///www.paulinternet.nl/?page=bicubic)
但都產生相同的結果,所以eiter我錯誤地實現它們或雙三次插值不適合這種情況。無論如何,有第三個我會嘗試:[鏈接](http://mrl.nyu.edu/~perlin/java/Bicubic.html) – 2012-07-23 20:38:01

回答

2

您使用的雙語代碼必須有問題。這裏是我的結果與Python:

Bicubic resize

外繞黑色邊框是它的結果是調色板之外,由於振鈴。

下面是產生上述的程序:

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') 

編輯:顯然Python的雙立方是不是最好的。以下是我能夠在Paint Shop Pro中手動完成的工作,使用與上述大致相同的步驟。

Bicubic in Paint Shop Pro

+0

這看起來完全如我所願。所以雙三合是沒問題的。現在我知道問題出在哪裏,可以繼續前進。謝謝! – 2012-07-24 11:39:21

0

雖然雙三次插值有時會生成原始範圍外插的值(你能驗證,如果發生這種情況給你?)這真的好像你可能有一個bug,但很難不說看代碼。作爲一般規則,雙三次方解決方案應該比最近鄰解決方案更平滑。

編輯:我回過頭來看,在圖像中我看不到在原始範圍之外插值。儘管如此,我認爲奇怪的部分是使用雙三次方法時出現的「鋸齒狀」,您可能需要仔細檢查一下。

+1

這也是我的第一個想法,但我不認爲這是這裏的情況是由樣本來判斷的。 – 2012-07-23 17:51:49

+0

是的...不是的。不過,鋸齒很奇怪。 – carlosdc 2012-07-23 18:05:31

+0

大海的海拔高度值爲-9999,與零高度的土地不同,所以灰點(海底水平)是可以的。是的,鋸齒是問題。我會對顏色進行雙三次檢查來檢查例程。我可以發佈代碼,但不想打擾你。 – 2012-07-23 21:00:28

相關問題