【youcans 的 OpenCV 例程 200 篇】103. 陷波带阻滤波器消除周期噪声干扰
歡迎關注 『youcans 的 OpenCV 例程 200 篇』 系列,持續(xù)更新中
歡迎關注 『youcans 的 OpenCV學習課』 系列,持續(xù)更新中
【youcans 的 OpenCV 例程 200 篇】103. 陷波帶阻濾波器消除周期噪聲干擾
4.1 陷波濾波器(Notch Filter)
陷波濾波器阻止或通過預定的頻率矩形鄰域中的頻率,可以很好地復原被周期性噪聲干擾的圖像。
陷波濾波器可以在某一個頻率點迅速衰減輸入信號,以達到阻礙此頻率信號通過的濾波效果的濾波器。
陷波帶阻濾波器的傳遞函數(shù)是中心平移到陷波中心的各個高通濾波器的乘積:
HNR(u,v)=∏k=1QHk(u,v)H?k(u,v)H_{NR}(u,v) = \prod_{k=1}^Q H_k(u,v) H_{-k}(u,v) HNR?(u,v)=k=1∏Q?Hk?(u,v)H?k?(u,v)
其中,濾波器的距離計算公式為:
Dk(u,v)=(u?M/2?uk)2+(v?N/2?vk)2D?k(u,v)=(u?M/2+uk)2+(v?N/2+vk)2D_k(u,v) = \sqrt{(u-M/2-u_k)^2 + (v-N/2-v_k)^2} \\ D_{-k}(u,v) = \sqrt{(u-M/2+u_k)^2 + (v-N/2+v_k)^2} Dk?(u,v)=(u?M/2?uk?)2+(v?N/2?vk?)2?D?k?(u,v)=(u?M/2+uk?)2+(v?N/2+vk?)2?
例如,具有 3個陷波對的 n 階巴特沃斯陷波帶阻濾波器為:
HNR(u,v)=∏k=13[11+[D0k/Dk(u,v)]n][11+[D?k/Dk(u,v)]n]H_{NR}(u,v) = \prod_{k=1}^3 [\frac{1}{1+[D_{0k}/D_k(u,v)]^n}] [\frac{1}{1+[D_{-k}/D_k(u,v)]^n}] HNR?(u,v)=k=1∏3?[1+[D0k?/Dk?(u,v)]n1?][1+[D?k?/Dk?(u,v)]n1?]
例程 9.17:陷波帶阻濾波器消除周期噪聲干擾
# 9.17: 陷波帶阻濾波器消除周期噪聲干擾def butterworthNRFilter(img, radius=10, uk=10, vk=10, n=2): # 巴特沃斯陷波帶阻濾波器M, N = img.shape[1], img.shape[0]u, v = np.meshgrid(np.arange(M), np.arange(N))Dm = np.sqrt((u - M//2 - uk)**2 + (v - N//2 - vk)**2)Dp = np.sqrt((u - M//2 + uk)**2 + (v - N//2 + vk)**2)D0 = radiusn2 = 2 * nkernel = (1 / (1 + (D0 / (Dm + 1e-6))**n2)) * (1 / (1 + (D0 / (Dp + 1e-6))**n2))return kernel# (1) 讀取原始圖像img = cv2.imread("../images/Fig0505a.tif", flags=0) # flags=0 讀取為灰度圖像imgFloat32 = np.float32(img) # 將圖像轉換成 float32rows, cols = img.shape[:2] # 圖片的高度和寬度fig = plt.figure(figsize=(9, 6))plt.subplot(231), plt.title("Original image"), plt.axis('off'), plt.imshow(img, cmap='gray')# (2) 中心化, centralized 2d array f(x,y) * (-1)^(x+y)mask = np.ones(img.shape)mask[1::2, ::2] = -1mask[::2, 1::2] = -1fImage = imgFloat32 * mask # f(x,y) * (-1)^(x+y)# (3) 快速傅里葉變換rPadded = cv2.getOptimalDFTSize(rows) # 最優(yōu) DFT 擴充尺寸cPadded = cv2.getOptimalDFTSize(cols) # 用于快速傅里葉變換dftImage = np.zeros((rPadded, cPadded, 2), np.float32) # 對原始圖像進行邊緣擴充dftImage[:rows, :cols, 0] = fImage # 邊緣擴充,下側和右側補0cv2.dft(dftImage, dftImage, cv2.DFT_COMPLEX_OUTPUT) # 快速傅里葉變換dftAmp = cv2.magnitude(dftImage[:,:,0], dftImage[:,:,1]) # 傅里葉變換的幅度譜 (rPad, cPad)dftAmpLog = np.log(1.0 + dftAmp) # 幅度譜對數(shù)變換,以便于顯示dftAmpNorm = np.uint8(cv2.normalize(dftAmpLog, None, 0, 255, cv2.NORM_MINMAX)) # 歸一化為 [0,255]plt.subplot(232), plt.axis('off'), plt.title("DFT spectrum")plt.imshow(dftAmpNorm, cmap='gray')plt.arrow(445, 370, 25, 30, width=5, length_includes_head=True, shape='full') # 在圖像上加上箭頭plt.arrow(550, 490, -25, -30, width=5, length_includes_head=True, shape='full') # 在圖像上加上箭頭# (4) 構建陷波帶阻濾波器 傳遞函數(shù)BRFilter = butterworthNRFilter(dftImage, radius=15, uk=25, vk=16, n=3) # 巴特沃斯陷波帶阻濾波器, 處理周期噪聲plt.subplot(233), plt.axis('off'), plt.title("Butterworth notch resist filter")plt.imshow(BRFilter, cmap='gray')# (5) 在頻率域修改傅里葉變換: 傅里葉變換 點乘 陷波帶阻濾波器dftFilter = np.zeros(dftImage.shape, dftImage.dtype) # 快速傅里葉變換的尺寸(優(yōu)化尺寸)for i in range(2):dftFilter[:rPadded, :cPadded, i] = dftImage[:rPadded, :cPadded, i] * BRFilter# 頻域濾波傅里葉變換的傅里葉譜nrfDftAmp = cv2.magnitude(dftFilter[:, :, 0], dftFilter[:, :, 1]) # 傅里葉變換的幅度譜nrfDftAmpLog = np.log(1.0 + nrfDftAmp) # 幅度譜對數(shù)變換,以便于顯示nrfDftAmpNorm = np.uint8(cv2.normalize(nrfDftAmpLog, None, 0, 255, cv2.NORM_MINMAX)) # 歸一化為 [0,255]plt.subplot(234), plt.axis('off'), plt.title("BNRF DFT Spectrum")plt.imshow(nrfDftAmpNorm, cmap='gray')# (6) 對頻域濾波傅里葉變換 執(zhí)行傅里葉逆變換,并只取實部idft = np.zeros(dftAmp.shape, np.float32) # 快速傅里葉變換的尺寸(優(yōu)化尺寸)cv2.dft(dftFilter, idft, cv2.DFT_REAL_OUTPUT + cv2.DFT_INVERSE + cv2.DFT_SCALE)# (7) 中心化, centralized 2d array g(x,y) * (-1)^(x+y)mask2 = np.ones(dftAmp.shape)mask2[1::2, ::2] = -1mask2[::2, 1::2] = -1idftCen = idft * mask2 # g(x,y) * (-1)^(x+y)plt.subplot(235), plt.axis('off'), plt.title("g(x,y)*(-1)^(x+y)")plt.imshow(idftCen, cmap='gray')# (8) 截取左上角,大小和輸入圖像相等idftCenClip = np.clip(idftCen, 0, 255) # 截斷函數(shù),將數(shù)值限制在 [0,255]imgFiltered = idftCenClip.astype(np.uint8)imgFiltered = imgFiltered[:rows, :cols]plt.subplot(236), plt.axis('off'), plt.title("BNRF filtered image")plt.imshow(imgFiltered, cmap='gray')plt.tight_layout()plt.show()print("image.shape:{}".format(img.shape))print("imgFloat32.shape:{}".format(imgFloat32.shape))print("dftImage.shape:{}".format(dftImage.shape))print("dftAmp.shape:{}".format(dftAmp.shape))print("idft.shape:{}".format(idft.shape))print("dftFilter.shape:{}".format(dftFilter.shape))print("imgFiltered.shape:{}".format(imgFiltered.shape))程序說明:
傅立葉變換的頻譜反映能量分布。通過中心化移頻到原點以后,傅里葉變換的頻譜圖是以原點為中心對稱分布的。中心化不僅可以清晰地看出圖像頻率分布,還可以分離出有周期性規(guī)律的干擾信號。
本例程中的圖像受到正弦噪聲的干擾,從中心化的頻譜圖可以看出,除原點以外還存在一對對稱分布的亮點(箭頭指示處),這就干擾噪聲產生的。因此,在該亮點位置設計陷波帶阻濾波器,可以消除干擾正弦噪聲。
(本節(jié)完)
版權聲明:
youcans@xupt 原創(chuàng)作品,轉載必須標注原文鏈接
Copyright 2021 youcans, XUPT
Crated:2022-2-10
歡迎關注 『youcans 的 OpenCV 例程 200 篇』 系列,持續(xù)更新中
歡迎關注 『youcans 的 OpenCV學習課』 系列,持續(xù)更新中
【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. 圖像的創(chuàng)建(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. 圖像的灰度變換(對數(shù)變換)
【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. 圖像增強—直方圖統(tǒng)計量圖像增強
【youcans 的 OpenCV 例程200篇】51. 圖像增強—直方圖反向追蹤
【youcans 的 OpenCV 例程200篇】52. 圖像的相關與卷積運算
【youcans 的 OpenCV 例程200篇】53. Scipy 實現(xiàn)圖像二維卷積
【youcans 的 OpenCV 例程200篇】54. OpenCV 實現(xiàn)圖像二維卷積
【youcans 的 OpenCV 例程200篇】55. 可分離卷積核
【youcans 的 OpenCV 例程200篇】56. 低通盒式濾波器
【youcans 的 OpenCV 例程200篇】57. 低通高斯濾波器
【youcans 的 OpenCV 例程200篇】58. 非線性濾波—中值濾波
【youcans 的 OpenCV 例程200篇】59. 非線性濾波—雙邊濾波
【youcans 的 OpenCV 例程200篇】60. 非線性濾波—聯(lián)合雙邊濾波
【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. 連續(xù)非周期信號的傅立葉系數(shù)
【youcans 的 OpenCV 例程200篇】70. 一維連續(xù)函數(shù)的傅里葉變換
【youcans 的 OpenCV 例程200篇】71. 連續(xù)函數(shù)的取樣
【youcans 的 OpenCV 例程200篇】72. 一維離散傅里葉變換
【youcans 的 OpenCV 例程200篇】73. 二維連續(xù)傅里葉變換
【youcans 的 OpenCV 例程200篇】74. 圖像的抗混疊
【youcans 的 OpenCV 例程200篇】75. Numpy 實現(xiàn)圖像傅里葉變換
【youcans 的 OpenCV 例程200篇】76. OpenCV 實現(xiàn)圖像傅里葉變換
【youcans 的 OpenCV 例程200篇】77. OpenCV 實現(xiàn)快速傅里葉變換
【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. 帶阻濾波器的傳遞函數(shù)
【youcans 的 OpenCV 例程200篇】90. 頻率域陷波濾波器
【youcans 的 OpenCV 例程200篇】91. 高斯噪聲、瑞利噪聲、愛爾蘭噪聲
【youcans 的 OpenCV 例程200篇】92. 指數(shù)噪聲、均勻噪聲、椒鹽噪聲
【youcans 的 OpenCV 例程200篇】93. 噪聲模型的直方圖
【youcans 的 OpenCV 例程200篇】94. 算術平均濾波器
【youcans 的 OpenCV 例程200篇】95. 幾何均值濾波器
【youcans 的 OpenCV 例程200篇】96. 諧波平均濾波器
【youcans 的 OpenCV 例程200篇】97. 反諧波平均濾波器
【youcans 的 OpenCV 例程200篇】98. 統(tǒng)計排序濾波器
【youcans 的 OpenCV 例程200篇】99. 修正阿爾法均值濾波器
【youcans 的 OpenCV 例程200篇】100. 自適應局部降噪濾波器
【youcans 的 OpenCV 例程200篇】101. 自適應中值濾波器
【youcans 的 OpenCV 例程200篇】102. 陷波帶阻濾波器的傳遞函數(shù)
【youcans 的 OpenCV 例程200篇】103. 陷波帶阻濾波器消除周期噪聲干擾
【youcans 的 OpenCV 例程200篇】104. 運動模糊退化模型
總結
以上是生活随笔為你收集整理的【youcans 的 OpenCV 例程 200 篇】103. 陷波带阻滤波器消除周期噪声干扰的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python入门进阶篇(六)字典的介绍
- 下一篇: Linux配置scheme环境,用 Xc