[記録] Tiff画像の前処理、メディアンブラーフィルター、線形ストレッチ


Google Earth Engine からダウンロードされた Sentinel-1 リモート センシング画像 (float32)。SAR 画像の場合、使用前に次の前処理を行うことができます。

  1. SARノイズを除去する
  2. 2% パーセンタイル未満および 98% パーセンタイルを超えるポイントを置き換えます
  3. 線形ストレッチは、sentinel-1 の値範囲を 0 ~ 255 に変換します。

もちろん、それを行うことはできませんし、影響を与えるべきではありません。

ティフを読む

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)

メディアンぼかしフィルター メディアンフィルター

メディアンブラーフィルタとは、SAR画像のノイズを除去する手法であり、ある点の周囲のm*nサイズの行列の中央値を使用して、ある点の値を置き換えます。具体的にはのndimagescipyで実現できます

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] ~ [0,255] の値の範囲の tiff イメージを変換します。ここでは最も単純な線形ストレッチが使用されます。これは特別な関数を使用して実装できます:ここcv2.normalize()を参照するか、次の関係に従って自分で記述します: x ' = x − minmax − min ∗ ( max ' − min ' ) + min ' x' = \frac{x -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)

パーセンタイル処理を行わないヒストグラム

パーセンタイル処理を行わないヒストグラム。

パーセンタイル処理によるヒストグラム

パーセンタイル処理のヒストグラム。

おすすめ

転載: blog.csdn.net/yaoyao_chen/article/details/128411952