Tiff图像的前处理,median blur filter 及 linear stretch

该博客介绍了如何对Sentinel-1 SAR遥感影像进行预处理,包括使用中值滤波器去除噪点,通过替换百分位值进行边缘增强,以及将值域从[-22.294464, 2.497968]转换到[0, 255]。过程中涉及了ndimage库的中值滤波函数和使用numpy计算百分位数进行值域限制。最后通过直方图展示了处理前后的效果。
摘要由CSDN通过智能技术生成


从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')

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

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

替换百分位值

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

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=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

在这里插入图片描述

转换为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)

不做百分位处理的直方图

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

做百分位处理的直方图

做百分位处理的直方图。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值