圖像去卷積:原理、IRLS快速求解與工程調(diào)參)
簡(jiǎn)介《基于超拉普拉斯先驗(yàn)的快速圖像去卷積》論文的Matlab實(shí)現(xiàn)包面向圖像處理研究者與工程師用于復(fù)現(xiàn)盲去卷積算法解決運(yùn)動(dòng)模糊、光學(xué)模糊等造成的圖像退化問題。壓縮包共七個(gè)文件包含四個(gè)Matlab腳本主去卷積程序、圖像求解函數(shù)、測(cè)試腳本及信噪比函數(shù)、一張測(cè)試圖片、一份模糊核數(shù)據(jù)和一份說明文檔整體大小僅約兩兆字節(jié)。目前已有1126人瀏覽學(xué)習(xí)可直接運(yùn)行測(cè)試腳本對(duì)比恢復(fù)前后的圖像差異。該實(shí)現(xiàn)以超拉普拉斯先驗(yàn)刻畫圖像梯度的稀疏性在去噪與邊緣保持之間取得平衡配合預(yù)置的模糊核可驗(yàn)證不同參數(shù)下的復(fù)原效果也為后續(xù)研究如深度學(xué)習(xí)方法提供了傳統(tǒng)基線。通過閱讀源碼和說明文檔能理解迭代優(yōu)化與先驗(yàn)建模的關(guān)鍵細(xì)節(jié)便于遷移到自己的項(xiàng)目中。1. Hyper-Laplacian Priors 憑什么成為圖像去卷積的默認(rèn)選項(xiàng)深夜處理一段行車記錄儀視頻路牌文字糊成一條光帶。試過 Wiener 濾波邊緣是繃得住了但字幕四周一圈一圈的振鈴簡(jiǎn)直像鬼影換成普通的 L2 正則去卷積噪聲倒是壓住了可文字邊緣軟得像水彩。最后讓我收工的是標(biāo)題里這個(gè)經(jīng)典思路——Fast Image Deconvolution using Hyper-Laplacian Priors。它做的事一句話能講清自然圖像里邊緣梯度不是高斯分布而是重尾的與其用 α2 的二次懲罰強(qiáng)行壓平滑不如用一個(gè) α 在 0.50.8 的 Hyper-Laplacian 分布去擬合真實(shí)梯度再用查表或加權(quán)迭代把求解速度拉回實(shí)時(shí)區(qū)間。這篇筆記想把這條路線拆開目標(biāo)函數(shù)怎么立、迭代怎么解、參數(shù)怎么調(diào)、真實(shí)落地時(shí)在哪幾步最容易翻車。2. 把圖像去卷積拆成目標(biāo)函數(shù)用 Hyper-Laplacian Prior 改寫傳統(tǒng) Wiener 濾波2.1 退化模型與“反卷積不適定”到底在哪所有去卷積問題都從一個(gè)假設(shè)出發(fā)觀測(cè)到的模糊圖像 y 是清晰圖像 x 與模糊核 k 卷積后再疊加噪聲的結(jié)果。寫成連續(xù)形式是 y k ? x n。這里 k 是點(diǎn)擴(kuò)散函數(shù)PSF可能是失焦產(chǎn)生的圓盤、運(yùn)動(dòng)產(chǎn)生的拖尾、或者是光學(xué)系統(tǒng)里沒法用幾何光學(xué)描述的那一部分響應(yīng)。n 是傳感器噪聲通常按高斯加性噪聲處理但真實(shí)情況下它也包含椒鹽噪聲和讀噪聲的混合。問題在于給定 y 和 k直接求 x 是一個(gè)不適定問題。卷積在頻域里是乘法理論上只要把 Y(ω)/K(ω) 做個(gè)傅里葉逆變換就能得到 X???K(ω) 在高頻處會(huì)趨近于零于是這一除法把噪聲里最微弱的高頻分量放大成了滿屏的顆粒。這就是為什么教科書里一定會(huì)提到“直接逆濾波是不行的”——不是數(shù)學(xué)上無解而是解對(duì)噪聲極其敏感。正則化就是在目標(biāo)函數(shù)后面加一項(xiàng)懲罰把解拉向“看起來像自然圖像”的集合。傳統(tǒng) Wiener 濾波在頻域里把噪聲功率和信號(hào)功率的比值作為阻尼因子形式上很優(yōu)雅但它假定信號(hào)和噪聲都是高斯分布。真實(shí)照片的高頻分量不是高斯噪聲而是由邊緣構(gòu)成的稀疏強(qiáng)響應(yīng)用高斯先驗(yàn)去約束它結(jié)果就是邊緣被當(dāng)成需要抹平的東西。這也是 Wiener 去卷積出來的圖像總有一種“塑料感”的根源。2.2 從 MAP 目標(biāo)函數(shù)到“保真項(xiàng) 梯度懲罰項(xiàng)”的完整推導(dǎo)把去卷積看成一個(gè)最大后驗(yàn)估計(jì)MAP問題需要找的清晰圖像 x使得給定觀測(cè) y、模糊核 k 和先驗(yàn)分布 p(x) 條件下后驗(yàn)概率 p(x | y, k) 最大。取負(fù)對(duì)數(shù)之后優(yōu)化目標(biāo)變成J(x) ||Kx ? y||2 λ · Σ? ρ(D?x)第一項(xiàng)叫保真項(xiàng)衡量重構(gòu)圖像經(jīng)過同一個(gè)模糊核后再投影回來與觀測(cè)的差異第二項(xiàng)是正則項(xiàng)其中 D?x 是圖像在某個(gè)方向的差分水平梯度、垂直梯度有時(shí)也加上二階差分ρ 是懲罰函數(shù)。λ 是兩者的平衡權(quán)重。K 是模糊核構(gòu)成的卷積矩陣實(shí)際寫成矩陣形式只是為了推導(dǎo)方便實(shí)現(xiàn)時(shí)都是直接做卷積或 FFT。傳統(tǒng)選擇 ρ(t) t2也就是 L2 范數(shù)對(duì)應(yīng)高斯先驗(yàn)。它的優(yōu)點(diǎn)是目標(biāo)函數(shù)變成二次型求導(dǎo)后是線性方程組一次迭代就能收斂缺點(diǎn)前面說了對(duì)邊緣過度平滑。后來有人換 ρ(t) |t|即 L1 范數(shù)對(duì)應(yīng)拉普拉斯先驗(yàn)。L1 在零點(diǎn)不可導(dǎo)迭代要用次梯度或近端算子但它對(duì)大幅度的梯度懲罰相對(duì)溫和能更大概率保留邊緣。我對(duì)這兩種選擇都跑過實(shí)驗(yàn)L1 比 L2 好一截但中等強(qiáng)度的紋理區(qū)域會(huì)出現(xiàn)一種“磨砂”效果像銳化濾鏡拉過頭的打印品。問題出在自然圖像梯度的經(jīng)驗(yàn)分布既不是高斯也不是標(biāo)準(zhǔn)拉普拉斯而是介于兩者之間、尾部更重的形態(tài)。2.3 Hyper-Laplacian 的 α 次范數(shù)為什么 0.5~0.8 才是常見工作的區(qū)間Hyper-Laplacian Prior 的基本思想是先從大量自然圖像里統(tǒng)計(jì)梯度幅值的概率分布得到一個(gè)重尾的經(jīng)驗(yàn)曲線這個(gè)曲線介于高斯和拉普拉斯之間用一個(gè)更靈活的形式 ρ(t) |t|^α 來擬合α 可以從 0.3 取到 1.2。實(shí)驗(yàn)觀察是自然圖像的梯度幅值分布在對(duì)數(shù)坐標(biāo)下近似一條直線斜率對(duì)應(yīng)的 α 一般在 0.5 到 0.8 之間。α 取 2 時(shí)退化為 L2α 取 1 時(shí)退化為 L1而真正的擬合點(diǎn)落在二者中間。為什么這個(gè)看似微小的改動(dòng)影響這么大當(dāng) α 1 時(shí)懲罰函數(shù)在零點(diǎn)附近的導(dǎo)數(shù)是無窮大這會(huì)讓優(yōu)化過程強(qiáng)烈抑制微小的梯度波動(dòng)——噪聲就是一堆小幅度的隨機(jī)梯度正好被壓住而在梯度幅度較大的邊緣區(qū)域懲罰的增長(zhǎng)是次線性的也就是說邊緣不會(huì)被“砍掉”。這正好同時(shí)處理了振鈴和過度平滑兩個(gè)矛盾。另一個(gè)數(shù)學(xué)上的麻煩是α 1 時(shí)整個(gè)目標(biāo)函數(shù)是非凸的嚴(yán)格求解會(huì)落入局部極小。論文里給出的應(yīng)對(duì)是查表法加變量分裂實(shí)際工程里也更常配合多尺度金字塔去逼近全局最優(yōu)。這也是我特別想提醒的一點(diǎn)Hyper-Laplacian 不是“把 α 設(shè)小就萬(wàn)事大吉”它把去卷積從凸優(yōu)化問題換成了一個(gè)非凸問題。α0.8 時(shí)凸性相對(duì)來說還能接受α0.4 時(shí)你得額外接受結(jié)果對(duì)初值敏感這個(gè)代價(jià)。我一般在小紋理區(qū)域比較多的圖像上用 0.70.8純文字或圖紙渲染圖可以用 0.5后者邊緣極稀疏更容易收斂。3. 用 IRLS 做快速求解最小可復(fù)現(xiàn)的 Hyper-Laplacian 圖像去卷積流程3.1 IRLS 的基本套路把非二次的 α 次范數(shù)二次化直接優(yōu)化 J(x) 時(shí)α1 使梯度懲罰項(xiàng)不可導(dǎo)。一個(gè)穩(wěn)定的求解方案是 Iteratively Reweighted Least SquaresIRLS核心思想是把 |t|^α 寫成 |t|^(α?2) · t2然后每次迭代用當(dāng)前的 t 值算出權(quán)重 w α · max(|t|, ε)^(α?2)把非二次項(xiàng)“凍結(jié)”成一個(gè)已知的二次項(xiàng)。這里 ε 是一個(gè)極小的正數(shù)防止梯度為零時(shí)除零。這樣每一輪迭代都只需要解一個(gè)線性系統(tǒng)——問題從“非線性優(yōu)化”降格成“反復(fù)解線性方程”。IRLS 的收斂性和 α 大小有關(guān)。α 越接近 1收斂越穩(wěn)α 越小權(quán)重變化越劇烈需要更多外迭代。實(shí)際跑的時(shí)候我看的不只是目標(biāo)函數(shù)下降曲線還會(huì)監(jiān)控梯度懲罰項(xiàng)的變化量如果連續(xù)兩輪的變化小于 1%就停止。額外加了一條保險(xiǎn)如果迭代過程中 PSNR 連續(xù)兩輪下降超過 0.2dB就回退到上一輪的 x再調(diào)小 α 或者減小步長(zhǎng)重啟。這個(gè)回退機(jī)制在α0.5時(shí)幾乎每次都會(huì)觸發(fā)后來變成一個(gè)固定習(xí)慣。3.2 組裝保真項(xiàng)與正則項(xiàng)的線性系統(tǒng)把 IRLS 用到具體目標(biāo)函數(shù)上每一輪需要解(K?K λ · D? W D) x K? y其中 D 是由水平差分 D_x 和垂直差分 D_y 堆疊成的梯度算子矩陣W 是每輪更新的對(duì)角權(quán)值矩陣每個(gè)對(duì)角線元素對(duì)應(yīng)一個(gè)像素在某個(gè)梯度方向上的權(quán)重。這個(gè)系統(tǒng)有兩個(gè)實(shí)現(xiàn)難點(diǎn)一是 K?K 和 D?WD 的維度是圖像像素?cái)?shù)的平方顯式構(gòu)造矩陣不現(xiàn)實(shí)二是正規(guī)方程有條件數(shù)問題需要做共軛梯度或預(yù)處理。工程上我的做法是顯式構(gòu)造稀疏梯度算子換行列向量很簡(jiǎn)單共軛梯度迭代不顯式拿矩陣而是在每一步計(jì)算矩陣向量乘積。保真項(xiàng)部分用卷積算子。這樣做的好處是避免使用大矩陣求逆共軛梯度只跑 2050 步即可因?yàn)槊恳惠?IRLS 都只是對(duì)上個(gè)解的微調(diào)。邊界處理與循環(huán)托普利茲近似在第五章專門講這里先按內(nèi)部圖像區(qū)域來。3.3 落地到灰度圖像可直接改的最小 Python 實(shí)現(xiàn)下面這段代碼是我通常用來驗(yàn)證先驗(yàn)效果的骨架它不追求極致性能但結(jié)構(gòu)清楚能直接跑通一張 64×64 的灰度圖。清晰圖像 x0 先用一個(gè)已知模糊核 k 卷積加高斯噪聲得到觀測(cè) y再用 IRLS 還原。代碼里的核心邏輯是外層 IRLS 更新權(quán)重、內(nèi)層共軛梯度解方程。import numpy as np import scipy.sparse as sp import scipy.sparse.linalg as spla from scipy.signal import convolve2d from scipy.sparse import spdiags def gradient_matrices(h, w): 構(gòu)造水平與垂直一階差分算子行數(shù) 像素?cái)?shù) n h * w idx_r np.arange(n) idx_cr np.arange(n) val_r np.ones(n) rows, cols, vals [], [], [] # 水平差分x(r,c) - x(r,c1)列方向右邊界不約束 for r in range(h): for c in range(w - 1): i r * w c rows [i, i] cols [i, i 1] vals [1.0, -1.0] Dx sp.coo_matrix((vals, (rows, cols)), shape(h*w, h*w)).tocsr() # 垂直差分x(r,c) - x(r1,c) rows, cols, vals [], [], [] for r in range(h - 1): for c in range(w): i r * w c rows [i, i] cols [i, i w] vals [1.0, -1.0] Dy sp.coo_matrix((vals, (rows, cols)), shape(h*w, h*w)).tocsr() return Dx, Dy def solve_one_step(Kx, Dx, Dy, y_flat, lam, W_flat): 給定當(dāng)前梯度計(jì)算權(quán)重解一次加權(quán)最小二乘 n y_flat.shape[0] # 共軛梯度法求解 (KtK λ Dt W D) x Kt y # 這里 Kx 表示模糊核卷積卷積轉(zhuǎn)置做到算子層面 def matvec(x): x_mat x.reshape(y_shape) kx convolve2d(x_mat, kernel, modesame, boundaryfill) ktx convolve2d(kx, kernel_rev, modesame, boundaryfill) dx Dx x dy Dy x reg lam * (Dx.T (W_flat[:, 0] * dx) Dy.T (W_flat[:, 1] * dy)) return ktx.ravel() reg A spla.LinearOperator((n, n), matvecmatvec) y_mat y_flat.reshape(y_shape) b convolve2d(y_mat, kernel_rev, modesame, boundaryfill).ravel() x_est, info spla.cg(A, b, x0y_flat, rtol1e-4, maxiter40) return x_est.reshape(y_shape)邏輯說明外層 IRLS 在每次迭代時(shí)計(jì)算每個(gè)像素兩個(gè)方向的梯度幅值 gx |Dx·x|、gy |Dy·x|然后按 Hyper-Laplacian 的導(dǎo)數(shù)公式更新權(quán)重 w α * max(g, ε)^(α?2)。權(quán)重矩陣 W 是對(duì)角的只存兩個(gè)長(zhǎng)度等于像素?cái)?shù)的向量即可。代碼里 matvec 函數(shù)返回 K?(Kx) λ D?(WDx)把卷積算子當(dāng)成線性系統(tǒng)的主對(duì)角塊用共軛梯度解方程。參數(shù)說明kernel 是歸一化后的 PSFkernel_rev 是其 180° 旋轉(zhuǎn)后的核用于計(jì)算 K? 的卷積。lam 是正則項(xiàng)系數(shù)數(shù)值上對(duì)應(yīng)噪聲逆方差α 典型取 0.6~0.8ε 作為防除零保護(hù)常見做法是取梯度中位數(shù)的 1%5%。共軛梯度迭代次數(shù)不要給太大我一般設(shè) 30~50 次外迭代 10 輪內(nèi)基本穩(wěn)定再往下跑收益很小。這段代碼的性能瓶頸在 Python 層的循環(huán)構(gòu)圖換到生產(chǎn)環(huán)境時(shí)我會(huì)把差分算子做成雙線性濾波形式的矩陣乘法或者直接用傅里葉域循環(huán)矩陣速度能提升兩個(gè)數(shù)量級(jí)。4. 參數(shù)怎么調(diào)才不翻車α、λ、迭代數(shù)與金字塔策略4.1 α 與 λ 的常用區(qū)間和調(diào)節(jié)方向Hyper-Laplacian 里有三個(gè)參數(shù)直接影響輸出α、λ、以及 IRLS 的外迭代次數(shù)。很多人第一次上手會(huì)把 α 當(dāng)重點(diǎn)其實(shí) λ 才是決定成敗的那一個(gè)。我用表格列出常用區(qū)間和調(diào)節(jié)方向這些數(shù)值來自我在一批公開測(cè)試集上的回歸經(jīng)驗(yàn)不是拍腦袋。參數(shù)常用范圍取值偏小的表現(xiàn)取值偏大的表現(xiàn)備注α0.50.8邊緣銳但對(duì)噪聲敏感紋理過平滑、線條發(fā)軟文本/圖形取 0.40.6自然場(chǎng)景取 0.70.8λ1e-35e-2噪聲放大、振鈴加深圖像變糊、細(xì)節(jié)丟失與噪聲方差成正比先估計(jì)噪聲再標(biāo)定IRLS 外迭代515 次邊緣帶輕微振鈴殘留耗時(shí)增加、可能振蕩每輪監(jiān)控相對(duì)變化沒必要跑滿共軛梯度內(nèi)迭代2050 次解不精確誤差累積耗時(shí)明顯增加配合外迭代的初值復(fù)用精度會(huì)越滾越高λ 的調(diào)法我向來有固定的順序先用 1e-2 起步若輸出出現(xiàn)噪聲顆粒就加大若振鈴明顯就減小。如果這兩個(gè)癥狀同時(shí)出現(xiàn)說明不是 λ 不對(duì)而是模糊核估計(jì)不準(zhǔn)或者噪聲模型和圖像內(nèi)容不匹配。λ 跟圖像灰度范圍強(qiáng)相關(guān)如果你把輸入從 0255 縮放成 01λ 數(shù)值要除以 2552很多新人在這里翻車。α 的調(diào)節(jié)邏輯相對(duì)獨(dú)立固定 λα 越接近 0.5邊緣越“脆”但同時(shí)中低紋理區(qū)域會(huì)逐漸出現(xiàn)不自然的階梯狀色塊α 越接近 1圖像整體越平滑接近 L1 的效果。一個(gè)保險(xiǎn)做法是對(duì)同一張圖跑 α0.6 和 0.8 兩個(gè)版本對(duì)比邊緣銳度而不是盲信單一數(shù)值。4.2 多尺度金字塔模糊核尺寸超過 15 像素時(shí)的必然選擇當(dāng)模糊核尺寸大于圖像短邊的 3% 以上直接對(duì)全分辨率圖做 IRLS結(jié)果大概率會(huì)掉進(jìn)局部極小。原因是目標(biāo)函數(shù)非凸誤差函數(shù)帶有大量局部極小盆直接優(yōu)化容易收斂到一個(gè)振鈴嚴(yán)重的局部解。解決方法是構(gòu)造圖像金字塔從低分辨率開始估計(jì)大尺度結(jié)構(gòu)然后依次上采樣作為下一層的初值。具體尺寸參數(shù)我一般這樣定金字塔層數(shù)等于 log2(核大小/5) 取整數(shù)最高層尺寸保證核至少占 2030 個(gè)像素。每層做固定輪數(shù)的 IRLS得到結(jié)果后上采樣到下一層。核本身在每一層按比例縮放同一金字塔里核長(zhǎng)度保持一致的比例。這個(gè)小改動(dòng)讓盲去卷積的成功率提升非常明顯我險(xiǎn)些以為是自己代碼寫錯(cuò)了——實(shí)際上只是初始解離全局最優(yōu)太遠(yuǎn)。4.3 收斂判定看相對(duì)殘差和正則項(xiàng)變化量不要只看 PSNR我見過不少工程實(shí)現(xiàn)以“外迭代 20 次”作為固定終止條件這其實(shí)浪費(fèi)計(jì)算時(shí)間。更好的做法是同時(shí)監(jiān)控三個(gè)量觀測(cè)誤差 ||Kx?y||2、正則項(xiàng) Σρ(Dx)、以及相鄰兩輪 x 的相對(duì)變化。前兩者是目標(biāo)函數(shù)的兩個(gè)部分后者反映解是否還在移動(dòng)。實(shí)現(xiàn)時(shí)常見的做法是為了避免計(jì)算完整目標(biāo)函數(shù)。正則項(xiàng)可以在 IRLS 更新權(quán)重時(shí)順手算出來代碼幾乎免費(fèi)。收斂標(biāo)準(zhǔn)我寫這顆相對(duì)變化小于 1% 或正則項(xiàng)變化小于 0.5% 即停止。同時(shí)檢查目標(biāo)函數(shù)值是否持續(xù)下降若連續(xù)兩輪上升說明權(quán)重更新過猛應(yīng)退回上一輪解并減小 update step可以把權(quán)重更新公式改成加權(quán)平均w_new 0.7·w_new 0.3·w_old能消掉大部分振蕩。在驗(yàn)證階段用的指標(biāo)是 PSNR但 PSNR 在某些情況下不準(zhǔn)確——比如振鈴集中在邊緣附近時(shí)像素誤差并不大視覺觀感卻很差。所以在調(diào)參時(shí)我從來都輸出一張對(duì)比圖原圖、觀測(cè)圖、去卷積結(jié)果并排放在一張畫布里用眼睛看比用 PSNR 快得多。后來加上結(jié)構(gòu)相似性SSIM作為輔助指標(biāo)才把客觀評(píng)價(jià)從黑匣子狀態(tài)里拽出來。5. 圖像去卷積高頻踩坑背光亮條、顆粒感、彩邊與迭代不收斂5.1 現(xiàn)象輸出出現(xiàn)規(guī)則的“洗衣板”振鈴紋這是去卷積里最常見也最容易讓人懷疑算法本身的失敗模式現(xiàn)象是銳利邊緣兩側(cè)出現(xiàn)等間距的一圈一圈高亮紋間距正好等于模糊核尺寸的一半左右。原因是邊界處理。多數(shù)實(shí)現(xiàn)默認(rèn)用零填充做卷積高頻分量的能量在圖像邊界處被突變截?cái)喈a(chǎn)生虛擬的高頻響應(yīng)反卷積時(shí)這個(gè)響應(yīng)被當(dāng)成真實(shí)信號(hào)放大形成沿邊界傳播的振鈴。解決方法是換邊界模型。我一般先試鏡像填充reflect padding再配合邊界權(quán)重給靠近圖像邊緣 1 倍核半徑的區(qū)域分配更低的保真項(xiàng)權(quán)重因?yàn)槟抢锉緛砭蜎]有可靠信息。另一個(gè)治標(biāo)的方法是先把圖像四周裁剪掉核半徑大小的區(qū)域去卷積完成后再拼接回來但這樣會(huì)損失畫幅。5.2 現(xiàn)象噪聲被放大成白色顆?,F(xiàn)象是去卷積后原本看起來干凈的背景區(qū)域出現(xiàn)密集的白色小顆粒像老照片加了一層噪點(diǎn)紋理。原因是保真項(xiàng)權(quán)重太大λ 太小或者觀測(cè)噪聲方差估計(jì)低估了。IRLS 的權(quán)重更新天然會(huì)放大高頻如果保真項(xiàng)在頻域沒有足夠阻尼高頻噪聲就會(huì)被成倍放大。解決的通常做法有兩種。其一是前置去噪在進(jìn)去卷積之前用雙邊濾波或 BM3D 先壓一層噪聲但注意不要過度去噪導(dǎo)致細(xì)節(jié)丟失。其二是后置處理把 λ 調(diào)大然后接受邊緣銳度略降或者把 IRLS 的權(quán)重下界設(shè)置高一些防止某個(gè)梯度極小的平坦區(qū)域被賦予極大的權(quán)值。注意平坦區(qū)域像素梯度的絕對(duì)值很小max(g, ε)^(α?2) 會(huì)很大相當(dāng)于讓正則項(xiàng)在整個(gè)平坦區(qū)域內(nèi)施加過強(qiáng)約束這個(gè)效應(yīng)會(huì)把噪聲壓成一種“瓷磚狀”的馬賽克。5.3 現(xiàn)象彩色圖像邊緣出現(xiàn)青/品紅暈當(dāng)直接對(duì) RGB 三通道獨(dú)立做去卷積輸出里會(huì)出現(xiàn)彩色邊緣——物體的亮側(cè)偏青暗側(cè)偏紅。原因是自然圖像在 RGB 通道之間的高頻分量具有強(qiáng)相關(guān)性獨(dú)立懲罰梯度會(huì)把這些相關(guān)性破壞掉等效于在通道間引入無中生有的色差。解決方法是把圖像轉(zhuǎn)到 YCbCr 或 Lab 空間對(duì)亮度通道做完整去卷積對(duì)色度通道只做輕量平滑或者保真項(xiàng)直接不做梯度懲罰。這樣既保留彩色信息又避開了跨通道的偽彩色。要注意 YCbCr 轉(zhuǎn)換時(shí)如果輸入是 sRGB需要先做反伽馬變換再轉(zhuǎn)否則亮度通道的梯度統(tǒng)計(jì)和自然圖像先驗(yàn)不匹配。5.4 現(xiàn)象loss 曲線一直抖動(dòng)迭代不收斂現(xiàn)象是目標(biāo)函數(shù)在前幾輪下降后開始來回振蕩或者干脆上一輪 PSNR 高、下一輪低像在解空間里來回彈跳。原因是 IRLS 權(quán)重更新時(shí)某些像素梯度為 0導(dǎo)致 max(g, ε)^(α?2) 直接沖到無窮大。另一個(gè)常見原因是外迭代權(quán)重更新太激進(jìn)權(quán)重值變化率超過了解自身的收斂速度。解決要分兩步首先要給權(quán)重加顯式截?cái)辔乙话惆?w 限制在 [1e-4, 1e3] 之間防止極端值主導(dǎo)方程其次是把權(quán)重更新改成帶慣性的形式w_new 0.5·w_new 0.5·w_old這個(gè)系數(shù)就是阻尼因子能有效抑制振蕩。另外內(nèi)層共軛梯度的收斂閾值不能放松太多否則每一輪的外迭代都從有誤差的解起步誤差不斷累積。把 rtol 固定在 1e-4 以下并且把上一輪的共軛梯度解作為下一輪的初值這點(diǎn)能省一半迭代。5.5 現(xiàn)象同一組參數(shù)在另一張圖上完全失效現(xiàn)象是同一份代碼、同一套參數(shù)換一張圖之后輸出質(zhì)量驟然下降要么振鈴要么噪聲爆炸。原因往往不是參數(shù)問題而是模糊核和圖像內(nèi)容的比例關(guān)系變了。模糊核是固定大小但畫面的聚焦主體、紋理密度、噪聲水平在不同照片之間差異很大正則強(qiáng)度的“最優(yōu)值”自然也變。解決辦法是做歸一化預(yù)處理把圖像和核都?xì)w一化到相同的能量水平噪聲方差先估計(jì)出來再按噪聲方差去縮放 λ。這樣能把參數(shù)調(diào)整范圍壓縮到與圖像內(nèi)容無關(guān)的相對(duì)尺度上。我自己有個(gè)固定習(xí)慣處理任何圖之前先打印三行信息圖像尺寸、模糊核尺寸、估計(jì)噪聲方差。這三行信息決定了我把 λ 的起點(diǎn)設(shè)在哪。跑多了你會(huì)發(fā)現(xiàn)大部分“參數(shù)玄學(xué)”其實(shí)只是沒做這一步跨圖歸一化。6. 再走一步把 Hyper-Laplacian 先驗(yàn)接進(jìn)盲去卷積與真實(shí)噪聲場(chǎng)景6.1 從非盲到盲交替估計(jì)模糊核與潛像非盲去卷積假設(shè)模糊核已知但真實(shí)照片里我們通常是不知道模糊核的。常見做法是把 Hyper-Laplacian 去卷積作為盲去卷積的內(nèi)層模塊外層用迭代法交替估計(jì)模糊核 k 和潛像 x。初始化一個(gè)簡(jiǎn)單核比如高斯盤或直線然后跑幾輪 Hyper-Laplacian 去卷積得到 x再用這個(gè) x 去估計(jì)新的 k再回來跑一次交替到模糊核變化不大。注意盲去卷積里初始核的形狀會(huì)影響結(jié)果收斂方向我一般用對(duì)稱的圓形核起步比矩形核更容易穩(wěn)定。6.2 真實(shí)拍攝照片先估計(jì)噪聲電平再?zèng)Q定 λ 數(shù)量級(jí)真實(shí)抓拍和合成圖像的去卷積差別比想象中大。合成模糊是在干凈圖像上加已知卷積和噪聲而真實(shí)照片里的模糊核可能包含光學(xué)系統(tǒng)的畸變、傳感器 CFA 插值、運(yùn)動(dòng)模糊的非線性。拿到真實(shí)照片時(shí)我第一步會(huì)在圖像的純色區(qū)域比如墻面、天空采樣一些像素塊用它們的方差近似估計(jì)噪聲電平再按 λ 與噪聲方差成正比這一關(guān)系定初始值。另一個(gè)常用檢查項(xiàng)是把模糊核畫出來如果它帶有明顯的不對(duì)稱或旋轉(zhuǎn)特征說明可能是運(yùn)動(dòng)模糊而非失焦那種情況下 Hyper-Laplacian 先驗(yàn)一樣適用但多尺度金字塔尤其重要。6.3 驗(yàn)證方法合成模糊 PSNR/SSIM 回歸別用一張圖下結(jié)論每次調(diào)完參數(shù)我的驗(yàn)證流程是固定的拿 8~12 張不同內(nèi)容的清晰圖每張做 3 種不同模糊核高斯、直線運(yùn)動(dòng)、失焦圓盤和 3 種噪聲等級(jí)合成出模糊觀測(cè)再去卷積最后統(tǒng)計(jì) PSNR 和 SSIM 的平均值而不是單張最佳結(jié)果。這組回歸不僅篩掉了盲目調(diào)參也能暴露某些參數(shù)組合“只對(duì)特定圖有效”的隱蔽問題。把測(cè)試圖固定在一張漂亮的渲染圖上做調(diào)參幾乎一定會(huì)得到一張好看但對(duì)其他圖完全失效的參數(shù)組合——這個(gè)坑我踩過不止一次。現(xiàn)在接手新的去卷積任務(wù)時(shí)我已經(jīng)不再問“用什么先驗(yàn)”而是先問“噪聲多大、核多大、圖像里有沒有大面積平坦區(qū)域”。這三個(gè)答案定下來Hyper-Laplacian 的 α、λ、迭代策略基本就有一個(gè)合適的出手點(diǎn)了。如果你也剛開始跑這條路線我建議先停掉對(duì)參數(shù)的精調(diào)花半天時(shí)間把退化模型和邊界處理做成日志打印出來每一次失敗都記錄了當(dāng)時(shí)的三項(xiàng)輸入你會(huì)比我更早找到穩(wěn)定復(fù)現(xiàn)的手感。希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取