matlab 维纳滤波恢复运动模糊,运动模糊恢复专题
相關(guān)背景知識
1.運(yùn)動模糊的定義
wiki百科上的定義是:運(yùn)動模糊或運(yùn)動模糊(motion blur)是靜態(tài)場景或一系列的圖片像電影或是動畫中一樣快速移動,使物體產(chǎn)生明顯運(yùn)動痕跡。
[圖片上傳失敗...(image-9eedb7-1574308075917)]
從狹義上來說,我們僅僅關(guān)注造成人眼和相機(jī)運(yùn)動模糊的原因。
對于人眼來說,由于視覺暫留原理,當(dāng)前景象與視網(wǎng)膜殘留的景象重合產(chǎn)生運(yùn)動模糊。
對于相機(jī),由于在曝光時間內(nèi),被攝物體與鏡頭產(chǎn)生相對位移,使得底片上同一個像素點(diǎn)被來自不同位置的光照射,導(dǎo)致運(yùn)動模糊。
從以上描述,我們可以看到,對于相機(jī)和人眼,運(yùn)動模糊的產(chǎn)生主要的條件就是感光設(shè)備與被觀測物體的相對運(yùn)動。
運(yùn)動模糊的分類
根據(jù)模糊核的性質(zhì)可以分為:
a. 線性模糊
b. 旋轉(zhuǎn)模糊
c. 縮放模糊
根據(jù)模糊的范圍,可以分為:
a. 局部模糊
b. 全局模糊
2.如何去除圖像模糊
圖像的運(yùn)動模糊本質(zhì)上也是一種圖像退化過程,因此我們可以將其歸于圖像退化恢復(fù)任務(wù)。
圖像退化模型
頻域(以下涉及的所有公式中,大寫大寫代表在頻域中計算,小寫代表在時域中計算):
在這里,F(x,y)是我們原本的清晰圖像,H(x,y)為我們的模糊核,G(x,y)指我們觀測到的模糊圖像,而N(x,y)是指噪聲。
PSF(點(diǎn)擴(kuò)散函數(shù))
當(dāng)上式中H具備空間不變性時,我們可以將其稱之為點(diǎn)擴(kuò)散函數(shù),其定義如下:
PSF
參考運(yùn)動模糊算法推論, 引用其圖片如下:
PSF示意圖其中
表示模糊方向,L表示模糊尺度,我們可以理解為在一個濾波器卷積核,以中心為原點(diǎn),L/2為半徑的圓中,與水平方向的家夾角為
的直徑上的像素值為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)得出
,并且不考慮噪聲
,因此該算法對噪聲十分敏感。
從公式(2)中,我們很容易發(fā)現(xiàn),當(dāng)無噪聲時,該方法能很好的恢復(fù)原圖,但當(dāng)噪聲存在,且H比較小的時候,等式右邊第二項(xiàng)將會給圖像恢復(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) #計算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
維納濾波算法
考慮到逆濾波算法的缺陷,人們又提出一種維納濾波算法,該算法從的主要思想是想找到一個濾波器
使得其可以直接將模糊圖像
轉(zhuǎn)為清晰圖像
。
為了求出這樣一個濾波器
,需要最小化公式(4)。
解該方程可以得到:
其中:
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時,維納濾波就退化為逆濾波。為此,研究人員提出了約束最小二乘方算法,該算法只需要噪聲的方差和均值,并能有效抑制恢復(fù)后圖像的噪聲。為了抑制恢復(fù)后圖像噪聲,需要最小化以下公式:
其約束為:
利用拉格朗日數(shù)乘法解得:
這里P為lapula斯算子:
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ìn)行修復(fù)。此處直接給出其迭代式:
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)對比
模糊圖
迭代60次
迭代5次
迭代30次
傳統(tǒng)算法實(shí)驗(yàn)結(jié)果對比(無噪聲)
清晰圖
模糊圖
逆濾波
維納濾波
約束最小二乘方法
RL跌代30次
傳統(tǒng)算法實(shí)驗(yàn)結(jié)果對比(添加均值為0,方差為0.01的高斯噪聲)
清晰圖
模糊圖
逆濾波
維納濾波
約束最小二乘方法
RL跌代30次
2. 盲圖去模糊算法
一般來說,盲圖去模糊算法首先是估計點(diǎn)擴(kuò)散函數(shù),當(dāng)點(diǎn)擴(kuò)散函數(shù)已知時,便可以將問題轉(zhuǎn)化到非盲圖去模糊問題。但也有另外迭代的方法,即利用各種先驗(yàn)知識,迭代估計psf和原圖以達(dá)到最佳效果。本節(jié)提到的是一種估計psf的經(jīng)典算法。
倒頻譜法
本文主要參考博文, 以及論文0181208.htm,論文201811/20/20181120154225821.pdf
說到估計psf,主要就是估計psf的兩個重要參數(shù),即模糊尺度
和模糊角度
。這里我們先預(yù)設(shè)一個模糊核:
,并用該模糊核模糊原圖。
PSF
估計模糊方向
a. 將模糊圖像轉(zhuǎn)化到頻域,并用對數(shù)進(jìn)行動態(tài)壓縮。
原圖
模糊圖
頻域圖
b. 將壓縮后的矩陣先平方,再逆傅里葉變換回時域,然后移位到中心。
移位到中心
c . 截取取圖像中間部分,先進(jìn)行閉運(yùn)算,得到這條斜線。
截取圖像中間
d. 然后對閉運(yùn)算結(jié)果二值化,并提取其骨架。最后一步就是估計骨架的角度,即我們要求的模糊尺度θ, 我們可以使用Radon、霍夫直線檢測、最小二乘法等方法,我這里用的是最小二乘法。
估計角度$\theta$
2.估計模糊尺度
像素
a. 將模糊圖像轉(zhuǎn)化到頻域后,移位到中心(經(jīng)過對數(shù)動態(tài)壓縮) 。
b. 將步驟a中的結(jié)果反色,取得我們需要的暗通道圖。
c. 剩下的步驟和方向估計一樣,最終取得暗通道的骨架圖,估計中心兩骨架之間的距離
,則所求
。
頻域圖
移位圖
反色提取圖
最后在我實(shí)現(xiàn)的方法中,估計出來的
, 我們可以看到雖然有一些誤差,但是已經(jīng)很接近我們的真實(shí)值了。
3.為了驗(yàn)證算法的有效性,我取
共構(gòu)建36種psf模糊核,分別模糊同一張圖像,然后用到頻譜法估計其參數(shù),結(jié)構(gòu)如下:
模糊核尺度
估計結(jié)果
尺度估計結(jié)果
模糊角度
估計結(jié)果
角度估計結(jié)果
從圖中我們可以看到,模糊尺度估計的偏差比較大,而且在
時,估計結(jié)果偏差很大,初步估計是前面提取暗通道過程中,提取結(jié)果不夠精確。而模糊方向
的估計就比較精確了,基本上都在準(zhǔn)確值
的范圍內(nèi)。但是在測試的時候葉發(fā)現(xiàn)當(dāng)角度
時, 預(yù)測的模糊角度就會有較大的偏差。
4.利用到頻譜法,結(jié)合之前提到的非盲圖去模糊算法,我們做一個盲圖去模糊實(shí)驗(yàn),這里我們?nèi)?/p>
,利用到頻譜法估計出來的模糊核參數(shù)(
), 實(shí)驗(yàn)結(jié)果如下。
清晰圖
模糊圖
逆濾波
維納濾波
約束最小二乘方法
RL跌代30次
我們可以看到實(shí)驗(yàn)結(jié)果基本上和我們之前分析的相同,其中RL算法繼續(xù)迭代的話,效果還能有一定的提升。
總結(jié)
本文只簡要提及了一些傳統(tǒng)的去模糊算法,近些年還有許多表現(xiàn)優(yōu)秀的去模糊算法被提出,例如,迭代優(yōu)化求解類,超分辨類,神經(jīng)網(wǎng)絡(luò)類等等。大家如果想進(jìn)一步了解運(yùn)動去模糊相關(guān)算法,強(qiáng)烈推薦這個github鏈接收錄了近十幾年的去模糊論文,包括各種應(yīng)用場景,只能說真香!
總結(jié)
以上是生活随笔為你收集整理的matlab 维纳滤波恢复运动模糊,运动模糊恢复专题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: docker安装mysql8,Docke
- 下一篇: java session事件,Java开