【问题标题】:Different renders of RGB data in scipy vs pyplotscipy vs pyplot中RGB数据的不同渲染
【发布时间】:2016-12-20 16:31:12
【问题描述】:

我正在实现一个分形火焰渲染器,用于踢球和咯咯笑,但被一个愚蠢的小颜色问题所困扰。运行算法后,我得到一个 RGBA 矩阵(HxWxC,特别是我有 1080x1440x4),但是使用 pyplot 渲染它时得到的结果与使用 scipy 渲染时得到的结果不同。这是输出代码:

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:

Pyplot:

忽略背景颜色(alpha 为 0,所以我可以手动处理),颜色的细节完全不同:scipy 产生平滑的青色,而 pyplot 产生随机的静态大杂烩颜色。如果我用 pyplot.imread 重新加载 scipy 的图像并显示它,我会得到漂亮的青色,所以 pyplot 如何解释我的原始 RGBA 矩阵一定有一些东西。我没有在我能看到的任何其他地方设置任何颜色图或索引。两个 imsave 函数的文档似乎都说它们的行为方式相同(并且 pyplot 的 imshow 行为与其 imsave 相同,正如预期的那样)。

如果我不得不猜测,看起来 pyplot 将我的数据解释为 HSL 或其他颜色空间。 Scipy 更接近我的预期,以及算法应该产生的结果。

有人看到我在这里做错了吗?非常感谢您的帮助。

【问题讨论】:

    标签: python numpy matplotlib colors scipy


    【解决方案1】:

    保存浮点数组时,scipy.misc.imsave()(它使用 Pillow 完成实际工作)有效地将数组中的值缩放到区间 [0, 1]。另一方面,plt.imsave() 似乎将值剪辑到区间 [0, 1],而不更改 [0, 1] 内的值。

    如果您将 condensed 中的值转换为区间 [0, 1] 类似

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

    在使用plt.imsave() 保存图像之前,它应该生成与scipy.misc.imsave() 相同的图像。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-19
      • 1970-01-01
      • 1970-01-01
      • 2011-06-18
      • 2014-07-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多