有效地在Python中移动窗口的功能

时间:2018-07-06 08:35:10

标签: python-2.7 numpy gdal

我正在尝试为图像上的移动窗口应用局部最小/最大拉伸(或其他)。基本上,它可以工作,但是要花很多时间,因为我遍历每个像素,计算其周围的最小值/最大值,将其拉伸到可用值范围,然后将其写入并继续。我听说过“切片数组”和“跨步”,但不知道如何采用它们。这是我目前正在做的事情:

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 here中找到了一个函数,该函数可以进行局部拉伸,但是我需要通过移动窗口来做类似的事情,因此主要问题仍然存在。

0 个答案:

没有答案