三维重建8:点云图像的滤波方法
?????? ? 點云數據是三維空間的離散數據,不是類似于PLY格式的點線概念,因此可以使用所謂的“濾波方法”。點云數據若非看成深度map數據,則不再適用于使用二維圖形的核卷積方法。此外,濾波方法與點云存儲格式密切相關,點云存儲格式一般為八叉樹,而2.5D圖像存儲格式可以用深度Map形式,對應了不同的濾波方式。
??????? 此外,點云劃分為有序點云和無序點云之后,又對應了不同的濾波方法。
?
(1) 如果點云是有序的,通過 pcl: : Organ izedDatalnd ex 使用有序搜索方法 。 (2) 如果點云是無序的,通過 pcl : : KdTreeFLANN 使用通用的 Kd 樹 //有序點云 //Example: // cloud.width = 640; // Image-like organized structure, with 640 rows and 480 columns, // cloud.height = 480; // thus 640*480=307200 points total in the dataset //無序點云 //Example: // cloud.width = 307200; // cloud.height = 1; // unorganized point cloud dataset with 307200 points?
???????? 實際意義上的點云濾波,是以三維點集的思維方面尋找方法,因此點云濾波依賴于幾何信息,而不是數值關系。在濾波思想上,本質上三維點云X、Y、Z的思想方法權重應該是一致的。
?
0.何為雙邊濾波器
?????? 雙邊濾波,Bilateral filter。是一種可以保邊去噪的濾波器。之所以可以達到此去噪效果,是因為濾波器是由兩個函數構成。一個函數是由幾何空間距離決定濾波器系數。另一個由像素差值決定濾波器系數。在差值較高的地方降低權重,此時可以明顯包住邊緣。
? ? ? ?雙邊濾波器的好處是可以做邊緣保存edge preserving,一般過去用的維納濾波或者高斯濾波去降噪,都會較明顯的模糊邊緣,對于高頻細節的保護效果并不明顯。雙邊濾波器顧名思義比高斯濾波多了一個高斯方差sigma-d,它是基于空間分布的高斯濾波函數,所以在邊緣附近,離的較遠的像素不會太多影響到邊緣上的像素值,這樣就保證了邊緣附近像素值的保存。 ??????
??????? 但是由于保存了過多的高頻信息,對于彩色圖像里的高頻噪聲,雙邊濾波器不能夠干凈的濾掉,只能夠對于低頻信息進行較好的濾波。
??????? 參考這個:雙邊濾波器.....
??????? 即濾波函數在一個梯度計算時候添加一個判斷條件的,復合函數...
?
1.PCL的雙邊濾波
類似于灰度圖雙邊濾波的效果,點云雙邊濾波仍然具有保邊濾波功能
PCL示例代碼:
void Filters::bilateralFilter(pcl::PCLPointCloud2::ConstPtr input, pcl::PCLPointCloud2& output,float sigma_s, float sigma_r) {// Convert data to PointCloud<T>pcl::PointCloud<pcl::PointXYZ>::Ptr xyz (new pcl::PointCloud<pcl::PointXYZ>);fromPCLPointCloud2 (*input, *xyz);// Apply the filterpcl::FastBilateralFilter<pcl::PointXYZ> fbf;fbf.setInputCloud (xyz);fbf.setSigmaS (sigma_s);fbf.setSigmaR (sigma_r);pcl::PointCloud<pcl::PointXYZ> xyz_filtered;fbf.filter (xyz_filtered);// Convert data backpcl::PCLPointCloud2 output_xyz;toPCLPointCloud2 (xyz_filtered, output_xyz);pcl::concatenateFields (*input, output_xyz, output); }此外,雙邊濾波依然有平面平滑的作用。因此,對于使用平面擬合獲取點云稠密法線,還是有很大幫助的。
2.PCL的密度聚類
PCL的噪點大多分布比較隨機,相對對于正確點云數據密度較低,調至一個合適的參數,可以用密度方法去除噪點(也叫離群點)。
缺點:對于相對于相機傾斜度極高的斜面,正確點云墻的密度也非常稀疏,因此在這種情況出現時,需要其他的判斷方法。
PCL示例代碼:
2.1基于統計密度的聚類
pcl::StatisticalOutlierRemoval<pcl::PointXYZ> sor;sor.setInputCloud (cloud);sor.setMeanK (50);sor.setStddevMulThresh (1.0);sor.filter (*cloud_filtered);統計濾波器StatisticalOutlierRemoval用于去除明顯離群點(離群點往往由測量噪聲引入)。
每個點都表達一定信息量,某個區域點越密集則可能信息量越大。噪聲信息屬于無用信息,信息量較小。所以離群點表達的信息可以忽略不計。考慮到離群點的特征,則可以定義某處點云小于某個密度,既點云無效。計算每個點到其最近的k個點平均距離。則點云中所有點的距離應構成高斯分布。給定均值與方差,可剔除離群點。
?
2.2基于半徑的聚類
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>);pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_filtered(new pcl::PointCloud<pcl::PointXYZ>);pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_filtered (new pcl::PointCloud<pcl::PointXYZ>);pcl::RadiusOutlierRemoval<pcl::PointXYZ> outrem;// build the filteroutrem.setInputCloud(cloud);outrem.setRadiusSearch(0.8);outrem.setMinNeighborsInRadius (2);// apply filteroutrem.filter (*cloud_filtered);基于半徑的聚類,指明了使用半徑統計的方法
???????
?
3.其他方法:不管是密度聚類還是雙邊聚類,都無法避免超斜平面的點云稀疏性問題。
?????? 最好的方法,是在點云濾波之前,使用平面擬合和曲面擬合的方法,先找出平面和曲面,保留平面點和曲面點集合,再進行濾波。
?
總結
以上是生活随笔為你收集整理的三维重建8:点云图像的滤波方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 三维重建7:Visual SLAM算法笔
- 下一篇: 抖音极速版赚钱