趣談條紋投影三維測量系統(三):演算法/編程瑣碎【完結】
這一篇的草稿居然是八個月前開始寫的,然而中途估計是遇到各種干擾:網路不暢、機器響應遲鈍等等,導致連編輯個公式也很吃力。加上業餘時間不夠用,於是就停工了,一直停留在最原始的草稿階段。現在想重新開工也很難找回八個月以前的思路了,草稿又太原始太瑣碎,難以成章。
乾脆將這篇寫成各種瑣碎雜燴,不求成文,但求終結這個話題。以後除非在工作中有新的相關項目或者創新,不然的話本文就是最後的掃尾文了。
套用Linus的觀點就是,Just for fun。
------------------------------------------------------------------------------------
1. Residue (留數vs殘留點)
二維相位展開可以看成從起始點向後繼點的線積分
其中C是連接到的任何路徑,是相位的梯度。
很明顯這種形式的積分不僅依賴於積分的起始點,一般也跟積分路徑C有關。
研究滿足哪些條件可以使得上式滿足路徑無關,就是相位展開研究的核心問題。
有電磁場背景知識的人可以自然聯想到利用梯度無旋的格林定理:
需要滿足:
如果相位以及其梯度滿足上述條件,相位展開就毫無挑戰了。
實際情況是,上述條件很難滿足。於是有兩個不同的解決辦法:
一是仔細挑選合適的積分路徑從而滿足上述條件。
二是用最小化方法滿足必要的條件。
1987年,Ghiglia,Mastin和Romero提出了這種相位非一致性。
1988年,Goldstein,Zebker和Werner將其命名為「殘留」(residue),恰好跟複變函數里的留數同名。他們提出,在相位展開時應該避開這些殘留點。通常的做法是將這些residues包圍起來不參與計算。這種處理手法,跟複變函數中對極值的處理手法如出一轍,簡直是相通的。
(原本下面有一些相位展開相關的經典公式,估計初稿時網路故障或瀏覽器問題,沒有編輯完,乾脆全部刪除。)
2. 加窗傅里葉變換(WFT)的OpenCV實現
之前用C#和EmguCV實現的加窗傅里葉變換一直有一個bug沒有調好,就是拿不到頻譜圖。看來需要系統地學一下C#,之前一直是邊用邊參考手冊。
這次用原生的OpenCV,才發現只有第一代是C語言編寫,2,3代都用C++了,於是順便複習下C/C++。參照Matlab源碼很快用C++也實現了,而且幾乎沒有bug很順利地就拿到了頻譜信息()。
編寫wft函數時,需要決定參數類型。對於我這種實現演算法用慣了Matlab的人來說,一時也確定不了哪種比較好。於是用float和double做了下實驗:至少在這個例子里,float比double快了差不多一倍,而結果並無差異。可能是這個操作系統上的double存儲空間比float多一倍吧。double類型8秒鐘,float類型4秒多鍾拿到結果,居然並不比Matlab快多少。看來還有很多細節沒有照顧到,比如應用自帶dft函數前作一下padding等等。需要有空餘時間再微調一下。能拿到完整的結果,我已經比較滿意了。------------------------------------------------------------------------------------
完結小記:整個話題的緣起就是因為要主導一個條紋投影3D測量系統的項目。原定負責人是一個做圖像處理但沒有光學背景的博士,毫無進展也無頭緒。於是我就硬著頭皮接手了這個項目,當時我還在做激光衍射測量應變的項目。這個條紋投影完全是應急救火之作,硬著頭皮看了幾本教材和無數paper,居然成功做出來了,我也沒更高的期望了。此外,在整個項目過程中忙裡偷閒學習了一些演算法,複習加強了C/C++/C#以及OpenCV,EmguCV,收穫的知識和樂趣也是很充足感的。
順便推薦一下看過的教材里比較欣賞的兩本:
一本是二維相位展開的完整理論、演算法和軟體實現,另一本是加窗條紋分析的專著。
推薦閱讀:
※如果激光能形成肉眼可見的光線,需要多大的功率?
※通俗易懂的解釋一下電子透鏡、電子顯微鏡的原理及簡單應用?
※二代三代夜視儀為什麼那麼貴?
TAG:傅里叶变换FourierTransform | 图像处理 | 光学 |