Обрезка изображений в rasterio добавляет черные пиксели

#python #gis

#python #гис

Вопрос:

не уверен, должно ли это быть здесь или на ГИС-плате.

У меня есть большие изображения sentinel (geotiff), которые я хочу обрезать до интересующей области меньшего размера. Мой RIO — это просто шейп-файл, содержащий квадрат, созданный в QGIS.

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

Затем я вычисляю NDVI для каждого изображения.

Затем, используя случайно сгенерированный пиксель в пределах границ geotiff, я могу извлечь NDVI для этого пикселя из всех моих спутниковых изображений, а также информацию о достоверности с моей карты обрезки, чтобы обучить свой собственный классификатор.

Я обрезаю сторожевые полосы следующим кодом Python:

 b2 = rasterio.open(imagePaths['B02']) # BLUE BAND

b2Clipped, b2Transform = mask(b2, shapes, crop=True, nodata = 1, all_touched = True)

outMeta = b2.meta.copy()
outMeta.update({
    "driver": "Gtiff",
    "height": b2Clipped.shape[1],
    "width": b2Clipped.shape[2],
    "transform": b2Transform
})
b2Name = os.path.join(basePath, b2filename)
b2Out = rasterio.open(
    b2Name,
    "w",
    **outMeta
)
b2Out.write(b2Clipped)
b2Out.close()
 

Я обрезаю все свои полосы, включая B4 и B8, чтобы можно было вычислить NDVI.

Моя проблема связана с функцией маски из rasterio, когда мои спутниковые изображения маскируются, по какой-то причине добавляется куча нулей?

Когда я открываю изображения в QGIS, чтобы посмотреть, что происходит, похоже, что изображение было преобразовано, поэтому оно плоское, обрезано, а затем преобразовано обратно — и при обратном преобразовании моего изображения добавляется куча новых пикселей в виде 0.

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

Добавленные 0 также затрудняют вычисление NDVI, поскольку оно пытается разделить некоторые числа на 0.

Есть ли способ просто замаскировать мои изображения такими, какие они есть?

Вы можете увидеть изображения моей обрезанной области и обрезанного полигона здесь: https://imgur.com/a/AXoTAZS

Могу ли я обрезать свои изображения в python без добавления всех этих пикселей?

Комментарии:

1. Кажется, что добавление filled = True к функции маски устраняет мою проблему

2. Добавление filled = True делает так, что к моему изображению добавляется 0 пикселей nodata, но обрезанное изображение все равно больше, чем моя маска.