我需要处理一些灰度级的tif文件,并且我一直在使用PIL将它们作为图像导入并将它们转换为numpy数组:
np.array(Image.open(src))
我希望能够清楚地了解这些数组的值对应的内容,特别是不清楚什么值适合作为我的图像的白点或黑点。例如,如果我想将此数组转换为浮点数组,其中像素值为1表示白色值,0表示黑色,其他值在其间线性缩放。
我尝试了一些天真的方法,包括按照数组中的最大值进行缩放,但打开生成的文件,颜色级别总会有一些变化。
是否有任何文档可以正确理解存储在这些tif数组中的值?
答案 0 :(得分:1)
TIFF基本上是用于存储光栅图形图像的计算机文件格式。它有很多specs,网上快速搜索可以为您提供所需的资源。
问题是您正在使用PIL作为输入库。您拥有的数组可能使用uint8
数据类型,这意味着您的数据可以在0到255之间的任何位置。要获得0到1的颜色范围,请执行以下操作:
im = np.array(Image.open(src)).astype('float32')/255
请注意,您的数组可能会在第三维im[:,:, here]
(im.shape = (i,j,k)
)中给出4个图层。因此,每条跟踪im[i,j,:]
(代表一个像素)将成为RGBA值的四元组。
R代表红色(或红色数量),G代表绿色,B代表蓝色。 A是alpha通道,它使您具有透明度(较低的值意味着较低的不透明度和更高的透明度)。
它也可以只有RGB三层,或者如果要在灰度中绘制一层。
如果您有RGB(或RGBA但不考虑alpha)但需要单个值,您应该明白有很多不同的方法可以做到这一点。在this post @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
获得亮度。
我建议你阅读他的帖子。还要考虑以下概念: