【记录】Tiff图像的前处理,median blur filter 及 linear stretch
文章目录
- 读取Tiff
- median blur filter 中值滤波器
- 替换百分位值
- 值域变成[0,255]
从Google Earth Engine上下载的sentinel-1遥感影像(float32)。对于SAR影像在使用前可以做如下前处理:
- 去除SAR噪点
- 替换百分位2%以下及百分位98%以上的点
- 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')
替换百分位值
我也不知道为什么要做这个,但论文里是这么写的。好像是可以边缘增强。
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
值域变成[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′=max−minx−min∗(max′−min′)+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
hist = cv2.calcHist([value_convert_data[np.where(np.isnan(value_convert_data)==False)]],[0],None,[256],[0,255])
plt.figure()
plt.plot(hist)