人眼在世界中需要對焦才能看清楚相應的東西,看半米的距離需要對焦到半米,看五百米的距離需要對焦到五百米,那麼能否在一個半米距離的平面上製造一個圖像,使人眼對焦到半米的時候模糊,人眼對焦到五百米的時候清晰呢?
長時間看電腦會近視,因為總是對焦到屏幕上,那麼能不能在屏幕上模擬出對焦五百米或其他距離後才能看清的圖像,從而讓眼睛在對焦上有運動,用這個原理開發個緩解近視的軟體之類的?
從另一個角度說,能不能在顯示器上顯示這樣的圖像,讓近視的人可以摘掉眼鏡也能看清原本清晰的圖像呢?
鴨哥 @grapeot 已經寫了一個很好的答案了,不過對背後的原理講得還不夠詳細,我這裡補充一下。
有幾個問題是有助於思考背後的原理的,也是原先鴨哥的答案裏沒有詳細解釋的,我先放到前面:
- 有比梯度下降來迭代求解更好的解法嗎?
- 為什麼會有 ringing 現象?為什麼要加 regularizer?為什麼這樣加?
- 為什麼特殊設計的小孔是那種樣子的?怎麼設計出來的?
正如鴨哥答案裏寫的,成像的過程可以近似成一個【原始圖像】與【點擴散函數】卷積的過程,比如我這麼表示一下:
原圖 ? 點擴散函數 = 新圖
如果這裡【原圖】是一張清晰的圖,點擴散函數是離焦彌散圓,那麼【新圖】就是一張虛焦的模糊不清的圖——這就是通常的虛焦成像的過程。
而這裡我們要做的事情,其實是反過來的,【原圖】暫時未知,但我們知道它經過這樣的卷積過程,得到了一張【清晰的新圖】,這個過程我們可以這麼來表示一下:
?? ? 點擴散函數 = 清晰的圖
我們要把上面這個 ?? 給求出來。
如果這是一個傳統的乘法,比如 ?? × 5 = 12,那麼我們只要做一個對應的「逆運算」——也就是做一下除法,就能算出 ?? 的值了:?? = 12 ÷ 5 = 2.4;當然我們可以用更高級的說法,叫「求取 5 的乘法逆元」,5 的乘法逆元是 1/5,於是又可以寫成:?? = 12 × 1/5 = 2.4
如果卷積也有逆運算,那麼我們只要求出「點擴散函數的卷積逆元」,那麼就可以求出 ?? 代表的原始圖像:
?? = 清晰的圖 ? 點擴散函數的卷積逆元
如果數學功底紮實一點就會知道,空域上的卷積等價於頻域上的乘法,於是上面這個運算過程,可以通過傅裏葉變換,轉換成乘除法操作。這個「點擴散函數的卷積逆元」,也無非就是在傅裏葉頻率域做一個除法操作了。
所以第一個問題的答案就很直接了:用傅裏葉變換就可以了,快好幾個數量級。
如果你真的試一試就會發現,不論是鴨哥原先的梯度下降迭代求解,還是通過傅裏葉變換來直接求解,最後都會有 ringing 現象。不僅有 ringing,甚至如果中間計算過程不多加小心,結果會變成一片隨機雜訊。
為什麼?
因為【直接算卷積的逆運算】這個過程,是不穩定的。
舉例來說,如果有一個計算過程,輸入數據由於雜訊的影響,波動了 0.1,輸出數據也波動了 0.1,那就是穩定的;如果輸出數據時而波動 0.1,時而波動 100,那就是不穩定的。【直接算卷積的逆運算】這個過程,就是不穩定的,會有機會極大放大雜訊。
為什麼會不穩定?
我以一維的信號為例來簡單說明一下問題,這是一個一維的卷積核,來模擬相機的離焦彌散圓: