【问题标题】:High performance (python) library for reading tiff files?用于读取 tiff 文件的高性能(python)库?
【发布时间】:2022-10-07 16:38:19
【问题描述】:

我正在使用代码读取 .tiff 文件以计算分形维数。我的代码如下所示:

import matplotlib.pyplot as plt

raster = plt.imread(\'xyz.tif\')

for i in range(x1, x2):
    for j in range(y1, y2):
        pixel = raster[i][j]

这行得通,但我必须读取很多像素,所以我希望它快,并且理想情况下在当前事件的情况下最大限度地减少用电量。为此目的,是否有比 matplotlib 更好的库?例如,可以使用专门用于矩阵运算的库(如 pandas)有帮助吗?另外,像 C 这样的另一种语言会比 python 有更好的性能吗?

  • 在担心找到更快的 TIFF 阅读器之前,您需要对代码进行基准测试/分析,因为我敢打赌双 for 循环的运行时间比读取文件要长得多。

标签: python tiff


【解决方案1】:

我不确定哪个库最快,但我对 Pillow 有很好的体验:

from PIL import Image
raster = Image.open('xyz.tif')

然后你可以将它转换为一个 numpy 数组:

import numpy
pixels = numpy.array(raster)

我需要查看其余代码才能推荐任何其他库。至于语言 C++ 或 C 将具有更好的性能,因为它们是低级语言。因此,取决于您的操作有多复杂以及您需要处理多少数据,C++ 脚本被证明要快 10-200 倍(随着计算的复杂性而增加)。如果您有任何进一步的问题,希望这会有所帮助。

【讨论】:

    【解决方案2】:

    我发现cv2 是最快的库。使用 5000 个 128x128 uint16 tif 图像得到以下结果:

    import time
    import matplotlib.pyplot as plt
    t0 = time.time()
    for file in files:
        raster = plt.imread(file)
    print(f'{time.time()-t0:.2f} s')
    

    1.52 秒

    import time
    from PIL import Image
    t0 = time.time()
    for file in files:
        im = np.array(Image.open(file))
    print(f'{time.time()-t0:.2f} s')
    

    1.42 秒

    import time
    import tifffile
    t0 = time.time()
    for file in files:
        im = tifffile.imread(file)
    print(f'{time.time()-t0:.2f} s')
    

    1.25 秒

    import time
    import cv2
    t0 = time.time()
    for file in files:
        im = cv2.imread(file, cv2.IMREAD_UNCHANGED)
    print(f'{time.time()-t0:.2f} s')
    

    0.20 秒

    cv2 是一个用 c++ 编写的计算机视觉库,正如其他评论者提到的那样,它比纯 python 快得多。注意 cv2.IMREAD_UNCHANGED 标志,否则 cv2 会将单色图像转换为 8 位 rgb。

    【讨论】:

      猜你喜欢
      • 2017-03-02
      • 1970-01-01
      • 1970-01-01
      • 2019-03-21
      • 1970-01-01
      • 2018-08-12
      • 2020-12-09
      • 1970-01-01
      • 2014-11-26
      相关资源
      最近更新 更多