2012-09-14 60 views
1

我以類似的方式來運行的代碼繪製平鋪圖像如下圖所示:Matplotlib imshow與異常空白相鄰的圖像 - 有沒有辦法糾正它?

import Image 
import matplotlib.pyplot as plt 
import random 
import numpy 

def r(): 
    return random.randrange(50,200) 

imsize = 100 
rngsize = 5 

rng = range(rngsize) 
for i in rng: 
    for j in rng: 
     im = Image.new('RGB', (imsize, imsize), (r(),r(),r())) 
     plt.imshow(im, aspect='equal', extent=numpy.array([i, i+1, j, j+1])*imsize) 

plt.xlim(-5,imsize * rngsize + 5) 
plt.ylim(-5,imsize * rngsize + 5) 
plt.show() 

enter image description here

的問題是:在平移和縮放,zoomscale獨立的白色條紋圖像邊緣之間出現,這是非常不可取的。我想這與重採樣和抗鋸齒有關,但不知道如何以正確的方式解決它,特別是不知道matplotlib渲染引擎的確切實現細節。

使用開羅和HTML畫布,您可以繪製「像素角」或「像素中心」(平移0.5像素),從而避免消除鋸齒效應。 Matplotlib有沒有辦法做到這一點?

感謝您的幫助!

回答

3

您可以簡單地將值填入較大的numpy數組中,並將整個合成圖像繪製在一個鏡頭中。我已經將上面的代碼改編爲一個簡單的例子,但是對於不同大小的圖片,您需要採取不同的步長。

F = numpy.zeros((imsize*rngsize,imsize*rngsize,3)) 

for i in rng: 
    for j in rng: 
     F[i*imsize:(i+1)*imsize, 
      j*imsize:(j+1)*imsize, :] = (r(), r(), r()) 

plt.imshow(F, interpolation = 'nearest') 
plt.show() 

enter image description here

+0

這是個好主意,我可能能做到這一點跟我有良好的速度源圖像,我覺得(MPL無論如何都會去做,我猜)。但是,它仍然是我的一種解決方法。如果我沒有得到任何神奇的選擇,我會回來接受這個。非常感謝你! – heltonbiker

+0

@heltonbiker我承認它看起來像一個黑客,但最終你有更好的控制複合圖像,如果你想申請任何postfilters。另外,如果你想保存複合圖像,這正是我使用的方法(並且完全繞過PIL和matplotlib!) – Hooked

+0

實際上,我想直接使用matplotlib做一個平移圖「程序」作爲GUI。其中一個目標是在地圖平移時加載和卸載切片,並始終僅繪製所需的圖像。這可能比也可能不會輕於生成新圖像每次我釋放鼠標(這是我打算用來刷新要繪製的圖塊列表的事件)。很可能,使用你的答案會解決問題,所以我只會在接受之前等一會兒,以防萬一。 – heltonbiker

相關問題