【记录】Tiff图像的前处理,median blur filter 及 linear stretch

文章目录

    • 读取Tiff
    • median blur filter 中值滤波器
    • 替换百分位值
    • 值域变成[0,255]

从Google Earth Engine上下载的sentinel-1遥感影像(float32)。对于SAR影像在使用前可以做如下前处理:

  1. 去除SAR噪点
  2. 替换百分位2%以下及百分位98%以上的点
  3. linear stretch 将sentinel-1的值域转化为0-255

当然也可以不做,应该不影响。

读取Tiff

import os
import cv2
import numpy as np
from osgeo import gdal
from scipy import ndimage
import matplotlib.pyplot as plt
def read_Tiff(filename):
    dataset = gdal.Open(filename)
    im_width = dataset.RasterXSize
    im_height = dataset.RasterYSize
    im_data = dataset.ReadAsArray(xoff = 0, yoff = 0, xsize = im_width, ysize = im_height)
    return dataset, im_data
    
tiff_file = $FILE_DIR
tiff_dataset, tiff_data = read_Tiff(tiff_file)

median blur filter 中值滤波器

median blur filter 是一种去除SAR影像噪点的方法,具体是用 以某一个点为中心,周围m*n大小的矩阵的中值来代替某一个点的值。具体可以用scipy中的ndimage实现。

filter_data = ndimage.median_filter(tiff_data, size = 5, mode = 'nearest')

【记录】Tiff图像的前处理,median blur filter 及 linear stretch_第1张图片

左图为原图,右图为中值滤波器作用后的结果。

替换百分位值

我也不知道为什么要做这个,但论文里是这么写的。好像是可以边缘增强。

import copy
per2 = np.percentile(filter_data[np.isnan(filter_data)==False],2)
per98 = np.percentile(filter_data[np.isnan(filter_data)==False],98)
print(per2, per98)
>> -21.94152530670166 2.2695427560806287

new_tiff_data = copy.deepcopy(filter_data)
new_tiff_data[new_tiff_data < per2] = per2
new_tiff_data[new_tiff_data > per98] = per98
print(np.nanmin(new_tiff_data), np.nanmax(new_tiff_data))
>> -21.941525 2.2695427

【记录】Tiff图像的前处理,median blur filter 及 linear stretch_第2张图片

左图为中值滤波器作用后的结果,右图为百分数作用后的结果。

值域变成[0,255]

将值域为[-22.294464, 2.497968]的tiff图像转换到[0,255]。这里使用最简单的linear stretch。可以用专门的函数实现:cv2.normalize(),参考这里,也可以按以下关系式自己写:
x ′ = x − m i n m a x − m i n ∗ ( m a x ′ − m i n ′ ) + m i n ′ x' = \frac{x-min}{max-min} * (max'-min') + min' x=maxminxmin(maxmin)+min 其中,max和min是原数组最大最小值,max‘ min’ 对应255 和 0。

value_convert_data = ((new_tiff_data - np.nanmin(new_tiff_data))/(np.nanmax(new_tiff_data) - np.nanmin(new_tiff_data))) * 255 + 0

【记录】Tiff图像的前处理,median blur filter 及 linear stretch_第3张图片

转换为0-255以后的结果。
最后画一下像素的直方图
hist = cv2.calcHist([value_convert_data[np.where(np.isnan(value_convert_data)==False)]],[0],None,[256],[0,255])
plt.figure()
plt.plot(hist)

【记录】Tiff图像的前处理,median blur filter 及 linear stretch_第4张图片

不做百分位处理的直方图。

【记录】Tiff图像的前处理,median blur filter 及 linear stretch_第5张图片

做百分位处理的直方图。

你可能感兴趣的:(记录,python,图像处理)