Эффективно применить функцию для перемещения окна в Python - PullRequest
0 голосов
/ 06 июля 2018

Я пытаюсь применить локальное минимальное / максимальное растяжение (или другое) для движущегося окна поверх изображения. Это работает, в основном, но занимает вечность, так как я зацикливаюсь на каждом пикселе, вычисляю мин / макс вокруг него, растягиваю их до доступного диапазона значений, записываю их и затем продолжаю. Я слышал о «нарезанных массивах» и «шагах», но не знаю, как их принять. Вот чем я сейчас занимаюсь:

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 , которая может выполнять локальное растяжение, но мне нужно сделать аналогичные вещи с движущимися окнами, поэтому главный вопрос все еще остается.

...