【youcans 的 OpenCV 例程 200 篇】107. 退化图像的维纳滤波
歡迎關注 『youcans 的 OpenCV 例程 200 篇』 系列,持續更新中
 歡迎關注 『youcans 的 OpenCV學習課』 系列,持續更新中
【youcans 的 OpenCV 例程 200 篇】107. 退化圖像的維納濾波(Wiener filter)
6. 退化圖像復原
圖像復原是對圖像退化的過程進行估計,并補償退化過程造成的失真,以便獲得未經退化的原始圖像或原始圖像的最優估值,從而改善圖像質量的一種方法。
典型的圖像復原方法是根據圖像退化的先驗知識建立退化模型,以退化模型為基礎采用濾波等手段進行處理,使復原后的圖像符合一定的準則,達到改善圖像質量的目的。
因此,圖像復原是沿著質量降低的逆過程來重現真實的原始圖像,通過去模糊函數而去除圖像模糊。
6.2 退化圖像的維納濾波(Wiener filter)
逆濾波對加性噪聲特別敏感,使得恢復的圖像幾乎不可用(例程9.20中的退化圖像未加入噪聲項) 。
最小均方誤差濾波用來去除含有噪聲的模糊圖像,其目標是尋找未污染圖像的一個估計,使均方誤差最小:
 e2=E{(f?f^)2}e^2 = E\{ (f - \hat{f})^2 \} e2=E{(f?f^?)2}
 最小均方差濾波由 Wiener [1942] 首先提出,是最早提出的線性圖像復原方法,因此稱為維納濾波。
信噪比 SNR(f)=S(f)/N(f)SNR(f) = S(f)/N(f)SNR(f)=S(f)/N(f),是信息承載信號功率(未退化的原圖像)水平與噪聲功率水平的測度。低噪聲圖像的信噪比較高,高噪聲圖像的信噪比較低。
將復原后的圖像視為“信號”,而復原圖像與原圖像的差視為“噪聲”,則可以將空間域的信噪比定義為:
 SNR=∑x=0M?1∑y=0N?1f^(x,y)2/∑x=0M?1∑y=0N?1[f(x,y)?f^(x,y)]2SNR = \sum_{x=0}^{M-1} \sum_{y=0}^{N-1} \hat{f}(x,y)^2 / \sum_{x=0}^{M-1} \sum_{y=0}^{N-1} [f(x,y) -\hat{f}(x,y)]^2 SNR=x=0∑M?1?y=0∑N?1?f^?(x,y)2/x=0∑M?1?y=0∑N?1?[f(x,y)?f^?(x,y)]2
 最小均方誤差濾波的傳遞函數描述為:
 G(f)=H?(f)S(f)∣H(f)∣2S(f)+N(f)=H?(f)∣H(f)∣2S(f)+N(f)/S(f)G(f) = \frac{H^* (f) S(f)}{|H(f)|^2 S(f) + N(f)} = \frac{H^* (f)}{|H(f)|^2 S(f) + N(f)/S(f)} G(f)=∣H(f)∣2S(f)+N(f)H?(f)S(f)?=∣H(f)∣2S(f)+N(f)/S(f)H?(f)?
 式中 G(f)、H(f)G(f)、H(f)G(f)、H(f) 是 g 和 h 在頻率域的傅里葉變換,S(f)、N(f)S(f)、N(f)S(f)、N(f) 是信號 x(t)、噪聲 n(t) 的功率譜。
用信噪比將上式進一步表示為:
 G(f)=1H(f)∣H(f)∣2∣H(f)∣2+1/SNR(f)G(f) = \frac{1}{H(f)} \frac{|H(f)|^2}{|H(f)|^2 + 1/SNR(f)} G(f)=H(f)1?∣H(f)∣2+1/SNR(f)∣H(f)∣2?
 當處理白噪聲時∣N(u,v)∣2|N(u,v)|^2∣N(u,v)∣2 是一個常數, 但未退化圖像和噪聲的功率譜通常未知或不能估計,則可用下式近似:
 F^(u,v)=1H(u,v)∣H(u,v)∣2∣H(u,v)∣2+KG(u,v)\hat{F}(u,v)= \frac{1}{H(u,v)} \frac{|H(u,v)|^2}{|H(u,v)|^2 + K} G(u,v) F^(u,v)=H(u,v)1?∣H(u,v)∣2+K∣H(u,v)∣2?G(u,v)
 K 是加到 ∣H(u,v)∣2|H(u,v)|^2∣H(u,v)∣2的所有項上的一個規定常數。
例程 9.21: 維納濾波 (Wiener filter)
# 9.21: 退化圖像的維納濾波 (Wiener filter)def getMotionDsf(shape, angle, dist):xCenter = (shape[0] - 1) / 2yCenter = (shape[1] - 1) / 2sinVal = np.sin(angle * np.pi / 180)cosVal = np.cos(angle * np.pi / 180)PSF = np.zeros(shape) # 點擴散函數for i in range(dist): # 將對應角度上motion_dis個點置成1xOffset = round(sinVal * i)yOffset = round(cosVal * i)PSF[int(xCenter - xOffset), int(yCenter + yOffset)] = 1return PSF / PSF.sum() # 歸一化def makeBlurred(image, PSF, eps): # 對圖片進行運動模糊fftImg = np.fft.fft2(image) # 進行二維數組的傅里葉變換fftPSF = np.fft.fft2(PSF) + epsfftBlur = np.fft.ifft2(fftImg * fftPSF)fftBlur = np.abs(np.fft.fftshift(fftBlur))return fftBlurdef inverseFilter(image, PSF, eps): # 逆濾波fftImg = np.fft.fft2(image)fftPSF = np.fft.fft2(PSF) + eps # 噪聲功率,這是已知的,考慮epsilonimgInvFilter = np.fft.ifft2(fftImg / fftPSF) # 計算F(u,v)的傅里葉反變換imgInvFilter = np.abs(np.fft.fftshift(imgInvFilter))return imgInvFilterdef wienerFilter(input, PSF, eps, K=0.01): # 維納濾波,K=0.01fftImg = np.fft.fft2(input)fftPSF = np.fft.fft2(PSF) + epsfftWiener = np.conj(fftPSF) / (np.abs(fftPSF)**2 + K)imgWienerFilter = np.fft.ifft2(fftImg * fftWiener)imgWienerFilter = np.abs(np.fft.fftshift(imgWienerFilter))return imgWienerFilter# 讀取原始圖像img = cv2.imread("../images/Fig0526a.tif", 0) # flags=0 讀取為灰度圖像hImg, wImg = img.shape[:2]# 不含噪聲的運動模糊PSF = getMotionDsf((hImg, wImg), 45, 100) # 運動模糊函數imgBlurred = np.abs(makeBlurred(img, PSF, 1e-6)) # 生成不含噪聲的運動模糊圖像imgInvFilter = inverseFilter(imgBlurred, PSF, 1e-6) # 逆濾波imgWienerFilter = wienerFilter(imgBlurred, PSF, 1e-6) # 維納濾波# 帶有噪聲的運動模糊scale = 0.05 # 噪聲方差noisy = imgBlurred.std() * np.random.normal(loc=0.0, scale=scale, size=imgBlurred.shape) # 添加高斯噪聲imgBlurNoisy = imgBlurred + noisy # 帶有噪聲的運動模糊imgNoisyInv = inverseFilter(imgBlurNoisy, PSF, scale) # 對添加噪聲的模糊圖像進行逆濾波imgNoisyWiener = wienerFilter(imgBlurNoisy, PSF, scale) # 對添加噪聲的模糊圖像進行維納濾波plt.figure(figsize=(9, 7))plt.subplot(231), plt.title("blurred image"), plt.axis('off'), plt.imshow(imgBlurred, 'gray')plt.subplot(232), plt.title("inverse filter"), plt.axis('off'), plt.imshow(imgInvFilter, 'gray')plt.subplot(233), plt.title("Wiener filter"), plt.axis('off'), plt.imshow(imgWienerFilter, 'gray')plt.subplot(234), plt.title("blurred image with noisy"), plt.axis('off'), plt.imshow(imgBlurNoisy, 'gray')plt.subplot(235), plt.title("inverse filter"), plt.axis('off'), plt.imshow(imgNoisyInv, 'gray')plt.subplot(236), plt.title("Wiener filter"), plt.axis('off'), plt.imshow(imgNoisyWiener, 'gray')plt.tight_layout()plt.show()程序說明:
對于不含噪聲的運動模糊圖像,在已知運動模糊退化模型和參數的前提下,使用逆濾波可以很好地復原退化圖像,逆濾波的性能優于維納濾波。但是,考慮實際退化圖像往往含有一定水平的加性噪聲,此時即使已知退化模型,逆濾波的后的噪聲幾乎掩蓋了圖像內容,而維納濾波的結果則較好。
 
(本節完)
版權聲明:
youcans@xupt 原創作品,轉載必須標注原文鏈接:(https://blog.csdn.net/youcans/article/details/123062695)
Copyright 2022 youcans, XUPT
 Crated:2022-2-22
歡迎關注 『youcans 的 OpenCV 例程 200 篇』 系列,持續更新中
 歡迎關注 『youcans 的 OpenCV學習課』 系列,持續更新中
【youcans 的 OpenCV 例程200篇】01. 圖像的讀取(cv2.imread)
 【youcans 的 OpenCV 例程200篇】02. 圖像的保存(cv2.imwrite)
 【youcans 的 OpenCV 例程200篇】03. 圖像的顯示(cv2.imshow)
 【youcans 的 OpenCV 例程200篇】04. 用 matplotlib 顯示圖像(plt.imshow)
 【youcans 的 OpenCV 例程200篇】05. 圖像的屬性(np.shape)
 【youcans 的 OpenCV 例程200篇】06. 像素的編輯(img.itemset)
 【youcans 的 OpenCV 例程200篇】07. 圖像的創建(np.zeros)
 【youcans 的 OpenCV 例程200篇】08. 圖像的復制(np.copy)
 【youcans 的 OpenCV 例程200篇】09. 圖像的裁剪(cv2.selectROI)
 【youcans 的 OpenCV 例程200篇】10. 圖像的拼接(np.hstack)
 【youcans 的 OpenCV 例程200篇】11. 圖像通道的拆分(cv2.split)
 【youcans 的 OpenCV 例程200篇】12. 圖像通道的合并(cv2.merge)
 【youcans 的 OpenCV 例程200篇】13. 圖像的加法運算(cv2.add)
 【youcans 的 OpenCV 例程200篇】14. 圖像與標量相加(cv2.add)
 【youcans 的 OpenCV 例程200篇】15. 圖像的加權加法(cv2.addWeight)
 【youcans 的 OpenCV 例程200篇】16. 不同尺寸的圖像加法
 【youcans 的 OpenCV 例程200篇】17. 兩張圖像的漸變切換
 【youcans 的 OpenCV 例程200篇】18. 圖像的掩模加法
 【youcans 的 OpenCV 例程200篇】19. 圖像的圓形遮罩
 【youcans 的 OpenCV 例程200篇】20. 圖像的按位運算
 【youcans 的 OpenCV 例程200篇】21. 圖像的疊加
 【youcans 的 OpenCV 例程200篇】22. 圖像添加非中文文字
 【youcans 的 OpenCV 例程200篇】23. 圖像添加中文文字
 【youcans 的 OpenCV 例程200篇】24. 圖像的仿射變換
 【youcans 的 OpenCV 例程200篇】25. 圖像的平移
 【youcans 的 OpenCV 例程200篇】26. 圖像的旋轉(以原點為中心)
 【youcans 的 OpenCV 例程200篇】27. 圖像的旋轉(以任意點為中心)
 【youcans 的 OpenCV 例程200篇】28. 圖像的旋轉(直角旋轉)
 【youcans 的 OpenCV 例程200篇】29. 圖像的翻轉(cv2.flip)
 【youcans 的 OpenCV 例程200篇】30. 圖像的縮放(cv2.resize)
 【youcans 的 OpenCV 例程200篇】31. 圖像金字塔(cv2.pyrDown)
 【youcans 的 OpenCV 例程200篇】32. 圖像的扭變(錯切)
 【youcans 的 OpenCV 例程200篇】33. 圖像的復合變換
 【youcans 的 OpenCV 例程200篇】34. 圖像的投影變換
 【youcans 的 OpenCV 例程200篇】35. 圖像的投影變換(邊界填充)
 【youcans 的 OpenCV 例程200篇】36. 直角坐標與極坐標的轉換
 【youcans 的 OpenCV 例程200篇】37. 圖像的灰度化處理和二值化處理
 【youcans 的 OpenCV 例程200篇】38. 圖像的反色變換(圖像反轉)
 【youcans 的 OpenCV 例程200篇】39. 圖像灰度的線性變換
 【youcans 的 OpenCV 例程200篇】40. 圖像分段線性灰度變換
 【youcans 的 OpenCV 例程200篇】41. 圖像的灰度變換(灰度級分層)
 【youcans 的 OpenCV 例程200篇】42. 圖像的灰度變換(比特平面分層)
 【youcans 的 OpenCV 例程200篇】43. 圖像的灰度變換(對數變換)
 【youcans 的 OpenCV 例程200篇】44. 圖像的灰度變換(伽馬變換)
 【youcans 的 OpenCV 例程200篇】45. 圖像的灰度直方圖
 【youcans 的 OpenCV 例程200篇】46. 直方圖均衡化
 【youcans 的 OpenCV 例程200篇】47. 圖像增強—直方圖匹配
 【youcans 的 OpenCV 例程200篇】48. 圖像增強—彩色直方圖匹配
 【youcans 的 OpenCV 例程200篇】49. 圖像增強—局部直方圖處理
 【youcans 的 OpenCV 例程200篇】50. 圖像增強—直方圖統計量圖像增強
 【youcans 的 OpenCV 例程200篇】51. 圖像增強—直方圖反向追蹤
 【youcans 的 OpenCV 例程200篇】52. 圖像的相關與卷積運算
 【youcans 的 OpenCV 例程200篇】53. Scipy 實現圖像二維卷積
 【youcans 的 OpenCV 例程200篇】54. OpenCV 實現圖像二維卷積
 【youcans 的 OpenCV 例程200篇】55. 可分離卷積核
 【youcans 的 OpenCV 例程200篇】56. 低通盒式濾波器
 【youcans 的 OpenCV 例程200篇】57. 低通高斯濾波器
 【youcans 的 OpenCV 例程200篇】58. 非線性濾波—中值濾波
 【youcans 的 OpenCV 例程200篇】59. 非線性濾波—雙邊濾波
 【youcans 的 OpenCV 例程200篇】60. 非線性濾波—聯合雙邊濾波
 【youcans 的 OpenCV 例程200篇】61. 導向濾波(Guided filter)
 【youcans 的 OpenCV 例程200篇】62. 圖像銳化——鈍化掩蔽
 【youcans 的 OpenCV 例程200篇】63. 圖像銳化——Laplacian 算子
 【youcans 的 OpenCV 例程200篇】64. 圖像銳化——Sobel 算子
 【youcans 的 OpenCV 例程200篇】65. 圖像銳化——Scharr 算子
 【youcans 的 OpenCV 例程200篇】66. 圖像濾波之低通/高通/帶阻/帶通
 【youcans 的 OpenCV 例程200篇】67. 空間域圖像增強的綜合應用
 【youcans 的 OpenCV 例程200篇】68. 空間域圖像增強的綜合應用
 【youcans 的 OpenCV 例程200篇】69. 連續非周期信號的傅立葉系數
 【youcans 的 OpenCV 例程200篇】70. 一維連續函數的傅里葉變換
 【youcans 的 OpenCV 例程200篇】71. 連續函數的取樣
 【youcans 的 OpenCV 例程200篇】72. 一維離散傅里葉變換
 【youcans 的 OpenCV 例程200篇】73. 二維連續傅里葉變換
 【youcans 的 OpenCV 例程200篇】74. 圖像的抗混疊
 【youcans 的 OpenCV 例程200篇】75. Numpy 實現圖像傅里葉變換
 【youcans 的 OpenCV 例程200篇】76. OpenCV 實現圖像傅里葉變換
 【youcans 的 OpenCV 例程200篇】77. OpenCV 實現快速傅里葉變換
 【youcans 的 OpenCV 例程200篇】78. 頻率域圖像濾波基礎
 【youcans 的 OpenCV 例程200篇】79. 頻率域圖像濾波的基本步驟
 【youcans 的 OpenCV 例程200篇】80. 頻率域圖像濾波詳細步驟
 【youcans 的 OpenCV 例程200篇】81. 頻率域高斯低通濾波器
 【youcans 的 OpenCV 例程200篇】82. 頻率域巴特沃斯低通濾波器
 【youcans 的 OpenCV 例程200篇】83. 頻率域低通濾波:印刷文本字符修復
 【youcans 的 OpenCV 例程200篇】84. 由低通濾波器得到高通濾波器
 【youcans 的 OpenCV 例程200篇】85. 頻率域高通濾波器的應用
 【youcans 的 OpenCV 例程200篇】86. 頻率域濾波應用:指紋圖像處理
 【youcans 的 OpenCV 例程200篇】87. 頻率域鈍化掩蔽
 【youcans 的 OpenCV 例程200篇】88. 頻率域拉普拉斯高通濾波
 【youcans 的 OpenCV 例程200篇】89. 帶阻濾波器的傳遞函數
 【youcans 的 OpenCV 例程200篇】90. 頻率域陷波濾波器
 【youcans 的 OpenCV 例程200篇】91. 高斯噪聲、瑞利噪聲、愛爾蘭噪聲
 【youcans 的 OpenCV 例程200篇】92. 指數噪聲、均勻噪聲、椒鹽噪聲
 【youcans 的 OpenCV 例程200篇】93. 噪聲模型的直方圖
 【youcans 的 OpenCV 例程200篇】94. 算術平均濾波器
 【youcans 的 OpenCV 例程200篇】95. 幾何均值濾波器
 【youcans 的 OpenCV 例程200篇】96. 諧波平均濾波器
 【youcans 的 OpenCV 例程200篇】97. 反諧波平均濾波器
 【youcans 的 OpenCV 例程200篇】98. 統計排序濾波器
 【youcans 的 OpenCV 例程200篇】99. 修正阿爾法均值濾波器
 【youcans 的 OpenCV 例程200篇】100. 自適應局部降噪濾波器
 【youcans 的 OpenCV 例程200篇】101. 自適應中值濾波器
 【youcans 的 OpenCV 例程200篇】102. 陷波帶阻濾波器的傳遞函數
 【youcans 的 OpenCV 例程200篇】103. 陷波帶阻濾波器消除周期噪聲干擾
 【youcans 的 OpenCV 例程200篇】104. 運動模糊退化模型
 【youcans 的 OpenCV 例程200篇】105. 湍流模糊退化模型
 【youcans 的 OpenCV 例程200篇】106. 退化圖像的逆濾波
 【youcans 的 OpenCV 例程200篇】107. 退化圖像的維納濾波
總結
以上是生活随笔為你收集整理的【youcans 的 OpenCV 例程 200 篇】107. 退化图像的维纳滤波的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: Python数模笔记-StatsMode
 - 下一篇: 【OpenCV 例程200篇】02. 图