Python 解释从tif文件获得的numpy数组

Python 解释从tif文件获得的numpy数组,python,image,numpy,tiff,Python,Image,Numpy,Tiff,我需要处理一些灰度tif文件,我一直在使用PIL将其作为图像导入,并将其转换为numpy数组: np.array(Image.open(src)) 我想清楚地了解这些数组的值到底对应于什么,特别是,对于我的图像,什么值适合作为白点或黑点尚不清楚。例如,如果我想将这个数组转换成一个浮动数组,其中像素值为1表示白色值,0表示黑色值,其他值在两者之间线性缩放 我尝试过一些简单的方法,包括按数组中的最大值进行缩放,但是打开结果文件时,颜色级别总是会发生一些变化 是否有任何文档说明如何正确理解这

我需要处理一些灰度tif文件,我一直在使用PIL将其作为图像导入,并将其转换为numpy数组:

    np.array(Image.open(src))
我想清楚地了解这些数组的值到底对应于什么,特别是,对于我的图像,什么值适合作为白点或黑点尚不清楚。例如,如果我想将这个数组转换成一个浮动数组,其中像素值为1表示白色值,0表示黑色值,其他值在两者之间线性缩放

我尝试过一些简单的方法,包括按数组中的最大值进行缩放,但是打开结果文件时,颜色级别总是会发生一些变化

是否有任何文档说明如何正确理解这些tif阵列中存储的值?

A基本上是一种用于存储光栅图形图像的计算机文件格式。它有很多功能,在网上快速搜索将为您提供所需的资源

问题是您正在使用PIL作为输入库。您拥有的数组可能使用
uint8
数据类型,这意味着您的数据可以位于0到255之间的任何位置。要获得0到1的颜色范围,请执行以下操作:

im = np.array(Image.open(src)).astype('float32')/255
请注意,您的数组可能会在第三维
im[:,:,here]
im.shape=(i,j,k)
)中提供4个层。因此,对于RGBA值,每个轨迹(代表一个像素)都将是一个四元组

R代表红色(或红色的数量),G代表绿色,B代表蓝色。A是alpha通道,它使您能够具有透明度(较低的值意味着较少的不透明度和更多的透明度)

它也可以有三层,仅用于RGB,或一层,如果打算以灰度绘制

如果您有RGB(或RGBA,但不考虑alpha),但需要一个值,您应该了解有很多不同的方法来实现这一点。In@denis建议使用以下配方:

Y = .2126 * R^gamma + .7152 * G^gamma + .0722 * B^gamma
其中,对于许多PC,gamma为2.2。通常的R G B有时被写入 作为R'G'B'(R'=Rlin^(1/gamma))(纯粹主义者用舌头点击)但这里 我会把电话挂断的

最后
L*=116*Y^1/3-16
获得亮度

我建议你读他的帖子。也要考虑以下概念:


谢谢您的回答。这里有一件事对我来说似乎很奇怪,那就是我的numpy数组显然不是
uint8
数组。数组中的最大值约为30000个数量级,但公平地说,我使用的是16位灰度tifs。@FrankWang,这就解释了这一点。这是PIL的一个老问题,我认为它现在已经解决了。无论如何都有解决办法。例如,请检查此链接: