为了使遥感影像具有更好的可视化效果,一般要对影像进行拉伸显示。线性拉伸在遥感图像处理中非常常见,对于整体偏暗的原始图像来讲,拉伸之后的图像视觉效果得到了显著增强。但对于图像中反射率比较高的地物,线性拉伸会使这些地物显得很亮,模糊其本身的颜色、纹理等信息。ENVI中的“优化的线性拉伸”能在一定程度上解决这个问题。如下图所示,左侧是2%线性拉伸后的结果,右侧是优化的线性拉伸的结果。

线性拉伸的代码网上一大堆,但优化的线性拉伸中文互联网一个介绍的都没有。最后还是在ENVI的文档里看到了关于它的介绍,网址是Stretch Types Background,下面参考这个文档用Python实现一下。学习更多Python & GIS的相关知识,请移步公众号GeodataAnalysis。

python拉伸数组 python 图像拉伸_开发语言

1 线性拉伸

默认拉伸到0-255这个范围内,下同。

def linear(arr):
    arr_min, arr_max = arr.min(), arr.max()
    arr = (arr - arr_min) / (arr_max - arr_min) * 255
    arr = np.clip(arr, 0, 255)
    return np.uint8(arr)

2 百分比线性拉伸

百分比线性拉伸是指将原图像的像素值的最大值最小值指定为我们设定的百分比位置像素值,然后线性拉伸到我们设定的范围。比如百分比为2%,我们找到2%对应的灰度值和98%对应的灰度值,将这两个值作为原始图像灰度的最大最小值,然后再进行线性拉伸。

def percent_linear(arr, percent=2):
    arr_min, arr_max = np.percentile(arr, (percent, 100-percent))
    arr = (arr - arr_min) / (arr_max - arr_min) * 255
    arr = np.clip(arr, 0, 255)
    return np.uint8(arr)

3 优化的线性拉伸

优化的线性拉伸类似于线性拉伸,但提供了更多设置来控制图像中的中间调、阴影和高光。它根据四个值计算拉伸最小值和最大值:

  • 最小百分比:默认值为 0.025。
  • 最大百分比:默认值为 0.99。
  • 最小调整百分比:默认值为 0.1。
  • 最大调整百分比:默认值为 0.5。

ENVI 创建优化的线性拉伸,如下所示:

  1. 根据数据计算相对累积直方图。
  2. 查找与相对累积直方图中的最小百分比和最大百分比相对应的数据值,并分别将它们标记为 python拉伸数组 python 图像拉伸_python拉伸数组_02 和 python拉伸数组 python 图像拉伸_python_03。大多数像素的数据值将落在 python拉伸数组 python 图像拉伸_python拉伸数组_02 到 python拉伸数组 python 图像拉伸_python_03
  3. 通过将 python拉伸数组 python 图像拉伸_python拉伸数组_02 减去最小调整百分比来计算黑点(python拉伸数组 python 图像拉伸_开发语言_07),如下所示:

python拉伸数组 python 图像拉伸_开发语言_08

  1. 通过将 python拉伸数组 python 图像拉伸_python_03 增加最大调整百分比来计算白点(python拉伸数组 python 图像拉伸_python_10),如下所示:

python拉伸数组 python 图像拉伸_python_11

  1. 大于白点的像素值被分配值 255,小于黑点的像素值被分配值 0,黑点和白点之间的像素值呈线性拉伸。

代码实现如下:

def optimized_linear(arr):
    a, b = np.percentile(arr, (2.5, 99))
    c = a - 0.1 * (b - a)
    d = b + 0.5 * (b - a)
    arr = (arr - c) / (d - c) * 255
    arr = np.clip(arr, 0, 255)
    return np.uint8(arr)