代码之家  ›  专栏  ›  技术社区  ›  ViktorG

从.tif文件中减去2个像素值会产生错误的结果

  •  0
  • ViktorG  · 技术社区  · 6 年前

    我试着减去两个.tif图像。 为此,我使用以下代码:

    import numpy as np
    import os
    from osgeo import gdal,ogr
    import copy
    from PIL import Image
    import time
    
    def loadTifAsArray(image, filepath):
        print("Loading "+image)
        path = os.path.join(filepath,image)
        tif = gdal.Open(path)
        tifArray = tif.ReadAsArray()
        return tifArray
    
    def subtract(image1, image2):
        # Copy of one of the images is used for saving calculated values
        print("Subtracting ...")
        sub = copy.deepcopy(image1)
        rows = len(sub)    
        cols = len(sub[0])
    
        for px in range(cols):
            for py in range(rows):
                sub[px][py] = image1[px][py] - image2[px][py]
    
        return sub
    
    
    start_time = time.time()
    
    cwd = os.getcwd()
    filepath = os.path.join(cwd,'tifs')
    arr = os.listdir(filepath)
    tifList = []
    
    for image in arr:
        tifList.append(loadTifAsArray(image, filepath))
    print("--- %s seconds for loading the images ---" % (time.time() - start_time))
    
    sub = subtract(tifList[0], tifList[1])
    print("--- %s seconds for loading and subtracting ---" % (time.time() - start_time))
    

    我减去作为rasterdata加载的图像,然后简单地对其中一个图像进行深度复制以存储计算值。

    问题是计算值。 当我在索引[0][0]处查看两个图像的值时,我得到以下值:

    print(image1[0][0]) 
    print(image2[0][0])
    

    五百零五

    五百四十九

    当我试图减去它们时,我得到:

    print(image1[0][0] - image2[0][0])
    

    六万五千四百九十二

    我不明白这是为什么,我会感谢你的帮助!

    1 回复  |  直到 6 年前
        1
  •  1
  •   ShlomiF    6 年前

    闻起来像溢出物!基本上,我假设你的图像是 uint16 图像和负数“环绕”回到最大值。
    注意,你期望44,但是 2^16 - 44 .

    解决方法非常简单;例如,通过在 subtract 功能:

    image1 = np.array(image1).astype(np.float32)
    image2 = np.array(image2).astype(np.float32)
    

    祝你好运!


    当然了。 np 只是我个人的喜好。你可以用其他最适合你的方式施法。