Python を使用し、laspy を使用して読み書きする LIDAR LAS データ フィルタリングを実装する 7 つの方法

実際のアプリケーションでは、LiDAR データはノイズや不完全な測定の影響を受ける可能性があるため、データの品質と精度を向上させるには、データのノイズ除去とフィルタリングの方法が重要になります。以下に、一般的に使用される LIDAR データのノイズ除去およびフィルタリング方法をいくつか示します。
元のデータは次のとおりです。
ここに画像の説明を挿入します

1. 移動平均フィルター:

移動平均フィルタリングは、データ点を中心とした一定範囲内のデータの平均を計算することでデータを平滑化する単純なフィルタリング方法です。この方法は高周波ノイズの除去に適していますが、エッジ情報がぼやける可能性があります。

コード:

import laspy
import numpy as np
from scipy.signal import medfilt
from skimage.metrics import structural_similarity as ssim

# 读取LAS文件
in_file_path = 'F:/激光雷达/武汉地调中心/1500N点云.las'
out_file_path_ma = 'F:/激光雷达/武汉地调中心/output_moving_average.las'

in_las = laspy.file.File(in_file_path, mode='r')

# 提取点云数据
x = in_las.x
y = in_las.y
z = in_las.z

# 应用移动平均滤波
window_size = 5
filtered_z_ma = np.convolve(z, np.ones(window_size)/window_size, mode='same')

# 创建新的LAS文件并保存滤波后数据
out_las_ma = laspy.file.File(out_file_path_ma, mode='w', header=in_las.header)
out_las_ma.x = x
out_las_ma.y = y
out_las_ma.z = filtered_z_ma
out_las_ma.close()

2.メディアンフィルター:

メディアン フィルタリングは、データ ポイントの周囲の値をサイズごとに並べ替え、中央の値をフィルタリング結果として取得する非線形フィルタリング方法です。メディアン フィルタリングはインパルス ノイズと外れ値を効果的に除去できますが、データの詳細が低下する可能性があります。

コード:

import laspy
import numpy as np
from scipy.signal import medfilt
from skimage.metrics import structural_similarity as ssim

# 读取LAS文件
in_file_path = 'F:/激光雷达/武汉地调中心/1500N点云.las'
out_file_path_med = 'F:/激光雷达/武汉地调中心/output_median.las'

in_las = laspy.file.File(in_file_path, mode='r')

# 提取点云数据
x = in_las.x
y = in_las.y
z = in_las.z

# 应用中值滤波
window_size_med = 3
filtered_z_med = medfilt(z, kernel_size=window_size_med)

# 创建新的LAS文件并保存滤波后数据
out_las_med = laspy.file.File(out_file_path_med, mode='w', header=in_las.header)
out_las_med.x = x
out_las_med.y = y
out_las_med.z = filtered_z_med
out_las_med.close()

3. 加重移動平均フィルター:

加重移動平均フィルタリングは、異なる位置にあるデータ ポイントに異なる重みを割り当て、その重みに基づいて加重平均を計算します。この方法では、データ分布の特性に応じて、平滑化と詳細の保持のバランスをより適切に取ることができます。

コード:

import laspy
import numpy as np
from scipy.signal import medfilt
from skimage.metrics import structural_similarity as ssim

# 读取LAS文件
in_file_path = 'F:/激光雷达/武汉地调中心/1500N点云.las'
out_file_path_weighted_ma = 'F:/激光雷达/武汉地调中心/output_weighted_moving_average.las'

in_las = laspy.file.File(in_file_path, mode='r')

# 提取点云数据
x = in_las.x
y = in_las.y
z = in_las.z

# 应用加权移动平均滤波
window_size = 5
weights = np.arange(1, window_size + 1).astype(float)  # 转换为浮点数类型
weights /= np.sum(weights)
filtered_z_weighted_ma = np.convolve(z, weights, mode='same')

# 创建新的LAS文件并保存滤波后数据
out_las_weighted_ma = laspy.file.File(out_file_path_weighted_ma, mode='w', header=in_las.header)
out_las_weighted_ma.x = x
out_las_weighted_ma.y = y
out_las_weighted_ma.z = filtered_z_weighted_ma
out_las_weighted_ma.close()

4. ガウスフィルター:

ガウス フィルタリングは、ガウス関数に基づいてデータを平滑化します。ディテールを保持しながら効果的にノイズを除去でき、滑らかな信号に適しています。

コード:

import laspy
import numpy as np
from scipy.ndimage import gaussian_filter1d
from skimage.metrics import structural_similarity as ssim

# 读取LAS文件
in_file_path = 'F:/激光雷达/武汉地调中心/1500N点云.las'
out_file_path_gaussian = 'F:/激光雷达/武汉地调中心/output_gaussian.las'

in_las = laspy.file.File(in_file_path, mode='r')

# 提取点云数据
x = in_las.x
y = in_las.y
z = in_las.z

# 应用高斯滤波
sigma = 1.0  # 高斯核标准差
filtered_z_gaussian = gaussian_filter1d(z, sigma=sigma)

# 创建新的LAS文件并保存滤波后数据
out_las_gaussian = laspy.file.File(out_file_path_gaussian, mode='w', header=in_las.header)
out_las_gaussian.x = x
out_las_gaussian.y = y
out_las_gaussian.z = filtered_z_gaussian
out_las_gaussian.close()

5. 波形除去フィルター:

このフィルタリング方法は主に、障害物をより適切に検出するために LIDAR エコーから地上信号を除去するために使用されます。この方法では、最初に地面をモデル化し、次にデータから地面信号を差し引く必要があります。

コード:

import laspy
import numpy as np
from scipy.signal import detrend
from skimage.metrics import structural_similarity as ssim

# 读取LAS文件
in_file_path = 'F:/激光雷达/武汉地调中心/1500N点云.las'
out_file_path_waveform_removal = 'F:/激光雷达/武汉地调中心/output_waveform_removal.las'

in_las = laspy.file.File(in_file_path, mode='r')

# 提取点云数据
x = in_las.x
y = in_las.y
z = in_las.z

# 应用波形去除滤波
filtered_z_waveform_removal = detrend(z)

# 创建新的LAS文件并保存滤波后数据
out_las_waveform_removal = laspy.file.File(out_file_path_waveform_removal, mode='w', header=in_las.header)
out_las_waveform_removal.x = x
out_las_waveform_removal.y = y
out_las_waveform_removal.z = filtered_z_waveform_removal
out_las_waveform_removal.close()

6. 適応フィルタリング:

適応フィルタリング手法は、データ ポイントの局所的な特性に基づいてフィルタリング パラメータを動的に調整します。たとえば、適応メディアン フィルタリングは、データ分布の変化に応じてフィルタ ウィンドウのサイズを調整し、ノイズ除去とディテール保持のバランスをとります。

コード:

import laspy
import numpy as np
from scipy.signal import wiener
from skimage.metrics import structural_similarity as ssim

# 读取LAS文件
in_file_path = 'F:/激光雷达/武汉地调中心/1500N点云.las'
out_file_path_adaptive = 'F:/激光雷达/武汉地调中心/output_adaptive.las'

in_las = laspy.file.File(in_file_path, mode='r')

# 提取点云数据
x = in_las.x
y = in_las.y
z = in_las.z

# 应用自适应滤波
try:
    filtered_z_adaptive = wiener(z)
except (ValueError, ZeroDivisionError):
    # 处理除以零或无效值的情况
    filtered_z_adaptive = z  # 可以选择保持原始数据,或者使用其他滤波方法来代替

# 创建新的LAS文件并保存滤波后数据
out_las_adaptive = laspy.file.File(out_file_path_adaptive, mode='w', header=in_las.header)
out_las_adaptive.x = x
out_las_adaptive.y = y
out_las_adaptive.z = filtered_z_adaptive
out_las_adaptive.close()

7. ウェーブレット変換フィルター:

ウェーブレット変換フィルタリングは、信号をさまざまな周波数のサブ信号に分解し、必要に応じて高周波ノイズを除去し、信号を再構築します。この方法は、マルチスケール情報を含むデータを処理する場合に非常に役立ちます。

コード:

import laspy
import numpy as np
import pywt
from skimage.metrics import structural_similarity as ssim

# 读取LAS文件
in_file_path = 'F:/激光雷达/武汉地调中心/1500N点云.las'
out_file_path_wavelet = 'F:/激光雷达/武汉地调中心/output_wavelet.las'

in_las = laspy.file.File(in_file_path, mode='r')

# 提取点云数据
x = in_las.x
y = in_las.y
z = in_las.z

# 应用小波变换滤波
wavelet_name = 'db4'  # 小波基函数的名称
level = 2  # 分解的级别
coeffs = pywt.wavedec(z, wavelet_name, level=level)
coeffs[1:] = [pywt.threshold(coeff, value=0.5, mode='soft') for coeff in coeffs[1:]]  # 对细节系数进行软阈值处理
filtered_z_wavelet = pywt.waverec(coeffs, wavelet_name)

# 创建新的LAS文件并保存滤波后数据
out_las_wavelet = laspy.file.File(out_file_path_wavelet, mode='w', header=in_las.header)
out_las_wavelet.x = x
out_las_wavelet.y = y
out_las_wavelet.z = filtered_z_wavelet
out_las_wavelet.close()

比較結果は、適応フィルタリング (Adaptive Filtering) とウェーブレット変換フィルタ (Wavelet Transform Filter) の処理効果が高く、後者が最も優れていることをエラー インジケータが示していることを示しています。

おすすめ

転載: blog.csdn.net/weixin_42464154/article/details/132287267