Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python matplotlib-从rgba转换回整数_Python_Numpy_Matplotlib_Scipy - Fatal编程技术网

Python matplotlib-从rgba转换回整数

Python matplotlib-从rgba转换回整数,python,numpy,matplotlib,scipy,Python,Numpy,Matplotlib,Scipy,我有一个12位摄像机,它以数组的形式拍摄图像(值是整数)。当我通过matplotlib将数组保存为.png,然后将其读回时,值以RGBA格式显示(如预期)。通过读取.png,我需要能够将其转换回原始整数值 import matplotlib.pyplot as plt import numpy as np from scipy.stats import norm # simulate some data x = np.arange(0,100.1,1) y1 = norm.pdf(x, l

我有一个12位摄像机,它以数组的形式拍摄图像(值是整数)。当我通过matplotlib将数组保存为.png,然后将其读回时,值以RGBA格式显示(如预期)。通过读取.png,我需要能够将其转换回原始整数值

import matplotlib.pyplot as plt 
import numpy as np 
from scipy.stats import norm

# simulate some data
x = np.arange(0,100.1,1)
y1 = norm.pdf(x, loc=50, scale=20)
y2 = norm.pdf(x, loc=40, scale=10)
scaler = 1024/np.max(np.outer(y1,y2)) # img is 12 bits
img = np.outer(y1,y2)*scaler
img = img.astype(np.uint16) # force to be 16 bit as there is no 12 bit in np
print(np.max(img), np.min(img), img.shape)
plt.imshow(img)
plt.show()

plt.imsave(r"../img/sim.png", img, vmin=0, vmax=2**12, cmap='viridis')
img2 = plt.imread(r"../img/sim.png")
img2 # can we convert these RGBA values back to the original integers?
我不知道如何将这些(有效地)转换回原始整数。我相信这是可能的,因为我已经读到.png使用无损压缩。基本上我需要确定img2等于img


我觉得我肯定错过了一些基本的东西

以下行有问题:

plt.imsave(r"../img/sim.png", img, vmin=0, vmax=2**12, cmap='viridis')
当您使用
cmap='viridis'
指定颜色贴图时,它会将图像量化到8位,这样它就可以在PNG图像中使用256色调色板(尽可能大),并启动!您的16位数据已丢失

如果您使用
imageio
它可以保存16位数据,因此您可以将上面的行替换为:

import imageio                                                                                                                         
...
imageio.imwrite('12-bit.png',img)
这将保留您的16位数据。一个潜在的问题是,数据现在是灰色的,很难看到。这可能不是问题,因为您保存数据只是为了存储数据,而不是为了可视化数据。我想你会有两个选择:

  • 或者将文件存储两次(磁盘便宜)-一次以灰度存储,一次以viridis colormap可视化,或者

  • 只需在灰度中存储一次,并制作一个“查看器”工具,加载灰度并使用viridis调色板进行渲染


请提供一个简单的工作示例,让我们更简洁、更全面:也许您可以向我们展示当前和所需的格式是什么样的?你的标题也让人困惑:你想转换为RGBA浮点还是单色整数?我对综合部分感到困惑,因为我说我需要确定img2等于img。我知道标题应该是integer(虽然float就足够了,因为我们可以通过反转matplotlib的标准化将0到1的float映射为整数)。我不知道您的工作流是什么样子,但我认为使用numpy和保存
img
会更容易。然后您可以加载它,它将具有正确的类型和编号。是的,有一个不同的应用程序基本上需要.png文件。试图通过多次保存来减少数据蔓延。虽然可以很容易地反转颜色映射…@CJStevens并非每个人都熟悉您使用的数据格式,因此对数据格式的注释或摘录可能会有所帮助(而且更全面;-)。示例:
my_rgba=initialize_rgba_value()#格式(最大值为255的单元):[255,0,100,50]
。我想我们中的许多人都知道RGBA值是什么,但我以前从未听说过颜色值的单整数表示(尽管我想到了一个明显的实现,因为4*8位=32位…),谢谢。我昨晚意识到了8位彩色地图,但没有抽出时间把它全部放在一起。我在这里测试了你的结果,我想我会证明它的完整性
img2=plt.imread(r.。/img/12 bit.png”)
((img2*2**16).astype('uint16')==img)。any()
我可能会选择上面概述的选项1。