運(yùn)動(dòng)模糊恢復(fù)專題

相關(guān)背景知識(shí)


1.運(yùn)動(dòng)模糊的定義

  • wiki百科上的定義是:運(yùn)動(dòng)模糊或運(yùn)動(dòng)模糊(motion blur)是靜態(tài)場(chǎng)景或一系列的圖片像電影或是動(dòng)畫中一樣快速移動(dòng),使物體產(chǎn)生明顯運(yùn)動(dòng)痕跡。
    [圖片上傳失敗...(image-9eedb7-1574308075917)]

  • 從狹義上來說,我們僅僅關(guān)注造成人眼和相機(jī)運(yùn)動(dòng)模糊的原因。

  1. 對(duì)于人眼來說,由于視覺暫留原理,當(dāng)前景象與視網(wǎng)膜殘留的景象重合產(chǎn)生運(yùn)動(dòng)模糊。
  2. 對(duì)于相機(jī),由于在曝光時(shí)間內(nèi),被攝物體與鏡頭產(chǎn)生相對(duì)位移,使得底片上同一個(gè)像素點(diǎn)被來自不同位置的光照射,導(dǎo)致運(yùn)動(dòng)模糊。

從以上描述,我們可以看到,對(duì)于相機(jī)和人眼,運(yùn)動(dòng)模糊的產(chǎn)生主要的條件就是感光設(shè)備與被觀測(cè)物體的相對(duì)運(yùn)動(dòng)。

  • 運(yùn)動(dòng)模糊的分類
  1. 根據(jù)模糊核的性質(zhì)可以分為:
    a. 線性模糊
    b. 旋轉(zhuǎn)模糊
    c. 縮放模糊
  2. 根據(jù)模糊的范圍,可以分為:
    a. 局部模糊
    b. 全局模糊

2.如何去除圖像模糊

圖像的運(yùn)動(dòng)模糊本質(zhì)上也是一種圖像退化過程,因此我們可以將其歸于圖像退化恢復(fù)任務(wù)。

  1. 圖像退化模型
    頻域(以下涉及的所有公式中,大寫大寫代表在頻域中計(jì)算,小寫代表在時(shí)域中計(jì)算):G(x,y) = H(x,y)F(x,y) + N(x,y) \tag{1}
    在這里,F(xiàn)(x,y)是我們?cè)镜那逦鷪D像,H(x,y)為我們的模糊核,G(x,y)指我們觀測(cè)到的模糊圖像,而N(x,y)是指噪聲。
  2. PSF(點(diǎn)擴(kuò)散函數(shù))
    當(dāng)上式中H具備空間不變性時(shí),我們可以將其稱之為點(diǎn)擴(kuò)散函數(shù),其定義如下:
    PSF

    參考運(yùn)動(dòng)模糊算法推論, 引用其圖片如下:
    PSF示意圖
    其中 \beta 表示模糊方向,L表示模糊尺度,我們可以理解為在一個(gè)濾波器卷積核,以中心為原點(diǎn),L/2為半徑的圓中,與水平方向的家夾角為\beta的直徑上的像素值為1/L,其余像素值為0。(注意:這只是理想上的psf,實(shí)際拍攝中,psf值不一定是均勻的。)
    3.相關(guān)去模糊算法
    當(dāng)前比較傳統(tǒng)的去模糊算法都是基于其退化函數(shù)來去模糊。根據(jù)點(diǎn)擴(kuò)散函數(shù)是否已知,可以將相關(guān)去模糊算法分為盲圖復(fù)原算法和非盲圖復(fù)原算法。如下圖所示。
    相關(guān)去模糊算法

傳統(tǒng)去模糊算法

1.非盲圖去模糊算法

逆濾波算法

該算法直接根據(jù)公式(1)得出f(x,y),并且不考慮噪聲n(x,y),因此該算法對(duì)噪聲十分敏感。\hat{F}(x,y) =\frac{ G(x,y)}{H(x,y)} = F(x,y) + \frac{N(x,y)}{H(x,y)} \tag{2} 從公式(2)中,我們很容易發(fā)現(xiàn),當(dāng)無噪聲時(shí),該方法能很好的恢復(fù)原圖,但當(dāng)噪聲存在,且H比較小的時(shí)候,等式右邊第二項(xiàng)將會(huì)給圖像恢復(fù)造成極大的麻煩。

python 代碼實(shí)現(xiàn)如下:

#inverse filter
def inverse(input, PSF):       # 逆濾波
    input_fft = np.fft.fft2(input)
    PSF_fft = np.fft.fft2(PSF) 
    result = np.fft.ifft2(input_fft / PSF_fft) #計(jì)算F(u,v)的傅里葉反變換
    result = np.real(fft.fftshift(result))
    result[np.isinf(result)] = 0
    result[result > 255.0] = 255
    result[result < 0] = 0
    return result

維納濾波算法

考慮到逆濾波算法的缺陷,人們又提出一種維納濾波算法,該算法從的主要思想是想找到一個(gè)濾波器t(x,y)使得其可以直接將模糊圖像g(x,y)轉(zhuǎn)為清晰圖像f(x,y)。\hat{f}(x,y) = t(x,y) * g(x,y) \tag{3} 為了求出這樣一個(gè)濾波器t(x,y),需要最小化公式(4)。arg\,\min_{t(x,y)} = E|\hat{f}(x,y) - f(x,y)|^{2} \tag{4} 解該方程可以得到:T(x,y) = \frac{H^{*}(x,y)}{|H(x,y)|^{2} + \frac{N(x,y)}{S(x,y)}} \tag{5} 其中:

  • T(x,y)和H(x,y)是所求濾波器t(x,y)和psf h(x,y)在頻率域的傅里葉變換。
  • S(x,y)是原清晰圖f(x,y)的功率譜。
  • N(f)是噪聲的n(x,y)的功率譜。
  • 上標(biāo)?代表復(fù)數(shù)共軛

python代碼實(shí)現(xiàn)如下:

def wiener(input,PSF,K=0.01):        #維納濾波,K=0.01
    input_fft=np.fft.fft2(input)
    PSF_fft=np.fft.fft2(PSF)
    PSF_fft_1=np.conj(PSF_fft) /(np.abs(PSF_fft)**2 + K)
    result=np.fft.ifft2(input_fft * PSF_fft_1)
    result=np.real(fft.fftshift(result))
    result[result > 255.0] = 255
    result[result < 0] = 0
    return result

約束最小二乘方算法

從維納濾波的公式推導(dǎo)中我們可以看到,要很好的恢復(fù)原圖,必須求出噪信比(噪聲與原圖功率譜的比值),然而這是很難獲得的,并且當(dāng)噪聲為0時(shí),維納濾波就退化為逆濾波。為此,研究人員提出了約束最小二乘方算法,該算法只需要噪聲的方差和均值,并能有效抑制恢復(fù)后圖像的噪聲。為了抑制恢復(fù)后圖像噪聲,需要最小化以下公式:arg\,\min_{\hat{f}(x,y)} C = \sum_{x=1}^{M-1}\sum_{y=1}^{N-1}[\nabla^{2}\hat{f}(x,y)]^{2} \tag{6}
其約束為: |g(x,y) - h(x,y)*\hat{f}(x,y)|^{2} = |n(x,y)|^2 \tag{7} 利用拉格朗日數(shù)乘法解得: \hat{f}(x,y) = \frac{\lambda h(x,y) * g(x,y)}{\lambda h(x,y)*h(x,y)+p*p} = \frac{HG}{|H|^2 + \gamma P^2} \tag{8} 這里P為lapula斯算子:p = \begin{bmatrix} 0 & -1 & 0 \\ -1 & 4 & -1 \\ 0 & -1 & 0 \\ \end{bmatrix} \tag{9}

python代碼實(shí)現(xiàn)

#約束最小二乘方濾波器
def Least_square_filter(input, psf, r = 0.001):
    lp = np.array([[0,-1,0],
                  [-1,4,-1],
                  [0,-1,0]])
    result = np.real(fft.ifft2(numerator * F_input / (F_psf**2 + r * F_lp**2)))
    result[np.isinf(result)] = 0
    result[result > 255.0] = 255
    result[result < 0] = 0
    return result

Richardson–Lucy_deconvolution算法

該算法基于貝葉斯估計(jì),泊松分布以及極大似然估計(jì)對(duì)圖像進(jìn)行修復(fù)。此處直接給出其迭代式:f^{n+1}(x,y) = [\frac{g(x,y)}{h(x,y)*f^n(x,y)}*h(x,y)]f^n(x,y) \tag{10}

python代碼實(shí)現(xiàn)

#Richardson–Lucy_deconvolution算法(露西-理查德森)
def RL_deconv_f(input, psf, iteration, eps):
    ut = input
    otf = psf2otf(psf) #該函數(shù)為matlab中psf2otf函數(shù)的python實(shí)現(xiàn)
    for i in range(iteration):
        ut_f = np.fft.fft2(ut)
        temp1 = ut_f * otf
        itemp1 = np.real(np.fft.ifft2(temp1))
        ratio = input / itemp1
        ratio[np.isinf(ratio)] = 255
        ratio = np.nan_to_num(ratio)
        iratio = np.fft.fft2(ratio)
        res = iratio * np.conj(otf)
        ires = np.real(np.fft.ifft2(res))
        ut = ut * ires
    ut[np.isinf(ut)] = 0
    ut[ut > 255.0] = 255
    ut[ut < 0] = 0
    return ut
  • 迭代次數(shù)實(shí)驗(yàn)對(duì)比
模糊圖
迭代60次
迭代5次
迭代30次

  • 傳統(tǒng)算法實(shí)驗(yàn)結(jié)果對(duì)比(無噪聲)
清晰圖
模糊圖
逆濾波
維納濾波
約束最小二乘方法
RL跌代30次

  • 傳統(tǒng)算法實(shí)驗(yàn)結(jié)果對(duì)比(添加均值為0,方差為0.01的高斯噪聲)
清晰圖
模糊圖
逆濾波
維納濾波
約束最小二乘方法
RL跌代30次

2. 盲圖去模糊算法

一般來說,盲圖去模糊算法首先是估計(jì)點(diǎn)擴(kuò)散函數(shù),當(dāng)點(diǎn)擴(kuò)散函數(shù)已知時(shí),便可以將問題轉(zhuǎn)化到非盲圖去模糊問題。但也有另外迭代的方法,即利用各種先驗(yàn)知識(shí),迭代估計(jì)psf和原圖以達(dá)到最佳效果。本節(jié)提到的是一種估計(jì)psf的經(jīng)典算法。

倒頻譜法

本文主要參考博文, 以及論文0181208.htm論文201811/20/20181120154225821.pdf
說到估計(jì)psf,主要就是估計(jì)psf的兩個(gè)重要參數(shù),即模糊尺度L和模糊角度\theta。這里我們先預(yù)設(shè)一個(gè)模糊核:L=23, \theta = 78^{\circ},并用該模糊核模糊原圖。

PSF

    1. 估計(jì)模糊方向(0^\circ-179^\circ)
      a. 將模糊圖像轉(zhuǎn)化到頻域,并用對(duì)數(shù)進(jìn)行動(dòng)態(tài)壓縮。
原圖
模糊圖
頻域圖

b. 將壓縮后的矩陣先平方,再逆傅里葉變換回時(shí)域,然后移位到中心。


移位到中心

c . 截取取圖像中間部分,先進(jìn)行閉運(yùn)算,得到這條斜線。


截取圖像中間

d. 然后對(duì)閉運(yùn)算結(jié)果二值化,并提取其骨架。最后一步就是估計(jì)骨架的角度,即我們要求的模糊尺度θ, 我們可以使用Radon、霍夫直線檢測(cè)、最小二乘法等方法,我這里用的是最小二乘法。
估計(jì)角度$\theta$
  • 2.估計(jì)模糊尺度L(6-35)像素
    a. 將模糊圖像轉(zhuǎn)化到頻域后,移位到中心(經(jīng)過對(duì)數(shù)動(dòng)態(tài)壓縮) 。
    b. 將步驟a中的結(jié)果反色,取得我們需要的暗通道圖。
    c. 剩下的步驟和方向估計(jì)一樣,最終取得暗通道的骨架圖,估計(jì)中心兩骨架之間的距離dis = 2d,則所求 L = N/d。
頻域圖
移位圖
反色提取圖

最后在我實(shí)現(xiàn)的方法中,估計(jì)出來的\theta = 80.18^\circ, L = 25.00, 我們可以看到雖然有一些誤差,但是已經(jīng)很接近我們的真實(shí)值了。

  • 3.為了驗(yàn)證算法的有效性,我取L = [8, 16, 24, 32], \theta = [10^\circ, 30^\circ, 50^\circ, 70^\circ, 90^\circ, 110^\circ, 130^\circ, 150^\circ, 170^\circ ] 共構(gòu)建36種psf模糊核,分別模糊同一張圖像,然后用到頻譜法估計(jì)其參數(shù),結(jié)構(gòu)如下:
    模糊核尺度L估計(jì)結(jié)果
    尺度估計(jì)結(jié)果

    模糊角度\theta估計(jì)結(jié)果
    角度估計(jì)結(jié)果

    從圖中我們可以看到,模糊尺度估計(jì)的偏差比較大,而且在\theta=130^\circ, L = 8時(shí),估計(jì)結(jié)果偏差很大,初步估計(jì)是前面提取暗通道過程中,提取結(jié)果不夠精確。而模糊方向\theta的估計(jì)就比較精確了,基本上都在準(zhǔn)確值[-1,+1]的范圍內(nèi)。但是在測(cè)試的時(shí)候葉發(fā)現(xiàn)當(dāng)角度\theta < 5^\circ or\ \theta > 175^\circ時(shí), 預(yù)測(cè)的模糊角度就會(huì)有較大的偏差。
  • 4.利用到頻譜法,結(jié)合之前提到的非盲圖去模糊算法,我們做一個(gè)盲圖去模糊實(shí)驗(yàn),這里我們?nèi)?img class="math-inline" src="https://math.jianshu.com/math?formula=L%20%3D%2019%2C%20%5Ctheta%20%3D%20110%5E%5Ccirc%2C%20%E6%97%A0%E5%99%AA%E5%A3%B0" alt="L = 19, \theta = 110^\circ, 無噪聲" mathimg="1">,利用到頻譜法估計(jì)出來的模糊核參數(shù)(L=20.03, \theta = 109.6), 實(shí)驗(yàn)結(jié)果如下。
清晰圖
模糊圖
逆濾波
維納濾波
約束最小二乘方法
RL跌代30次

我們可以看到實(shí)驗(yàn)結(jié)果基本上和我們之前分析的相同,其中RL算法繼續(xù)迭代的話,效果還能有一定的提升。

總結(jié)

本文只簡(jiǎn)要提及了一些傳統(tǒng)的去模糊算法,近些年還有許多表現(xiàn)優(yōu)秀的去模糊算法被提出,例如,迭代優(yōu)化求解類,超分辨類,神經(jīng)網(wǎng)絡(luò)類等等。大家如果想進(jìn)一步了解運(yùn)動(dòng)去模糊相關(guān)算法,強(qiáng)烈推薦這個(gè)github鏈接收錄了近十幾年的去模糊論文,包括各種應(yīng)用場(chǎng)景,只能說真香!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容