【问题标题】:working with tiff files in python在 python 中处理 tiff 文件
【发布时间】:2015-05-16 23:17:20
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    使用 cv2

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

    【讨论】:

      【解决方案2】:

      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 位颜色(所谓的“真彩色”)。

      【讨论】:

        【解决方案3】:

        据我所知,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)
        

        【讨论】:

        • 对,我在 SO 上看到过这样的例子,用 numpy 做同样的事情,但是我不能使用 numpy,我认为他们可能只是想仔细检查以确保那不是t 我的灰度 TIFF 的原因。我只能使用没有外部模块(如 libtiff 或 tiffany 或 numpy)的 PI​​L。那么有没有办法用 0 - 255 之间的浮点值的二维列表来做到这一点?我不明白为什么我不能简单地将我的浮点数组传递给这个 TIFF 图像我对 PPM 图像做同样的事情,除了整数,它工作得很好
        • 据我所知,我认为您无法将使用 PIL 读取的图像转换为仅使用 PIL 的数组。我们可以等待更多的cmets。但是为什么不能使用任何外部库呢?
        • 便携性。嗯,也许我用错字或误解了你的评论,而不是试图发表评论,我有一个更详细的半不同版本的这篇文章作为我的另一个问题之一,它可能更详细地解释我到底想要做什么
        • 请发布相同的链接,让我知道您在寻找什么。我从你的 q 中得到的信息,我已经回复了。
        猜你喜欢
        • 2011-03-03
        • 1970-01-01
        • 1970-01-01
        • 2011-11-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多