第5章 Python 數字圖像處理(DIP) - 圖像復原與重建15 - 最小均方誤差(維納)濾波

標題

    • 最小均方誤差(維納)濾波

最小均方誤差(維納)濾波

目標是求未污染圖像fff的一個估計f^\hat{f}f^?,使它們之間的均方誤差最小。
e2=E{(f?f^)2}(5.80)e^2 = E \big\{(f - \hat{f})^2 \big\} \tag{5.80}e2=E{(f?f^?)2}(5.80)

誤差函數的最小值在頻率域中的表達比如下:
F^(u,v)=[H?(u,v)Sf(u,v)Sf(u,v)∣H(u,v)∣2+Sη(u,v)]G(u,v)=[H?(u,v)∣H(u,v)∣2+Sη(u,v)/Sf(u,v)]G(u,v)=[1H(u,v)∣H(u,v)∣2∣H(u,v)2+K]G(u,v)(5.81)\begin{aligned} \hat{F}(u, v) & = \Bigg[\frac{H^*(u, v) S_{f}(u, v)}{S_{f}(u, v)|H(u, v)|^2 + S_{\eta}(u, v)} \Bigg] G(u, v) \\ & = \Bigg[\frac{H^*(u, v) }{|H(u, v)|^2 + S_{\eta}(u, v) / S_{f}(u, v)} \Bigg] G(u, v) \\ & = \Bigg[\frac{1}{H(u,v)} \frac{|H(u,v)|^2}{|H(u,v)^2 + K} \Bigg]G(u,v) \end{aligned} \tag{5.81}F^(u,v)?=[Sf?(u,v)H(u,v)2+Sη?(u,v)H?(u,v)Sf?(u,v)?]G(u,v)=[H(u,v)2+Sη?(u,v)/Sf?(u,v)H?(u,v)?]G(u,v)=[H(u,v)1?H(u,v)2+KH(u,v)2?]G(u,v)?(5.81)

注:逆濾波與維納濾波都要求未退化圖像和噪聲的功率譜是已知的。

# 運動模糊PSF與譜
fft_shift = np.fft.fftshift(PSF)
fft = np.fft.fft2(PSF)
spect = spectrum_fft(fft)
plt.figure(figsize=(8, 8))
plt.subplot(1,2,1), plt.imshow(PSF, 'gray')
plt.subplot(1,2,2), plt.imshow(spect, 'gray')
plt.show()
# 仿真運動模糊
def motion_process(image_size, motion_angle, degree=15):"""This function has some problem"""PSF = np.zeros(image_size)
#     print(image_size)center_position=(image_size[0]-1)/2
#     print(center_position)slope_tan=math.tan(motion_angle*math.pi/180)slope_cot=1/slope_tanif slope_tan<=1:for i in range(degree):offset=round(i*slope_tan)    #((center_position-i)*slope_tan)PSF[int(center_position+offset),int(center_position-offset)]=1return PSF / PSF.sum()  #對點擴散函數進行歸一化亮度else:for i in range(degree):offset=round(i*slope_cot)PSF[int(center_position-offset),int(center_position+offset)]=1return PSF / PSF.sum()def get_motion_dsf(image_size, motion_angle, motion_dis):"""Get motion PSFparam: image_size: input image shapeparam: motion_angle: blur motion angleparam: motion_dis: blur distant, the greater value, more blurredreturn normalize PSF"""PSF = np.zeros(image_size)  # 點擴散函數x_center = (image_size[0] - 1) / 2y_center = (image_size[1] - 1) / 2sin_val = np.sin(motion_angle * np.pi / 180)cos_val = np.cos(motion_angle * np.pi / 180)# 將對應角度上motion_dis個點置成1for i in range(motion_dis):x_offset = round(sin_val * i)y_offset = round(cos_val * i)PSF[int(x_center - x_offset), int(y_center + y_offset)] = 1return PSF / PSF.sum()    # 歸一化# 對圖片進行運動模糊
def make_blurred(input, PSF, eps):"""blurred image with PSFparam: input: input imageparam: PSF: input PSF maskparam: eps: epsilon, very small value, to make sure not divided or multiplied by zeroreturn blurred image"""input_fft = np.fft.fft2(input)              #  image FFTPSF_fft = np.fft.fft2(PSF)+ eps             # PSF FFT plus epsilonblurred = np.fft.ifft2(input_fft * PSF_fft) # image FFT multiply PSF FFTblurred = np.abs(np.fft.fftshift(blurred))return blurreddef inverse_filter(input, PSF, eps): """inverse filter using FFT to denoiseparam: input: input imageparam: PSF: known PSFparam: eps: epsilon"""input_fft = np.fft.fft2(input)PSF_fft = np.fft.fft2(PSF) + eps           #噪聲功率,這是已知的,考慮epsilonresult = np.fft.ifft2(input_fft / PSF_fft) #計算F(u,v)的傅里葉反變換result = np.abs(np.fft.fftshift(result))return resultdef wiener_filter(input, PSF, eps, K=0.01):"""wiener filter for image denoiseparam: input: input imageparam: PSF: input the PSF maskparam: eps: epsilonparam: K=0.01: K value for wiener fuctionreturn image after wiener filter"""input_fft = np.fft.fft2(input)PSF_fft = np.fft.fft2(PSF) + epsPSF_fft_1 = np.conj(PSF_fft) / (np.abs(PSF_fft)**2 + K)# 按公式,居然得不到正確的值
#     PSF_abs = PSF * np.conj(PSF)
#     PSF_fft_1 = (1 / (PSF + eps)) * (PSF_abs / (PSF_abs + K))result = np.fft.ifft2(input_fft * PSF_fft_1)result = np.abs(np.fft.fftshift(result))return result# 要實現的功能都在這里調用
if __name__ == "__main__":image = cv2.imread('DIP_Figures/DIP3E_Original_Images_CH05/Fig0526(a)(original_DIP).tif', 0)# 顯示原圖像plt.figure(1, figsize=(6, 6))plt.title("Original Image"), plt.imshow(image, 'gray')plt.xticks([]), plt.yticks([])plt.figure(2, figsize=(18, 12))# 進行運動模糊處理PSF = get_motion_dsf(image.shape[:2], -50, 100)blurred = make_blurred(image, PSF, 1e-3)plt.subplot(231), plt.imshow(blurred, 'gray'), plt.title("Motion blurred")plt.xticks([]), plt.yticks([])# 逆濾波result = inverse_filter(blurred, PSF, 1e-3)   plt.subplot(232), plt.imshow(result, 'gray'), plt.title("inverse deblurred")plt.xticks([]), plt.yticks([])# 維納濾波result = wiener_filter(blurred, PSF, 1e-3)     plt.subplot(233), plt.imshow(result, 'gray'), plt.title("wiener deblurred(k=0.01)")plt.xticks([]), plt.yticks([])# 添加噪聲,standard_normal產生隨機的函數blurred_noisy = blurred + 0.1 * blurred.std() * np.random.standard_normal(blurred.shape)   # 顯示添加噪聲且運動模糊的圖像plt.subplot(234), plt.imshow(blurred_noisy, 'gray'), plt.title("motion & noisy blurred")plt.xticks([]), plt.yticks([])# 對添加噪聲的圖像進行逆濾波result = inverse_filter(blurred_noisy, PSF, 0.1 + 1e-3)    plt.subplot(235), plt.imshow(result, 'gray'), plt.title("inverse deblurred")plt.xticks([]), plt.yticks([])# 對添加噪聲的圖像進行維納濾波result = wiener_filter(blurred_noisy, PSF, 0.1 + 1e-3)         plt.subplot(236), plt.imshow(result, 'gray'), plt.title("wiener deblurred(k=0.01)")plt.xticks([]), plt.yticks([])plt.tight_layout()plt.show()

在這里插入圖片描述

在這里插入圖片描述

# 要實現的功能都在這里調用
if __name__ == "__main__":image = cv2.imread('DIP_Figures/DIP3E_Original_Images_CH05/Fig0526(a)(original_DIP).tif', 0)# 顯示原圖像plt.figure(1, figsize=(6, 6))plt.title("Original Image"), plt.imshow(image, 'gray')plt.xticks([]), plt.yticks([])plt.figure(2, figsize=(18, 12))# 進行運動模糊處理PSF = get_motion_dsf(image.shape[:2], -45, 95)blurred = cv2.imread('DIP_Figures/DIP3E_Original_Images_CH05/Fig0529(d)(medium_noise_var_pt01).tif', 0)plt.subplot(231), plt.imshow(blurred, 'gray'), plt.title("Motion blurred")plt.xticks([]), plt.yticks([])# 逆濾波result = inverse_filter(blurred, PSF, 1e-3)   plt.subplot(232), plt.imshow(result, 'gray'), plt.title("inverse deblurred")plt.xticks([]), plt.yticks([])# 維納濾波result = wiener_filter(blurred, PSF, 1e-3, K=0.01)     plt.subplot(233), plt.imshow(result, 'gray'), plt.title("wiener deblurred(k=0.01)")plt.xticks([]), plt.yticks([])# 添加噪聲,standard_normal產生隨機的函數blurred_noisy = blurred + 0.1 * blurred.std() * np.random.standard_normal(blurred.shape)   # 顯示添加噪聲且運動模糊的圖像plt.subplot(234), plt.imshow(blurred_noisy, 'gray'), plt.title("motion & noisy blurred")plt.xticks([]), plt.yticks([])# 對添加噪聲的圖像進行逆濾波result = inverse_filter(blurred_noisy, PSF, 0.1 + 1e-3)    plt.subplot(235), plt.imshow(result, 'gray'), plt.title("inverse deblurred")plt.xticks([]), plt.yticks([])# 對添加噪聲的圖像進行維納濾波result = wiener_filter(blurred_noisy, PSF, 0.1 + 1e-3)         plt.subplot(236), plt.imshow(result, 'gray'), plt.title("wiener deblurred(k=0.01)")plt.xticks([]), plt.yticks([])plt.tight_layout()plt.show()

在這里插入圖片描述在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/260569.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/260569.shtml
英文地址,請注明出處:http://en.pswp.cn/news/260569.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

入網許可證_入網許可證怎么辦理,申請流程

移動通信系統及終端投資項目核準的若干規定》的出臺&#xff0c;打開了更多企業進入手機業的大門&#xff0c;然而一些企業在關心拿到手機牌照后&#xff0c;是不是就是意味了拿到入網許可證&#xff0c;就可以上市銷售。某些廠商認為:"手機牌照實行核準制&#xff0c;意味…

OpenGL編程低級錯誤范例手冊

看到一篇OpenGL編程的錯誤總結&#xff0c;對我初學來說應該比較有用&#xff0c;先保留&#xff0c;嘿嘿... 謝謝原文作者的貢獻&#xff1a;http://www.cnitblog.com/linghuye/archive/2005/08/13/1845.html 1.沒有glDisable(GL_TEXTURE_2D),導致基本幾何作圖全部失敗。 2.鏡…

C/C++ 中變量的聲明、定義、初始化的區別

今天突然思考到這樣的一個問題&#xff0c;發現已經在學習或者編寫程序的時候壓根就沒有注意到這些&#xff0c;經過比較這些還是有很大的區別的。 int i;//聲明 不分配地址空間 int j1&#xff1b;//轉載于:https://www.cnblogs.com/kuoyan/p/3687391.html

使用python matplotlib畫圖

本文的原文連接是: http://blog.csdn.net/freewebsys/article/details/52577631 未經博主允許不得轉載。 博主地址是&#xff1a;http://blog.csdn.net/freewebsys 1&#xff0c;關于 非常簡單的畫圖類庫。 簡直就是matlab的命令了。 python設計都是非常簡單的。 在使用pyt…

碧桂園博智林機器人總部大樓_碧桂園職院新規劃曝光!將建機器人實訓大樓、新宿舍、水幕電影等...

4月10日&#xff0c;廣東碧桂園職業學院召開院務(擴大)會議&#xff0c;學院黨政班子領導和相關負責人出席。會議集中觀看了學院四期工程的規劃區介紹&#xff0c;并就具體方案的可行性進行了研討。在碧桂園集團董事局主席楊國強先生的帶領下&#xff0c;碧桂園職院正緊隨集團產…

第5章 Python 數字圖像處理(DIP) - 圖像復原與重建16 - 約束最小二乘方濾波、幾何均值濾波

標題約束最小二乘方濾波幾何均值濾波約束最小二乘方濾波 F^(u,v)[H?(u,v)∣H(u,v)∣2γ∣P(u,v)∣2]G(u,v)(5.89)\hat{F}(u,v) \bigg[\frac{H^*(u,v)}{|H(u,v)|^2 \gamma |P(u,v)|^2} \bigg]G(u,v) \tag{5.89}F^(u,v)[∣H(u,v)∣2γ∣P(u,v)∣2H?(u,v)?]G(u,v)(5.89) P(u,…

securecrt是什么工具_比較一下幾款常用的SSH工具

WX眾號&#xff1a;基因學苑Q群&#xff1a;32798724更多精彩內容等你發掘&#xff01;編者按工欲善其事&#xff0c;必先利其器。作為生物信息分析人員&#xff0c;每天都需要通過SSH工具遠程登錄服務器&#xff0c;那么使用一款高效的連接工具就很有必要。這次我們來點評一下…

華為手機如何調時間顯示_華為手機照片如何出現時間地點天氣,教你30秒,一學就會...

閱讀本文前&#xff0c;請您先點擊上面的“藍色字體”&#xff0c;再點擊“關注”&#xff0c;這樣您就可以繼續免費收到文章了。每天都會有分享&#xff0c;都是免費訂閱&#xff0c;請您放心關注。 …

Dreamweaver使用詳解

1&#xff1a;dreamweaver的基本功能&#xff0c;其中各種功能的靈活使用 轉載于:https://www.cnblogs.com/snowhumen/archive/2012/08/01/2618480.html

第5章 Python 數字圖像處理(DIP) - 圖像復原與重建17 - 由投影重建圖像、雷登變換、投影、反投影、反投影重建

標題由投影重建圖像投影和雷登變換 Johann Radon反投影濾波反投影重建由投影重建圖像 本由投影重建圖像&#xff0c;主要是雷登變換與雷登把變換的應用&#xff0c;所以也沒有太多的研究&#xff0c;只為了保持完整性&#xff0c;而添加到這里。 # 自制旋轉投影圖像# 模擬一個…

NFC

NFC近場通信技術是由非接觸式射頻識別&#xff08;RFID&#xff09;及互聯互通技術整合演變而來&#xff0c;在單一芯片上結合感應式讀卡器、感應式卡片和點對點的功能&#xff0c;能在短距離內與兼容設備進行識別和數據交換。 場通信是一種短距高頻的無線電技術&#xff0c;在…

day12-nginx

nginx 前臺服務器并發大 安裝nginx useradd –s /sbin/nologin nginx tar xf nginx-xxx.tar.gz yum install –y gcc pcre-devel openssl-devel ./configure --prefix/etc/nginx --usernginx --groupnginx --with-http_ssl_module --http-log-path/var/log/nginx/access.…

python args_Python可變參數*args和**kwargs用法實例小結

本文實例講述了Python可變參數*args和**kwargs用法。分享給大家供大家參考&#xff0c;具體如下&#xff1a; 一句話簡單概括&#xff1a;當函數的參數不確定的時候就需要用到*args和**kwargs&#xff0c;前者和后者的區別在于&#xff0c;后者引入了”可變”key的概念&#xf…

文件組備份還原

-- 參考 USE master; GO-- 測試的DB CREATE DATABASE DB_Test ON PRIMARY(NAME DB_Test,FILENAME C:\DB_Test.mdf ), FILEGROUP FG1 (NAME DB_Test_FG1,FILENAME C:\DB_Test_fg1.ndf ), FILEGROUP FG2 (NAME DB_Test_FG2,FILENAME C:\DB_Test_fg2.ndf ) LOG ON(NAME DB_…

php調用c++

1.在/var/www中建個測試文件夾 cpp 在此文件夾中新建c文件sort.cpp&#xff0c;如下 編譯并測試執行通過進行以下步驟。 2.在cpp文件夾下新建文件cpp.html&#xff0c;如下 3.同樣在cpp下建php文件cpp.php&#xff0c;如下 保存。 4.程序執行如下 提交后&#xff1a; 轉載于:ht…

AI+無線通信——Top7 (Baseline)分享與總結

從浩哥那里轉載 https://wanghao.blog.csdn.net/article/details/115813954 比賽已經告一段落&#xff0c;現在我們隊兌現承諾&#xff0c;將比賽方案開源給大家&#xff0c;互勉互助&#xff0c;共同進步。 隊伍介紹 我們的隊伍名是Baseline&#xff0c;我們因分享Baseline…

拼字符串成為時間,和兩個計算時間點的中間值

拼字符串成為時間&#xff0c;和兩個計算時間點的中間值 select convert(datetime,2016-09-18 SUBSTRING(CONVERT(varchar(100),d_bdate, 24), 0, 9),21) from B2C_daima where d_noB04 select case when Datename(hour,d_edate)> Datename(hour,d_bdate) then convert(dat…

tornado post第3方_[33]python-Web-框架-Tornado

1.TornadoTornado&#xff1a;python編寫的web服務器兼web應用框架1.1.Tornado的優勢輕量級web框架異步非阻塞IO處理方式出色的抗負載能力優異的處理性能&#xff0c;不依賴多進程/多線程&#xff0c;一定程度上解決C10K問題WSGI全棧替代產品&#xff0c;推薦同時使用其web框架…

android 串口調試工具_樹莓派通用串口通信實驗

一、介紹對于樹莓派 3B來說&#xff0c;他的UART功能有三種&#xff1a;1、內部藍牙使用&#xff1b;2、控制終端使用&#xff1b;3、與其他設備進行串口通信。在樹莓派USB TO TTL模塊實驗中學習了通過串口對樹莓派進行控制臺控制&#xff0c;讓串口作為控制終端調試口即 seria…

Laravel5.2目錄結構及composer.json文件解析

目錄或文件說明&#xff5c;– app包含Controller、Model、路由等在內的應用目錄&#xff0c;大部分業務將在該目錄下進行&#xff5c;  &#xff5c;– Console命令行程序目錄&#xff5c;  &#xff5c;  &#xff5c;– Commands包含了用于命令行執行的類&#xff…