在python中使用tiff文件

时间:2015-03-14 14:01:10

标签: python image-processing tkinter python-imaging-library tiff

首先是tiff的灰度?据我了解tiff的工作方式,他们可以接受浮点数,因为大多数其他图像类型都不能。我试图进行线性插值以获得平滑着色,并且需要将浮点rgb数组放入此tiff图像中。这样做的正确方法是什么?截至目前,我正在使用PIL和两个for循环来迭代新创建的tiff的宽度和高度以将像素放在那里然后转换为CMYK格式,但是当在像Ifran这样的程序中打开时它显示出明显的灰度图像并不像生成完整图像,因为只有一半出现在完整图像中。

3 个答案:

答案 0 :(得分:1)

TIFF文件格式非常多才多艺。是的,它可以以浮动格式存储像素,甚至可以存储复值像素。一般来说。另一方面,据我所知,PIL不能直接处理浮点值图像数据。更重要的是,使用浮点值像素保存图像数据对于世界上大多数人来说有些奇特,因此只有少数程序可以做到这一点。 PIL不是其中之一。即使是numpy / scipy也可能无法存储例如dtype = float32为TIFF。一个技巧是直接使用TIFFlib,例如通过cython或者可以使用vigra numpy(http://ukoethe.github.io/vigra/doc-release/vigranumpy/index.html)。但是,由于你必须坚持使用PIL,所有这些可能都不是一种选择。

另一方面:为什么有必要将像素存储为浮点数?据我所知,您的程序会生成像素值。这里常见的解决方案是将浮点值缩放到0..255的范围。让我们说,红色通道的最小浮点值和最大浮点值存储在

rmin, rmax

然后应用以下缩放:

ri = int(255 * (r - rmin) / (rmax - rmin) )

假设r是你的浮点值。绿色和蓝色通道也是如此。这样,您就可以生成一个int值图像。

最后,我建议使用便携式PNG图像格式存储图像,使用无损压缩并存储24位颜色(所谓的“真彩色”)。

答案 1 :(得分:0)

据我所知,TIFF文件也很丰富多彩,对此方面没有限制。

这里的定义 - " TIFF(标记图像文件格式)是用于在应用程序之间交换光栅图形(位图)图像的常用格式,包括用于扫描仪图像的图像。"

TIFF文件可以是几个类中的任何一个,包括灰度,调色板或RGB全彩,并且可以包含具有JPEG,LZW或CCITT Group 4标准运行长度图像压缩的文件。

这是TIFF图像的示例。 (link

从上面的链接下载此图片。

这是一个小的Python代码,它接受一个tiff图像并将其转换为numpy数组以供进一步处理。

from PIL import Image
image_tiff = Image.open('a_image.tif')
image_tiff.show() # opens the tiff image. this rainbow color tiff

要将其转换为numpy数组,我们这样做

import numpy as np
imarray = np.array(image_tiff)
imarray

如果你打印imarray,它会给你这样的东西

array([[  0,   1,   2, ..., 244, 245, 246],
   [  0,   1,   2, ..., 244, 245, 246],
   [  0,   1,   2, ..., 244, 245, 246],
   ..., 
   [  0,   1,   2, ..., 244, 245, 246],
   [  0,   1,   2, ..., 244, 245, 246],
   [  0,   1,   2, ..., 244, 245, 246]], dtype=uint8)

答案 2 :(得分:0)

使用cv2

import cv2
import numpy as np
image = cv2.imread('tif_file.tif')
image = np.asarray(image,dtype = np.float64)