Arrays PIL'中的动态范围(位深度);s fromarray()函数?

Arrays PIL'中的动态范围(位深度);s fromarray()函数?,arrays,numpy,save,python-imaging-library,bit-depth,Arrays,Numpy,Save,Python Imaging Library,Bit Depth,我对12位相机的多帧TIFF图像进行了一些图像处理,希望保存输出。但是,未列出fromarray()的12位模式。PIL如何处理位深度,如何确保保存的TIFF图像与原始图像具有相同的动态范围 示例代码: 导入操作系统 将numpy作为np导入 将matplotlib.pyplot作为plt导入 从PIL导入图像 #读取图像文件名 路径名='/home/user/images/' filenameList=[os.listdir中文件名的文件名(路径名) 如果文件名为.endswith((“.ti

我对12位相机的多帧TIFF图像进行了一些图像处理,希望保存输出。但是,未列出
fromarray()
的12位模式。PIL如何处理位深度,如何确保保存的TIFF图像与原始图像具有相同的动态范围

示例代码:

导入操作系统
将numpy作为np导入
将matplotlib.pyplot作为plt导入
从PIL导入图像
#读取图像文件名
路径名='/home/user/images/'
filenameList=[os.listdir中文件名的文件名(路径名)
如果文件名为.endswith((“.tif”,“.tif”,“.tiff”,“.tiff”))]
#打开图像文件,对所有帧进行平均,保存平均图像文件
对于文件名列表中的文件名:
img=Image.open(路径名+文件名)
十、 Y=img.size
n帧=img.n_帧
imgArray=np.零((Y,X))
对于范围内的i(n帧):
img.seek(i)
imgArray+=np.数组(img)
i+=1
imgArrayAverage=imgArray/n帧

imgAverage=Image.fromarray(imgArrayAverage)#根据我的经验,12位图像作为16位图像打开,前四个MSB都是零。我的解决方案是使用

arr = np.array(img).astype(np.uint16)
astype()指令可能不是严格必需的,但似乎是个好主意。然后,要转换为16位,请将二进制数字向左移动四位:

arr = np.multiply(arr,2**4)
如果您想使用8位

arr = np.floor(np.divide(arr,2**4)).astype(np.uint8)
其中,astype()是强制转换为8位整数所必需的。我认为8位截断隐式地执行floor()函数,但我把它留着以防万一

最后,转换回PIL图像对象,您就可以开始了:

img = Image.fromarray(arr)
对于您的特定用例,这将具有相同的效果:

imgAverage = Image.fromarray(imgarrayAverage.astype(np.uint16) * 2**4)

再次进行类型转换可能没有必要,但它可能会节省您的时间,因为将imgArray除以NFrames应该会隐式地产生一个浮点数组。如果您担心精度,可以忽略它。

根据我的经验,12位图像会作为16位图像打开,前四个MSB都是零。我的解决方案是使用

arr = np.array(img).astype(np.uint16)
astype()指令可能不是严格必需的,但似乎是个好主意。然后,要转换为16位,请将二进制数字向左移动四位:

arr = np.multiply(arr,2**4)
如果您想使用8位

arr = np.floor(np.divide(arr,2**4)).astype(np.uint8)
其中,astype()是强制转换为8位整数所必需的。我认为8位截断隐式地执行floor()函数,但我把它留着以防万一

最后,转换回PIL图像对象,您就可以开始了:

img = Image.fromarray(arr)
对于您的特定用例,这将具有相同的效果:

imgAverage = Image.fromarray(imgarrayAverage.astype(np.uint16) * 2**4)

再次进行类型转换可能没有必要,但它可能会节省您的时间,因为将imgArray除以NFrames应该会隐式地产生一个浮点数组。如果您担心精确度,可以省略。

您可以在[链接]()中使用第二个答案干杯@你好,谢谢你的帮助。你的意思是什么?我找不到关于如何处理动态范围/位深度问题的任何信息:o)您可以使用此[链接]中的第二个答案()干杯@你好,谢谢你的帮助。你的意思是什么?我找不到有关如何处理动态范围/位深度问题的任何信息:o)