2016-08-14 166 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()