вычитание 2-пиксельных значений из файла .tif дает неверный результат - PullRequest
0 голосов
/ 04 декабря 2018

Я пытаюсь вычесть два изображения .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))

Я вычитаю изображения, загруженные как растровые данные, и просто делаю глубокую копию одного из изображений, чтобы сохранить рассчитанные значения.

Проблема в расчетной стоимости.Когда я смотрю на значения обоих изображений по индексу [0] [0], я получаю следующие значения:

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

505

549

Когда я пытаюсьчтобы вычесть их, я получаю это:

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

65492

Я не понимаю, почему это так, и буду признателен за любую помощь!

1 Ответ

0 голосов
/ 04 декабря 2018

Это пахнет как переполнение!По сути, я предполагаю, что ваши изображения uint16 изображений, а отрицательные числа возвращаются к максимальному значению.
Обратите внимание, что вы ожидали 44, но получили 2^16 - 44.

Обходной путь довольно прост;например, приведите ваши изображения к float32, добавив в начале вашей функции subtract:

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

Удачи!


PS: Конечно, np это простомои личные предпочтения.Вы можете использовать другие подходящие для вас способы.

...