Я пытаюсь применить локальное минимальное / максимальное растяжение (или другое) для движущегося окна поверх изображения. Это работает, в основном, но занимает вечность, так как я зацикливаюсь на каждом пикселе, вычисляю мин / макс вокруг него, растягиваю их до доступного диапазона значений, записываю их и затем продолжаю. Я слышал о «нарезанных массивах» и «шагах», но не знаю, как их принять. Вот чем я сейчас занимаюсь:
import os
import numpy as np
from osgeo import gdal
def localStretch(image, radius, output):
ds = gdal.Open(image, gdal.GA_ReadOnly)
drv = ds.GetDriver()
cols = ds.RasterXSize
rows = ds.RasterYSize
bands = ds.RasterCount
if os.path.exists(output):
os.remove(output)
out_ds = drv.Create(output, cols, rows, bands, ds.GetRasterBand(1).DataType)
window = radius * 2 + 1
for b in range(bands):
data = ds.GetRasterBand(b + 1).ReadAsArray()
out_data = np.zeros(data.shape)
for x in range(radius, cols - radius):
for y in range(radius, rows - radius):
minimum = np.min(data[y - radius: y + radius, x - radius: x + radius])
maximum = np.max(data[y - radius: y + radius, x - radius: x + radius])
out_data[y, x] = (data[y, x] * 1. - minimum * 1.) / (maximum * 1. - minimum * 1.) * np.iinfo(data.dtype).max
out_ds.GetRasterBand(b + 1).WriteArray(out_data)
out_ds = None
ds = None
В идеале я бы хотел сохранить размер изображения, вставив np.pad(data, radius, mode='reflect')
, но тогда я не уверен, как правильно все проиндексировать.
Так, как я могу улучшить производительность этого?
Тем временем я нашел здесь функцию skimage
, которая может выполнять локальное растяжение, но мне нужно сделать аналогичные вещи с движущимися окнами, поэтому главный вопрос все еще остается.