我正在尝试为图像上的移动窗口应用局部最小/最大拉伸(或其他)。基本上,它可以工作,但是要花很多时间,因为我遍历每个像素,计算其周围的最小值/最大值,将其拉伸到可用值范围,然后将其写入并继续。我听说过“切片数组”和“跨步”,但不知道如何采用它们。这是我目前正在做的事情:
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中找到了一个函数,该函数可以进行局部拉伸,但是我需要通过移动窗口来做类似的事情,因此主要问题仍然存在。