官方檔案翻譯
-
名稱: photometric_stereo -- 通過光度立體技術重建表面,
-
簽名: photometric_stereo(Images : HeightField, Gradient, Albedo : Slants, Tilts, ResultType, ReconstructionMethod, GenParamName, GenParamValue : )
-
描述:
photometric_stereo可以用來從一個物體的兩維紋理,例如它的列印照片,來區分出它的三維形狀,這個算子需要至少需要三張使用已知的不同方向的光源拍攝的相同物體的影像,注意,拍攝這些照片時,相機的視角應該是固定的,(譯者注:即固定相機和物體,從多個已知的不同方向打光拍攝)
物體的這種三維形狀從根本上來說是通過計算3維表面的區域梯度,這些梯度可以被進一步綜合起來獲取到一個高度場,也就是說,一張圖片的每個像素都與一個相對高度相關聯,(譯者注:計算得出的)二維的紋理被稱為反照率,與對區域光源的吸收和反射表面特征有關,把所有的陰影都排除在外,-
光照立體法的典型應用
光照立體法的典型應用是用來檢測表面的變化,這種變化可能意味著缺陷,或者被用來將拍照時光照角度的影響排除在外,例如用于非扁平字符的列印檢查,注意,光度立體法不適用于重建絕對高度,也就是說,它不能替代傳統的3D重建演算法,如對焦測距和激光三角測量, -
光度立體法的局限性
光度立體法是基于Woodham演算法,因此假設相機表現為無畸變的投影,這也就意味著,你必須使用一個遠心鏡頭或者長焦鏡頭,另一方面,它假設了每個光源發出的都是平行的等截面的光,這也就是說,你使用的照明必須是遠心光源,有著均勻的強度,或者作為替代,遠距離的點光源,此外,這個物體必須有朗伯反射特性,也就是說它對光的反射是漫反射,有鏡面反射的物體或者區域(鏡子或者光滑的表面)不能被正確處理,會得到一個錯誤的結果, -
照片采集設定
這個使用遠心鏡頭的相機必須被放置得和被重建的平面正交,即互相垂直,相機和平面的角度在采集程序中一定不能改變,相反,光源和平面的夾角必須至少改變三次來獲取三張灰度圖片, -
具體說明光照的角度
對每張圖片,光線的方向用兩個角度來表示,使用引數Slants和Tilts,這兩個引數描述了光線和平面的方向,來理解一下這兩個引數,記住,光源被假設發出的是平行光,照相機有一個遠心鏡頭,相機被放置在重建表面的正交方向,-
Slants
這個角度指的是相機的光軸和光線的夾角,如圖:

-
Tilts
這個角度使用物體平面或者其他與之平行的平面,例如圖片表面來進行測量,特別的,它描述了圖片中心點向右延伸和光線方向投影到平面上的夾角,也即,當在看圖片或者相關的平面時,一個0度的角意味著光從右邊來,90度意味著光從頂上來,180度意味著光從左邊來,等等,如圖:

正如之前所說的,光度立體法需要至少三張光線不同情況下拍攝的照片,然而,一個三維的幾何體通常會有陰影,在陰影區域,光線有效方向的數量(the number of effectively available directions of illumination)被削減了,這會導致不明確(譯者注:ambiguities?模棱兩可?),盡管如此,獲取一個魯棒性好的結果,贅余是需要的,因此,通常會使用超過三個不同方向的光源,但是記住,光線方向的增加,會導致更多的圖片需要被處理,因此需要花費更多的處理時間,在絕大多數應用中,4-6個光源是合理的,根據經驗法則,slant角度會在30°-60°之間選擇,Tilt角度通常會均等得分布在被測物體的周圍,請記住,光線的角度必須是經過選擇的,以使得他們(譯者注:他們是指?)能夠不在同一平面上(即:光線的方向必須是獨立的),否則,計算會失敗,程式會拋出一個例外,
-
-
輸入圖片和定義的區域
圖片必須以一個圖片陣列輸入,如前所述:每張圖片必須是使用不同的光線角度的,如果圖片是通過存盤在多通道圖片中的,通過image_to_channels可以容易地轉換為圖片陣列,作為替代,圖片陣列可以通過concat_obj來創建,
光度立體法依賴于對光度測定資訊的評估,也就是存盤在影像中的灰度值,因此,這些資訊應當是無偏并且是準確的,我們建議保證用來采集影像的相機有線性特征,如果有非線性特征,你可以使用算子radiometric_self_calibration來測定你的相機的特征,使用lut_trans來校正灰度資訊,此外,如果需要精確的測量,我們建議運用相機的全動態范圍,因為這可以獲得更精確的灰度資訊,為了相同的原因,使用高于8位深度(bit-depth)的影像(例如:使用uint2的影像(譯者注:灰度范圍0~65535)而不是byte(0~255)型別的影像)可以帶來更高的準確率,
輸入影像的定義域決定了內部會使用哪一種演算法來處理影像,有三種可用的演算法:
* 如果整個影像都是定義域(譯者注:可以理解為這張圖的每個像素點都有灰度值),會使用最快的演算法,這被推薦使用在大多數的應用中,
* 如果輸入的影像共享了相同的削減過的定義域,只有定義域內的像素會被處理,這種模式會被用來排除影像上的某些區域,通常的,已知顯示出非朗伯反射特性或者不感興趣的區域會被排除,例如表面的孔洞,(譯者注:每張圖的定義域都是相同的)
* 如果提供了包含清晰定義域的影像,每張影像上包含在范圍內的灰度值會被使用,只有在三張影像上擁有獨立的slant和tilt角度的像素會被處理(譯者注:?only those pixels are processed that have independent slant and tilt angles in at least three images),這種模式在某些情況下是合適的,例如在影像處理時排除個別影像上的特別的區域,這些區域可能是已知的表現出非朗伯反射特性的區域或者包含了偏光資訊的區域,例如影子,排除這些點可以導致更準確的結果,請注意,最后一種模式與前兩種相比,顯著需要更多的處理時間,(譯者注:這種情況下每張圖片的定義域都有可能不同) -
輸出圖片
這個算子輸出了重建影像的梯度,反射率,和表面的高度場影像,
* 梯度影像是一個向量場,包含了表面的偏導數,記住,梯度可以被用作算子reconstruct_height_field_from_gradient的輸入引數,為了更直觀的目的,替代表面梯度,可以回傳標準化之后的表面梯度,為了達到這樣的目的,'ResulltType' 必須被設定為normalized_gradient而不是gradient,這里,行和列元素代表了標準化之后的行和列,如果ResultType被設定為了all,就會使用gradient而不是normalized_gradient,
* 反射率影像描述了反射輻射和入射輻射的比例,數值在1(白色表面)-0(黑色表面)之間,因此,反射率是表面的一個特征,舉個例子,對一個印刷表面來說,反射率與把所有入射光排除在外(陰影,明暗)的印刷圖片有關,
* 高度場影像的每個像素與相對高度相關,
默認情況下,上面這些物件都會回傳,也就是說,引數
ResultType設定為all,在只需要某些結果的情況下,這個引數可以設定為陣列,僅將一些需要的值放在其中,可以放的值有'gradient', 'albedo', 和 'height_field',記住,在特定的應用中,像表面檢測任務,只有梯度和反射率影像是有需要的,這里,不構建高度場影像可以顯著得增快重建的速度,
記住,在光度立體法內部,最先計算出梯度值,如果有需要,結合這些值來獲取高度場,這個結合操作與reconstruct_height_field_from_gradient使用的是相同的演算法,他們可以通過引數ReconstructionMethod, GenParamName, 和 GenParamValue進行控制,請參閱reconstruct_height_field_from_gradient的幫助來獲取更多關于這些引數的資訊,如果ResultType中沒有height_field,那么這幾個引數會被忽略, -
-
注意
photometric_stereo基于方形像素的假定,此外,它假定在物體空間內,高度在步幅是1的格子上計算出來的,如果不是這種情況,相機的像素投射到物體表面不是1,回傳的高度場必須乘上實際的步長(像素尺寸投射都物體空間的值),像素在物體空間的尺寸通過相機中的像素尺寸除以被鏡頭放大的倍數得到, -
執行資訊
- 多執行緒型別:可重入(可以和非排他性算子并行運行)
- 多執行緒作用域:全域(可能在任意執行緒中呼叫)
- 在內部資料層級上自動并行處理
-
引數
略, -
結果
如果引數是有效的,回傳2,如果有必要,會拋出例外, -
可能的前調函式
optimize_fft_speed -
所屬模塊
三維計量
圖片來源于官方檔案
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/6667.html
標籤:其他
下一篇:開源:從社區到商業化
