在 python 中处理 tiff 文件

working with tiff files in python

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

据我了解TIFF文件也可以是彩色的,这方面没有限制。

这是定义 -- "TIFF (Tag Image File Format) is a common format for exchanging raster graphics (bitmap) images between application programs, including those used for scanner images."

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

这是一个 TIFF 图像的例子。 (link)

从上面的 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)

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位颜色(所谓的'true color')。

使用 cv2

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