2016-08-14 165 views
1

我正在實施一個分形火焰渲染器,用於踢腿和咯咯笑,並掛上了一個愚蠢的小顏色問題。運行該算法後,我得到了一個RGBA矩陣(HxWxC,特別是我有1080x1440x4),但是當我用pyplot渲染它時,得到的結果不同於我用scipy得到的結果。下面是輸出代碼:在scipy和pyplot中呈現RGB數據的不同呈現方式

condensed = prepare_image(condensed, **condensed_args) 
condensed[np.isnan(condensed)] = 0 
name += '.png' if not name.endswith('.png') else '' 
sc.misc.imsave("sc_" + name, condensed, format='png') 
plt.imsave("pl_" + name, condensed) 

而這裏的兩個輸出圖像:

SciPy的: Scipy's output image

Pyplot: Pyplot's output image

忽略的背景顏色(阿爾法有0,所以我可以手動處理),細節在顏色上完全不同:scipy產生平滑的cyan'ish顏色,而pyplot產生一個靜態的大雜燴ra ndom顏色。如果我用pyplot.imread重新加載scipy的圖像並顯示它,我會得到好的青色,所以必須有pyplot解釋我的原始RGBA矩陣的東西。我沒有設置任何我能看到的任何顏色地圖或索引。這兩個imsave函數的文檔似乎都表示它們的行爲方式相同(並且pyplot的imshow與imsave的行爲相同,應該是預期的)。

如果我不得不猜測,它看起來像pyplot將我的數據解釋爲HSL或其他一些色彩空間。 Scipy的一個更接近我期待的,算法應該產生什麼。

有人看到我在這裏做錯了嗎?幫助將不勝感激。

回答

0

當保存一個浮點數組時,scipy.misc.imsave()(它使用Pillow來完成實際工作)有效地將數組中的值縮放到區間[0,1]。另一方面,plt.imsave()顯示剪輯值爲間隔[0,1],而不改變[0,1]內的值。

如果在保存使用plt.imsave()圖像之前[1 0]與類似

condensed = (condensed - condensed.min())/condensed.ptp() 

變換condensed值到區間,應產生相同的圖像作爲scipy.misc.imsave()