激光雷達(LiDAR)數據在實際應用中可能受到噪聲和不完美的測量影響,因此數據去噪和濾波方法變得至關重要,以提高數據質量和準確性。以下是一些常用的激光雷達數據去噪與濾波方法。
原始數據如下:
1. 移動平均濾波(Moving Average Filter):
移動平均濾波是一種簡單的濾波方法,通過計算數據點周圍一定范圍內數據的平均值來平滑數據。這種方法適用于去除高頻噪聲,但可能會導致邊緣信息模糊。
代碼:
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. 中值濾波(Median Filter):
中值濾波是一種非線性濾波方法,將數據點周圍的值按大小排序,然后取中間值作為濾波結果。中值濾波能夠有效去除脈沖噪聲和異常值,但可能會降低數據的細節。
代碼:
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. 加權移動平均濾波(Weighted Moving Average Filter):
加權移動平均濾波將不同位置的數據點賦予不同的權重,根據權重計算加權平均值。這種方法可以根據數據分布的特點更好地平衡平滑和保留細節。
代碼:
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. 高斯濾波(Gaussian Filter):
高斯濾波基于高斯函數對數據進行平滑處理。它可以保留細節的同時有效地去除噪聲,適用于光滑信號。
代碼:
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. 波形去除濾波(Waveform Removal Filter):
這種濾波方法主要用于去除激光雷達回波中的地面信號,以便更好地檢測障礙物。該方法需要先對地面進行建模,然后將地面信號從數據中減去。
代碼:
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. 自適應濾波(Adaptive Filtering):
自適應濾波方法根據數據點的局部特征動態調整濾波參數。例如,自適應中值濾波根據數據分布的變化調整濾波窗口的大小,以平衡噪聲去除和細節保留。
代碼:
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. 小波變換濾波(Wavelet Transform Filter):
小波變換濾波可以將信號分解成不同頻率的子信號,然后根據需要去除高頻噪聲,再將信號重構回去。這種方法在處理包含多尺度信息的數據時非常有用。
代碼:
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)處理效果較好,其中后者最佳。