踐全解析)
1. 項(xiàng)目概述視覺深度圖中的“空洞”究竟是什么在三維視覺、機(jī)器人導(dǎo)航或者增強(qiáng)現(xiàn)實(shí)這些領(lǐng)域深度圖是我們理解物理世界三維結(jié)構(gòu)的基礎(chǔ)。無(wú)論是通過(guò)雙目立體匹配、結(jié)構(gòu)光還是ToF飛行時(shí)間相機(jī)我們最終得到的深度圖本質(zhì)上是一張記錄了每個(gè)像素點(diǎn)到相機(jī)距離的灰度圖。然而這張圖很少是完美的。如果你仔細(xì)觀察過(guò)一張未經(jīng)處理的深度圖大概率會(huì)發(fā)現(xiàn)其中散布著一些黑色的“窟窿”這些像素點(diǎn)沒有有效的深度值通常被標(biāo)記為0或者NaN。這就是我們常說(shuō)的“空洞”。這些空洞可不是圖像上的噪點(diǎn)那么簡(jiǎn)單它們直接對(duì)應(yīng)著三維空間中的信息缺失。想象一下你正在用深度攝像頭引導(dǎo)機(jī)械臂抓取一個(gè)零件如果零件表面的深度圖存在空洞機(jī)械臂的路徑規(guī)劃算法可能會(huì)“看”不到零件的某個(gè)關(guān)鍵部位導(dǎo)致抓取失敗甚至發(fā)生碰撞。在無(wú)人機(jī)避障場(chǎng)景中一個(gè)關(guān)鍵路徑上的深度空洞可能讓無(wú)人機(jī)誤判前方為可通行區(qū)域后果不堪設(shè)想。因此深度圖后處理中的空洞填充不是一個(gè)可選項(xiàng)而是一個(gè)必須解決的核心問題它的質(zhì)量直接決定了后續(xù)三維重建、避障、定位等任務(wù)的成敗??斩吹漠a(chǎn)生原因多種多樣理解它們是選擇正確填充方法的前提。最常見的原因包括鏡面反射和透明物體比如光滑的金屬表面、玻璃窗、水面它們會(huì)將投射過(guò)來(lái)的結(jié)構(gòu)光或激光圖案散射掉導(dǎo)致傳感器接收不到有效的返回信號(hào)。物體邊緣也是空洞的重災(zāi)區(qū)這是由于前景和背景在像素邊界處發(fā)生了深度不連續(xù)匹配算法難以確定邊緣像素到底屬于前景還是背景。此外傳感器本身的噪聲、低紋理區(qū)域如一面白墻導(dǎo)致的匹配困難以及超出量程物體太近或太遠(yuǎn)等情況都會(huì)產(chǎn)生空洞。所以當(dāng)我們談?wù)摗翱斩刺畛洹睍r(shí)我們的目標(biāo)不僅僅是把黑色的洞涂成灰色。我們的目標(biāo)是根據(jù)空洞周圍已知的有效深度像素以及可能結(jié)合的原彩色圖像信息合理地推斷出空洞區(qū)域應(yīng)有的深度值使得修復(fù)后的深度圖在幾何上連續(xù)、合理并且盡可能接近真實(shí)的三維表面。這是一個(gè)典型的“基于上下文信息進(jìn)行預(yù)測(cè)”的問題也是計(jì)算機(jī)視覺和圖像處理中的一個(gè)經(jīng)典且富有挑戰(zhàn)性的課題。2. 空洞填充的核心思路與算法選型面對(duì)一張布滿空洞的深度圖新手可能會(huì)想“直接用圖像修復(fù)Image Inpainting算法比如OpenCV里的cv2.inpaint不就行了嗎” 這是一個(gè)很自然的想法但往往效果不佳。原因在于普通圖像修復(fù)算法是為RGB彩色圖像設(shè)計(jì)的它修復(fù)的是顏色和紋理的連續(xù)性其底層假設(shè)是待修復(fù)區(qū)域與周圍區(qū)域在顏色和紋理上平滑過(guò)渡。然而深度圖承載的是幾何信息其數(shù)值代表距離變化往往是不連續(xù)的例如桌子的邊緣。盲目應(yīng)用圖像修復(fù)算法會(huì)導(dǎo)致物體邊緣被模糊前景和背景的深度被錯(cuò)誤地混合在一起在三維空間中會(huì)產(chǎn)生扭曲的表面。因此針對(duì)深度圖的空洞填充必須發(fā)展出專門的方法。這些方法大體上可以沿著兩個(gè)維度來(lái)分類一是是否利用額外的彩色RGB圖像信息二是算法的復(fù)雜度和原理。2.1 基于深度圖自身的濾波與擴(kuò)散方法這類方法只利用深度圖自身的信息通過(guò)濾波或建立能量函數(shù)進(jìn)行優(yōu)化來(lái)填充空洞。它們速度快適合實(shí)時(shí)性要求高的場(chǎng)景如機(jī)器人SLAM即時(shí)定位與地圖構(gòu)建。1. 形態(tài)學(xué)閉運(yùn)算與中值濾波組合拳這是最直接、最快速的工程化方法。思路很簡(jiǎn)單先用形態(tài)學(xué)閉運(yùn)算先膨脹后腐蝕來(lái)擴(kuò)張有效深度區(qū)域嘗試覆蓋掉一些小空洞然后再用中值濾波來(lái)平滑填充后的區(qū)域去除可能的椒鹽噪聲。import cv2 import numpy as np def fast_hole_filling(depth_map, kernel_size5): # 假設(shè)深度圖中無(wú)效值空洞為0 mask (depth_map 0).astype(np.uint8) * 255 # 1. 形態(tài)學(xué)閉運(yùn)算填充小洞 kernel cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (kernel_size, kernel_size)) closed cv2.morphologyEx(depth_map, cv2.MORPH_CLOSE, kernel) # 2. 中值濾波平滑同時(shí)保護(hù)邊緣相比均值濾波 filled cv2.medianBlur(closed, kernel_size) # 3. 只替換原始空洞區(qū)域的像素 result depth_map.copy() result[mask 255] filled[mask 255] return result注意這種方法非常粗暴會(huì)嚴(yán)重模糊物體的邊緣。它只適用于空洞非常小且分散或者對(duì)邊緣精度要求不高的背景區(qū)域填充。kernel_size的選擇是關(guān)鍵太大則過(guò)度平滑太小則填充不完整。2. 快速行進(jìn)法Fast Marching Method, FMM你可以把FMM想象成一次“洪水填充”。算法從空洞區(qū)域的邊界已知有效深度像素開始將這些點(diǎn)作為“波前”按照一定的速度向空洞內(nèi)部“蔓延”。蔓延的規(guī)則是深度值的變化盡可能平緩。這相當(dāng)于求解一個(gè)各向同性的擴(kuò)散方程。 OpenCV中的cv2.inpaint函數(shù)當(dāng)選擇INPAINT_TELEA方法時(shí)其核心就是FMM的一種實(shí)現(xiàn)。雖然前文說(shuō)不建議直接用但在深度變化平緩的大片區(qū)域如地面、墻面且結(jié)合了深度置信圖來(lái)調(diào)整擴(kuò)散速度時(shí)FMM可以取得不錯(cuò)的效果。關(guān)鍵在于我們需要一個(gè)“引導(dǎo)”告訴算法哪里該快哪里該慢。3. 基于加權(quán)最小二乘濾波的引導(dǎo)濾波這是更高級(jí)的一種濾波方法。其核心思想是將原始的、帶空洞的深度圖作為輸入同時(shí)生成一張“引導(dǎo)圖”。引導(dǎo)圖可以是同一視角的彩色圖像如果可用也可以是深度圖自身經(jīng)過(guò)簡(jiǎn)單處理后的版本。算法的目標(biāo)是讓輸出深度圖在結(jié)構(gòu)上貼近引導(dǎo)圖同時(shí)與輸入深度圖在有效像素處保持接近。 對(duì)于只有深度圖的情況我們可以用已填充部分通過(guò)簡(jiǎn)單方法初步填充作為引導(dǎo)。它的優(yōu)勢(shì)在于能更好地保持邊緣因?yàn)橐龑?dǎo)圖像中的邊緣信息會(huì)被遷移到深度圖中。OpenCV中也有相應(yīng)的實(shí)現(xiàn)cv2.ximgproc.guidedFilter但需要先將深度圖歸一化到0-1范圍處理無(wú)效值后。2.2 融合彩色圖像的聯(lián)合雙邊濾波與優(yōu)化方法當(dāng)我們可以同時(shí)獲取對(duì)齊的彩色圖像時(shí)解決問題的武器庫(kù)就豐富多了。彩色圖像提供了豐富的紋理和邊緣信息這正是深度圖所缺失的。1. 聯(lián)合雙邊濾波Joint Bilateral Filter這是雙邊濾波的升級(jí)版。標(biāo)準(zhǔn)雙邊濾波在平滑圖像時(shí)會(huì)考慮空間距離和像素值差異兩個(gè)權(quán)重從而保邊去噪。聯(lián)合雙邊濾波則將“像素值差異”這個(gè)權(quán)重計(jì)算從深度圖本身轉(zhuǎn)移到彩色引導(dǎo)圖上。 這意味著在填充深度空洞時(shí)算法會(huì)參考彩色圖像如果彩色圖像中兩個(gè)像素顏色相似那么它們的深度值也應(yīng)該更有可能相似如果顏色差異大比如物體邊緣則深度值也應(yīng)該允許有突變。這完美地利用了彩色圖像的邊緣信息來(lái)保持深度圖的邊緣。def joint_bilateral_fill(depth, color, mask, sigma_s10, sigma_c0.1): 簡(jiǎn)化的聯(lián)合雙邊濾波填充思路實(shí)際需使用滑動(dòng)窗口實(shí)現(xiàn) depth: 帶空洞的深度圖無(wú)效處為0 color: 對(duì)齊的彩色圖歸一化到[0,1] mask: 空洞掩膜1表示空洞 # 這是一個(gè)概念性代碼。實(shí)際需對(duì)每個(gè)空洞像素在其鄰域內(nèi)利用彩色圖計(jì)算權(quán)重進(jìn)行加權(quán)平均。 # 現(xiàn)有庫(kù)如OpenCV的cv2.ximgproc.jointBilateralFilter要求輸入是完整的不能直接處理空洞。 # 因此通常需要迭代或作為更大優(yōu)化框架的一部分。 pass實(shí)操心得聯(lián)合雙邊濾波效果的好壞極度依賴于深度圖與彩色圖的對(duì)齊精度。如果兩者存在哪怕幾個(gè)像素的未校正誤差就會(huì)導(dǎo)致邊緣錯(cuò)位反而引入錯(cuò)誤。在應(yīng)用前務(wù)必進(jìn)行精確的相機(jī)標(biāo)定和圖像配準(zhǔn)。2. 基于馬爾可夫隨機(jī)場(chǎng)MRF或條件隨機(jī)場(chǎng)CRF的全局優(yōu)化這是學(xué)術(shù)研究中更主流、效果也通常更好的方法。它將空洞填充問題建模為一個(gè)能量最小化問題。數(shù)據(jù)項(xiàng)要求填充后的深度圖在已知有效像素處其值應(yīng)盡可能接近觀測(cè)值。平滑項(xiàng)要求相鄰像素的深度值變化盡可能小。但這個(gè)“平滑”不是絕對(duì)的它可以通過(guò)彩色圖像來(lái)調(diào)制——在彩色圖像紋理豐富的區(qū)域可能對(duì)應(yīng)深度不連續(xù)允許更大的深度變化在顏色平滑的區(qū)域則強(qiáng)制深度也平滑。標(biāo)簽對(duì)于大空洞直接回歸深度值可能很難。有時(shí)會(huì)將其離散化為一系列可能的深度平面標(biāo)簽然后通過(guò)圖割Graph Cut或置信傳播Belief Propagation等算法為每個(gè)空洞像素選擇一個(gè)最優(yōu)的標(biāo)簽深度平面。這種方法能得到非常清晰、準(zhǔn)確的邊緣但計(jì)算復(fù)雜度高難以實(shí)時(shí)運(yùn)行。通常用于離線三維重建的后處理環(huán)節(jié)。2.3 基于深度學(xué)習(xí)的端到端填充近年來(lái)深度學(xué)習(xí)徹底改變了這個(gè)領(lǐng)域。研究者們?cè)O(shè)計(jì)了各種神經(jīng)網(wǎng)絡(luò)架構(gòu)如U-Net, GAN直接學(xué)習(xí)從“帶空洞的深度圖彩色圖”到“完整深度圖”的映射。這些模型在大型數(shù)據(jù)集如NYU Depth V2, ScanNet上訓(xùn)練能夠理解復(fù)雜的場(chǎng)景先驗(yàn)例如“椅子通常放在地板上”、“顯示器是平面的”等從而做出非常合理的預(yù)測(cè)。 深度學(xué)習(xí)方法的優(yōu)勢(shì)是效果強(qiáng)大能處理復(fù)雜的大面積空洞。劣勢(shì)是需要大量訓(xùn)練數(shù)據(jù)模型計(jì)算量大且可能存在在訓(xùn)練集分布外場(chǎng)景下的泛化問題。對(duì)于嵌入式設(shè)備或?qū)崟r(shí)系統(tǒng)模型輕量化是一個(gè)挑戰(zhàn)。算法選型決策指南面對(duì)一個(gè)具體項(xiàng)目如何選擇你可以參考這個(gè)簡(jiǎn)單的決策樹實(shí)時(shí)性要求極高且空洞很小- 選擇形態(tài)學(xué)中值濾波組合。這是很多實(shí)時(shí)SLAM系統(tǒng)里的默認(rèn)后處理步驟。有精確對(duì)齊的彩色圖對(duì)邊緣保持要求高允許一定計(jì)算開銷- 選擇聯(lián)合雙邊濾波或其變種。這是工業(yè)視覺檢測(cè)中非常實(shí)用的方法。追求最高質(zhì)量用于離線三維建模且計(jì)算資源充足- 研究并實(shí)現(xiàn)基于MRF/CRF的全局優(yōu)化方法或直接使用預(yù)訓(xùn)練的深度學(xué)習(xí)模型如果場(chǎng)景匹配??斩淳薮笄覉?chǎng)景復(fù)雜-深度學(xué)習(xí)模型是首選但需要評(píng)估其部署成本。3. 工程實(shí)踐一個(gè)融合多策略的魯棒填充流程在實(shí)際項(xiàng)目中尤其是像無(wú)人機(jī)視覺感知、機(jī)械臂抓取這類對(duì)魯棒性要求極高的場(chǎng)景單一算法往往力有未逮。我通常會(huì)采用一個(gè)分階段、多策略融合的流水線來(lái)處理。下面我以一個(gè)基于彩色引導(dǎo)的實(shí)時(shí)處理流程為例拆解其中的核心環(huán)節(jié)。3.1 輸入預(yù)處理與空洞掩膜生成第一步不是直接填充而是做好準(zhǔn)備工作。輸入的深度圖通常來(lái)自傳感器SDK我們需要將其轉(zhuǎn)換為標(biāo)準(zhǔn)的浮點(diǎn)型矩陣并統(tǒng)一無(wú)效值的表示例如將所有小于等于0的值設(shè)為NaN或一個(gè)特定標(biāo)志。import numpy as np def preprocess_depth(raw_depth, max_valid_distance10.0): 預(yù)處理原始深度圖。 raw_depth: 傳感器輸出的原始數(shù)據(jù)可能是uint16單位毫米。 max_valid_distance: 有效最大距離超出此值的視為無(wú)效。 # 轉(zhuǎn)換為米為單位的浮點(diǎn)數(shù) depth_float raw_depth.astype(np.float32) / 1000.0 # 生成有效掩膜通常在有效范圍內(nèi)且不為0 valid_mask (depth_float 0) (depth_float max_valid_distance) # 將無(wú)效區(qū)域設(shè)置為NaN便于后續(xù)處理 depth_float[~valid_mask] np.nan # 同時(shí)生成一個(gè)二值空洞掩膜1表示空洞/無(wú)效 hole_mask (~valid_mask).astype(np.uint8) return depth_float, hole_mask生成精確的hole_mask至關(guān)重要它決定了哪些區(qū)域需要被處理。有時(shí)傳感器會(huì)提供置信度圖可以將低置信度區(qū)域也納入hole_mask進(jìn)行弱填充。3.2 基于彩色圖像引導(dǎo)的快速初始填充我們假設(shè)已有經(jīng)過(guò)標(biāo)定和對(duì)齊的彩色圖像color_img。首先使用一個(gè)快速的基于圖像金字塔的填充方法獲取初始值。下采樣將深度圖和彩色圖下采樣到低分辨率。在小圖上空洞的相對(duì)面積變小簡(jiǎn)單的擴(kuò)散算法如快速行進(jìn)法能快速產(chǎn)生一個(gè)粗糙但全局合理的填充結(jié)果。上采樣與引導(dǎo)濾波將低分辨率填充結(jié)果上采樣回原尺寸。然后以原彩色圖像為引導(dǎo)圖對(duì)深度圖進(jìn)行一次引導(dǎo)濾波。這一步能利用彩色圖像的邊緣信息銳化在上采樣過(guò)程中模糊掉的邊界。import cv2 def guided_initial_fill(depth_with_holes, color_img, hole_mask, pyramid_levels2): 使用圖像金字塔和引導(dǎo)濾波進(jìn)行快速初始填充。 current_depth depth_with_holes.copy() current_color color_img.copy() current_mask hole_mask.copy() # 從粗到精的金字塔處理 for level in range(pyramid_levels, -1, -1): scale 1 / (2 ** level) if level pyramid_levels: # 上采樣上一層的深度結(jié)果作為本層的初始值 current_depth cv2.resize(current_depth, None, fx2, fy2, interpolationcv2.INTER_LINEAR) current_color cv2.resize(current_color, None, fx2, fy2, interpolationcv2.INTER_LINEAR) current_mask cv2.resize(current_mask, None, fx2, fy2, interpolationcv2.INTER_NEAREST) # 在本層級(jí)將已知深度值擴(kuò)散到空洞區(qū)域使用FMM # OpenCV的inpaint函數(shù)需要8位單通道圖我們需要?dú)w一化深度。 depth_normalized cv2.normalize(current_depth, None, 0, 255, cv2.NORM_MINMAX, dtypecv2.CV_8U) # 注意inpaint會(huì)修改所有區(qū)域我們只希望填充空洞。因此需要技巧。 # 更常見的做法是自定義擴(kuò)散這里為簡(jiǎn)化使用inpaint演示概念。 filled_normalized cv2.inpaint(depth_normalized, current_mask*255, inpaintRadius3, flagscv2.INPAINT_TELEA) current_depth cv2.normalize(filled_normalized, None, np.nanmin(current_depth), np.nanmax(current_depth), cv2.NORM_MINMAX, dtypecv2.CV_32F) # 使用彩色圖作為引導(dǎo)進(jìn)行聯(lián)合濾波這里用導(dǎo)向?yàn)V波近似聯(lián)合雙邊效果 if level 0: # 在最精細(xì)層可以跳過(guò)或使用更強(qiáng)的濾波 guide cv2.cvtColor(current_color, cv2.COLOR_BGR2GRAY).astype(np.float32) / 255.0 depth_to_filter current_depth.copy() depth_to_filter[np.isnan(depth_to_filter)] 0 # 導(dǎo)向?yàn)V波不能處理NaN需臨時(shí)處理 filtered_depth cv2.ximgproc.guidedFilter(guideguide, srcdepth_to_filter, radius5, eps0.01) # 只更新非空洞區(qū)域通常全圖濾波以保持一致性然后用原始有效值覆蓋。 valid_pixels ~np.isnan(depth_with_holes) # 原始有效像素 # 在非最精細(xì)層我們可以用濾波結(jié)果更新當(dāng)前深度 current_depth filtered_depth # 最后確保原始有效深度值不被修改 original_valid_mask ~np.isnan(depth_with_holes) current_depth[original_valid_mask] depth_with_holes[original_valid_mask] return current_depth這個(gè)流程能得到一個(gè)邊緣保持相對(duì)較好、大部分空洞已被合理填充的深度圖。但它仍然是局部運(yùn)算對(duì)于大面積連續(xù)空洞內(nèi)部可能不夠平滑或合理。3.3 針對(duì)大面積空洞的平面擬合與全局優(yōu)化對(duì)于由墻面、地面、桌面等大平面產(chǎn)生的空洞基于平面模型的擬合填充效果遠(yuǎn)好于基于像素?cái)U(kuò)散的方法??斩磪^(qū)域分割利用初始填充后的深度圖結(jié)合彩色圖像進(jìn)行超像素分割如SLIC算法或簡(jiǎn)單的區(qū)域生長(zhǎng)將連通的空洞區(qū)域以及其周圍的已知深度像素劃分成一個(gè)個(gè)“塊”。平面假設(shè)與擬合對(duì)于每個(gè)“塊”我們假設(shè)其對(duì)應(yīng)的三維表面是一個(gè)平面。利用該塊內(nèi)已知的有效深度像素通過(guò)最小二乘法擬合出一個(gè)三維平面方程ax by cz d 0??斩聪袼厣疃扔?jì)算對(duì)于該塊內(nèi)的每一個(gè)空洞像素已知其像素坐標(biāo)(u, v)通過(guò)相機(jī)內(nèi)參可以反投影出一條射線。計(jì)算這條射線與擬合出的三維平面的交點(diǎn)該交點(diǎn)的深度值即為該空洞像素的填充值。 這種方法特別適合室內(nèi)結(jié)構(gòu)化環(huán)境。對(duì)于彎曲的表面可以嘗試用二次曲面擬合但復(fù)雜度會(huì)增加。踩坑實(shí)錄平面擬合的關(guān)鍵在于正確分割區(qū)域。如果分割塊同時(shí)包含了前景物體和背景墻面例如在物體邊緣擬合出的平面將是錯(cuò)誤的導(dǎo)致填充結(jié)果產(chǎn)生嚴(yán)重的“拖尾”現(xiàn)象。務(wù)必結(jié)合彩色圖像的邊緣信息來(lái)約束分割過(guò)程或者使用RANSAC算法在擬合時(shí)剔除 outliers離群點(diǎn)即不屬于該平面的點(diǎn)。3.4 后處理邊緣銳化與噪聲抑制經(jīng)過(guò)上述步驟填充后深度圖在空洞區(qū)域與原始有效區(qū)域的交界處可能會(huì)因?yàn)闉V波而產(chǎn)生輕微的模糊。此外填充區(qū)域內(nèi)部也可能存在噪聲。邊緣銳化可以再次使用以小半徑、高方差參數(shù)運(yùn)行的聯(lián)合雙邊濾波或者使用各向異性擴(kuò)散濾波僅對(duì)填充區(qū)域內(nèi)部進(jìn)行輕微平滑同時(shí)強(qiáng)化由彩色圖像定義的邊緣。一致性檢查這是一個(gè)重要的后處理步驟。比較填充后的深度圖與原始深度圖在有效區(qū)域的值。由于填充過(guò)程的誤差可能會(huì)在邊界處對(duì)原始有效像素產(chǎn)生輕微污染。如果某個(gè)像素填充后的值與原始值差異超過(guò)閾值例如5%則優(yōu)先保留原始值。時(shí)域?yàn)V波針對(duì)視頻流對(duì)于無(wú)人機(jī)或機(jī)器人拍攝的連續(xù)深度圖幀可以利用時(shí)域信息。通過(guò)光流或視覺里程計(jì)跟蹤像素點(diǎn)對(duì)同一空間點(diǎn)在多幀中的深度估計(jì)進(jìn)行加權(quán)平均或卡爾曼濾波能顯著穩(wěn)定填充結(jié)果減少閃爍。4. 常見問題、調(diào)試技巧與效果評(píng)估在實(shí)際部署中你會(huì)遇到各種各樣的問題。下面我整理了一個(gè)問題排查清單和對(duì)應(yīng)的調(diào)試思路。問題現(xiàn)象可能原因排查與解決思路填充后物體邊緣出現(xiàn)“膨脹”或“腐蝕”形態(tài)學(xué)操作核過(guò)大或聯(lián)合雙邊濾波的空間權(quán)重sigma_s過(guò)大。減小濾波核尺寸。檢查深度圖與彩色圖的對(duì)齊誤差可能是標(biāo)定不準(zhǔn)導(dǎo)致邊緣引導(dǎo)錯(cuò)誤。大面積平面上的填充結(jié)果出現(xiàn)“水波紋”狀噪聲引導(dǎo)濾波的平滑系數(shù)eps過(guò)小或彩色圖像本身存在噪聲/紋理被過(guò)度引入深度圖。適當(dāng)增大eps值增強(qiáng)平滑。先對(duì)彩色圖像進(jìn)行輕度高斯模糊減少紋理干擾。平面擬合填充后不同平面交界處出現(xiàn)深度“階梯”不連續(xù)區(qū)域分割不準(zhǔn)確一個(gè)分割塊包含了來(lái)自不同平面的像素。使用更精細(xì)的超像素分割或引入邊緣檢測(cè)如彩色圖的Sobel邊緣作為分割的硬約束。填充區(qū)域與真實(shí)值存在系統(tǒng)性偏差整體偏深或偏淺平面擬合時(shí)使用的已知像素可能來(lái)自遮擋邊界深度本身不準(zhǔn)?;騻鞲衅鞔嬖谙到y(tǒng)性誤差未校正。嘗試從更遠(yuǎn)離空洞中心的區(qū)域選取已知像素進(jìn)行擬合。對(duì)原始深度圖進(jìn)行傳感器誤差標(biāo)定和校正。算法實(shí)時(shí)性不達(dá)標(biāo)使用了過(guò)于復(fù)雜的優(yōu)化算法如MRF或循環(huán)、迭代過(guò)多。優(yōu)化將算法移植到GPU上如使用CUDA實(shí)現(xiàn)聯(lián)合雙邊濾波。簡(jiǎn)化降低圖像分辨率進(jìn)行處理或減少金字塔層數(shù)。裁剪只對(duì)ROI感興趣區(qū)域如機(jī)械臂工作空間進(jìn)行高精度填充。處理后的深度圖在三維重建中仍有破洞填充置信度不足或填充值方差過(guò)大被后續(xù)的點(diǎn)云濾波步驟剔除。為每個(gè)填充的像素計(jì)算一個(gè)“置信度”例如基于周圍已知像素的距離、數(shù)量、顏色相似度。在生成點(diǎn)云時(shí)根據(jù)置信度進(jìn)行過(guò)濾或加權(quán)。效果評(píng)估在沒有真實(shí)值Ground Truth的情況下評(píng)估填充效果是主觀的。但我們可以通過(guò)一些間接方式三維可視化將填充前后的深度圖轉(zhuǎn)換為點(diǎn)云在MeshLab或CloudCompare中查看。好的填充應(yīng)該使物體表面連續(xù)、完整沒有明顯的凹陷或凸起。投影一致性如果有多視角數(shù)據(jù)可以將填充后的深度圖生成的網(wǎng)格投影到其他視角與對(duì)應(yīng)的彩色圖比對(duì)邊緣是否對(duì)齊。下游任務(wù)指標(biāo)最實(shí)際的評(píng)估是看下游任務(wù)的性能提升。例如在機(jī)械臂抓取任務(wù)中比較使用原始深度圖和填充后深度圖進(jìn)行抓取規(guī)劃的成功率在無(wú)人機(jī)避障中比較路徑規(guī)劃的平滑度和安全性。我個(gè)人在實(shí)際操作中的體會(huì)是沒有“銀彈”算法。一個(gè)魯棒的深度圖后處理模塊必然是一個(gè)精心設(shè)計(jì)的“流水線”里面包含了針對(duì)不同大小、不同類型空洞的多種處理策略并且有大量的參數(shù)需要根據(jù)你的具體傳感器和場(chǎng)景進(jìn)行微調(diào)。從簡(jiǎn)單的形態(tài)學(xué)操作開始逐步引入彩色引導(dǎo)和幾何先驗(yàn)是構(gòu)建這個(gè)系統(tǒng)最穩(wěn)妥的路徑。每次調(diào)試最好能保存中間結(jié)果并可視化這能幫你快速定位問題出在哪個(gè)環(huán)節(jié)。記住目標(biāo)不是追求學(xué)術(shù)上的最優(yōu)PSNR峰值信噪比而是讓填充后的深度圖能穩(wěn)定地服務(wù)于你的三維感知、定位或重建任務(wù)。