当前位置:   article > 正文

实验四 图像频域平滑与锐化(Python实现)_平滑去噪 锐化python

平滑去噪 锐化python

一、实验目的与要求

  1. 了解频域变换过程,掌握频域变换特点
  2. 熟练掌握频域滤波中常用的平滑和锐化滤波器,能够对不同要求的图像进行滤波处理,体会并正确评价滤波效果,了解不同滤波方式的使用场合,能够从理论上作出合理的解释。

二、实验内容

  1. 图像频域平滑(去噪):使用自生成图像(包含白色区域,黑色区域,并且部分区域添加椒盐噪声),然后进行傅里叶变换,并且分别使用理想低通滤波器、巴特沃斯低通滤波器、指数低通滤波器和梯形低通滤波器(至少使用两种低通滤波器),显示滤波前后的频域能量分布图,空间图像。分析不同滤波器对噪声、边缘的处理效果及其优缺点。
  2. 图像频域平滑(锐化):选择一幅图像,例如rice.png,分别使用理想高通滤波器、巴特沃斯高通滤波器、指数高通滤波器和梯形高通滤波器(至少使用两种高通滤波器),显示滤波前后的频域能量分布图,空间图像。分析不同滤波器处理效果及其优缺点。

三、实验图像

四、实验代码

1.图像频域平滑(去噪):使用自生成图像(包含白色区域,黑色区域,并且部分区域添加椒盐噪声),然后进行傅里叶变换,并且分别使用理想低通滤波器、巴特沃斯低通滤波器、指数低通滤波器和梯形低通滤波器(至少使用两种低通滤波器),显示滤波前后的频域能量分布图,空间图像。分析不同滤波器对噪声、边缘的处理效果及其优缺点。

  1. import random
  2. import numpy as np
  3. import matplotlib.pyplot as plt
  4. def sp_noise(image, prob):
  5. """
  6. 添加椒盐噪声
  7. prob:噪声比例
  8. """
  9. output = np.zeros(image.shape, np.uint8)
  10. thres = 1 - prob
  11. for i in range(image.shape[0]):
  12. for j in range(image.shape[1]):
  13. rdn = random.random()
  14. if rdn < prob:
  15. output[i][j] = 0
  16. elif rdn > thres:
  17. output[i][j] = 255
  18. else:
  19. output[i][j] = image[i][j]
  20. return output
  21. def ideal_low_filter(img, D0):
  22. """
  23. 生成一个理想低通滤波器(并返回)
  24. """
  25. h, w = img.shape[:2]
  26. filter_img = np.ones((h, w))
  27. u = np.fix(h / 2)
  28. v = np.fix(w / 2)
  29. for i in range(h):
  30. for j in range(w):
  31. d = np.sqrt((i - u) ** 2 + (j - v) ** 2)
  32. filter_img[i, j] = 0 if d > D0 else 1
  33. return filter_img
  34. def butterworth_low_filter(img, D0, rank):
  35. """
  36. 生成一个Butterworth低通滤波器(并返回)
  37. """
  38. h, w = img.shape[:2]
  39. filter_img = np.zeros((h, w))
  40. u = np.fix(h / 2)
  41. v = np.fix(w / 2)
  42. for i in range(h):
  43. for j in range(w):
  44. d = np.sqrt((i - u) ** 2 + (j - v) ** 2)
  45. filter_img[i, j] = 1 / (1 + 0.414 * (d / D0) ** (2 * rank))
  46. return filter_img
  47. def exp_low_filter(img, D0, rank):
  48. """
  49. 生成一个指数低通滤波器(并返回)
  50. """
  51. h, w = img.shape[:2]
  52. filter_img = np.zeros((h, w))
  53. u = np.fix(h / 2)
  54. v = np.fix(w / 2)
  55. for i in range(h):
  56. for j in range(w):
  57. d = np.sqrt((i - u) ** 2 + (j - v) ** 2)
  58. filter_img[i, j] = np.exp(np.log(1 / np.sqrt(2)) * (d / D0) ** (2 * rank))
  59. return filter_img
  60. def filter_use(img, filter):
  61. """
  62. 将图像img与滤波器filter结合,生成对应的滤波图像
  63. """
  64. # 首先进行傅里叶变换
  65. f = np.fft.fft2(img)
  66. f_center = np.fft.fftshift(f)
  67. # 应用滤波器进行反变换
  68. S = np.multiply(f_center, filter) # 频率相乘——l(u,v)*H(u,v)
  69. f_origin = np.fft.ifftshift(S) # 将低频移动到原来的位置
  70. f_origin = np.fft.ifft2(f_origin) # 使用ifft2进行傅里叶的逆变换
  71. f_origin = np.abs(f_origin) # 设置区间
  72. return f_origin
  73. def DFT_show(img):
  74. """
  75. 对传入的图像进行傅里叶变换,生成频域图像
  76. """
  77. f = np.fft.fft2(img) # 使用numpy进行傅里叶变换
  78. fshift = np.fft.fftshift(f) # 把零频率分量移到中间
  79. result = np.log(1 + abs(fshift))
  80. return result
  81. # %%自生成实验图像,并添加椒盐噪声
  82. src = np.zeros((300, 300), dtype=np.uint8)
  83. salt_area1 = np.ones((130, 130), dtype=np.uint8)
  84. salt_area1 = sp_noise(salt_area1, 0.04)
  85. salt_area2 = np.zeros((130, 130), dtype=np.uint8)
  86. salt_area2 = sp_noise(salt_area2, 0.04)
  87. for i in range(10, 140):
  88. for j in range(10, 140):
  89. src[i, j + 75] = 255
  90. src[i + 150, j] = salt_area1[i - 10, j - 10] * 255
  91. src[i + 150, j + 150] = salt_area2[i - 10, j - 10]
  92. my_img = src.copy()
  93. # %%——1.理想低通滤波——
  94. ideal_filter = ideal_low_filter(my_img, D0=40) # 生成理想低通滤波器
  95. ideal_img = filter_use(my_img, ideal_filter) # 将滤波器应用到图像,生成理想低通滤波图像
  96. fre_img = DFT_show(my_img) # 原图的频域图像
  97. fre_ideal_img = DFT_show(ideal_img) # 理想低通滤波图像的频域图像
  98. plt.figure(dpi=300)
  99. plt.subplot(221)
  100. plt.title('原图')
  101. plt.imshow(my_img, cmap=plt.cm.gray)
  102. plt.axis("off")
  103. plt.subplot(222)
  104. plt.title("理想低通滤波图像")
  105. plt.imshow(ideal_img, cmap=plt.cm.gray)
  106. plt.axis("off")
  107. plt.subplot(223)
  108. plt.title('原图频域图')
  109. plt.imshow(fre_img, cmap=plt.cm.gray)
  110. plt.axis("off")
  111. plt.subplot(224)
  112. plt.title("理想低通滤波图像的频域图")
  113. plt.imshow(fre_ideal_img, cmap=plt.cm.gray)
  114. plt.axis("off")
  115. plt.show()
  116. # %% ——2.巴特沃斯低通滤波器——
  117. my_img = src.copy()
  118. butterworth_filter = butterworth_low_filter(my_img, D0=10, rank=2) # 生成Butterworth低通滤波器
  119. butterworth_img = filter_use(my_img, butterworth_filter) # 将滤波器应用到图像,生成Butterworth低通滤波图像
  120. fre_butterworth_img = DFT_show(butterworth_img) # Butterworth低通滤波图像的频域图像
  121. plt.figure(dpi=300)
  122. plt.subplot(221)
  123. plt.title('原图')
  124. plt.imshow(my_img, cmap=plt.cm.gray)
  125. plt.axis("off")
  126. plt.subplot(222)
  127. plt.title("Butterworth低通滤波图像")
  128. plt.imshow(butterworth_img, cmap=plt.cm.gray)
  129. plt.axis("off")
  130. plt.subplot(223)
  131. plt.title('原图频域图')
  132. plt.imshow(fre_img, cmap=plt.cm.gray)
  133. plt.axis("off")
  134. plt.subplot(224)
  135. plt.title("Butterworth低通滤波图像的频域图")
  136. plt.imshow(fre_butterworth_img, cmap=plt.cm.gray)
  137. plt.axis("off")
  138. plt.show()
  139. # %% ——3.指数低通滤波器——
  140. my_img = src.copy()
  141. exp_filter = exp_low_filter(my_img, D0=20, rank=2) # 生成指数低通滤波器
  142. exp_img = filter_use(my_img, exp_filter) # 将滤波器应用到图像,生成指数低通滤波图像
  143. fre_exp_img = DFT_show(exp_img) # 指数低通滤波图像的频域图像
  144. plt.figure(dpi=300)
  145. plt.subplot(221)
  146. plt.title('原图')
  147. plt.imshow(my_img, cmap=plt.cm.gray)
  148. plt.axis("off")
  149. plt.subplot(222)
  150. plt.title("指数低通滤波图像")
  151. plt.imshow(exp_img, cmap=plt.cm.gray)
  152. plt.axis("off")
  153. plt.subplot(223)
  154. plt.title('原图频域图')
  155. plt.imshow(fre_img, cmap=plt.cm.gray)
  156. plt.axis("off")
  157. plt.subplot(224)
  158. plt.title("指数低通滤波图像的频域图")
  159. plt.imshow(fre_exp_img, cmap=plt.cm.gray)
  160. plt.axis("off")
  161. plt.show()

 

2.图像频域平滑(锐化):选择一幅图像,例如rice.png,分别使用理想高通滤波器、巴特沃斯高通滤波器、指数高通滤波器和梯形高通滤波器(至少使用两种高通滤波器),显示滤波前后的频域能量分布图,空间图像。分析不同滤波器处理效果及其优缺点。

  1. import numpy as np
  2. import matplotlib.pyplot as plt
  3. import cv2 as cv
  4. def ideal_high_filter(img, D0):
  5. """
  6. 生成一个理想高通滤波器(并返回)
  7. """
  8. h, w = img.shape[:2]
  9. filter_img = np.zeros((h, w))
  10. u = np.fix(h / 2)
  11. v = np.fix(w / 2)
  12. for i in range(h):
  13. for j in range(w):
  14. d = np.sqrt((i - u) ** 2 + (j - v) ** 2)
  15. filter_img[i, j] = 0 if d < D0 else 1
  16. return filter_img
  17. def butterworth_high_filter(img, D0, rank):
  18. """
  19. 生成一个Butterworth高通滤波器(并返回)
  20. """
  21. h, w = img.shape[:2]
  22. filter_img = np.zeros((h, w))
  23. u = np.fix(h / 2)
  24. v = np.fix(w / 2)
  25. for i in range(h):
  26. for j in range(w):
  27. d = np.sqrt((i - u) ** 2 + (j - v) ** 2)
  28. filter_img[i, j] = 1 / (1 + (D0 / d) ** (2 * rank))
  29. return filter_img
  30. def exp_high_filter(img, D0, rank):
  31. """
  32. 生成一个指数高通滤波器(并返回)
  33. """
  34. h, w = img.shape[:2]
  35. filter_img = np.zeros((h, w))
  36. u = np.fix(h / 2)
  37. v = np.fix(w / 2)
  38. for i in range(h):
  39. for j in range(w):
  40. d = np.sqrt((i - u) ** 2 + (j - v) ** 2)
  41. filter_img[i, j] = np.exp((-1) * (D0 / d) ** rank)
  42. return filter_img
  43. def filter_use(img, filter):
  44. """
  45. 将图像img与滤波器filter结合,生成对应的滤波图像
  46. """
  47. # 首先进行傅里叶变换
  48. f = np.fft.fft2(img)
  49. f_center = np.fft.fftshift(f)
  50. # 应用滤波器进行反变换
  51. S = np.multiply(f_center, filter) # 频率相乘——l(u,v)*H(u,v)
  52. f_origin = np.fft.ifftshift(S) # 将低频移动到原来的位置
  53. f_origin = np.fft.ifft2(f_origin) # 使用ifft2进行傅里叶的逆变换
  54. f_origin = np.abs(f_origin) # 设置区间
  55. f_origin = f_origin / np.max(f_origin.all())
  56. return f_origin
  57. def DFT_show(img):
  58. """
  59. 对传入的图像进行傅里叶变换,生成频域图像
  60. """
  61. f = np.fft.fft2(img) # 使用numpy进行傅里叶变换
  62. fshift = np.fft.fftshift(f) # 把零频率分量移到中间
  63. result = np.log(1 + abs(fshift))
  64. return result
  65. src = cv.imread("wire.bmp", 0)
  66. my_img = src.copy()
  67. # %%——1.理想高通滤波——
  68. ideal_filter = ideal_high_filter(my_img, D0=40) # 生成理想高通滤波器
  69. ideal_img = filter_use(my_img, ideal_filter) # 将滤波器应用到图像,生成理想高通滤波图像
  70. fre_img = DFT_show(my_img) # 原图的频域图像
  71. fre_ideal_img = DFT_show(ideal_img) # 理想高通滤波图像的频域图像
  72. plt.figure(dpi=300)
  73. plt.subplot(221)
  74. plt.title('原图')
  75. plt.imshow(my_img, cmap=plt.cm.gray)
  76. plt.axis("off")
  77. plt.subplot(222)
  78. plt.title("理想高通滤波图像")
  79. plt.imshow(ideal_img, cmap=plt.cm.gray)
  80. plt.axis("off")
  81. plt.subplot(223)
  82. plt.title('原图频域图')
  83. plt.imshow(fre_img, cmap=plt.cm.gray)
  84. plt.axis("off")
  85. plt.subplot(224)
  86. plt.title("理想高通滤波图像的频域图")
  87. plt.imshow(fre_ideal_img, cmap=plt.cm.gray)
  88. plt.axis("off")
  89. plt.show()
  90. # %% ——2.巴特沃斯高通滤波器——
  91. my_img = src.copy()
  92. butterworth_filter = butterworth_high_filter(my_img, D0=40, rank=2) # 生成Butterworth高通滤波器
  93. butterworth_img = filter_use(my_img, butterworth_filter) # 将滤波器应用到图像,生成Butterworth高通滤波图像
  94. fre_butterworth_img = DFT_show(butterworth_img) # Butterworth高通滤波图像的频域图像
  95. plt.figure(dpi=300)
  96. plt.subplot(221)
  97. plt.title('原图')
  98. plt.imshow(my_img, cmap=plt.cm.gray)
  99. plt.axis("off")
  100. plt.subplot(222)
  101. plt.title("Butterworth高通滤波图像")
  102. plt.imshow(butterworth_img, cmap=plt.cm.gray)
  103. plt.axis("off")
  104. plt.subplot(223)
  105. plt.title('原图频域图')
  106. plt.imshow(fre_img, cmap=plt.cm.gray)
  107. plt.axis("off")
  108. plt.subplot(224)
  109. plt.title("Butterworth高通滤波图像的频域图")
  110. plt.imshow(fre_butterworth_img, cmap=plt.cm.gray)
  111. plt.axis("off")
  112. plt.show()
  113. # %% ——3.指数高通滤波器——
  114. my_img = src.copy()
  115. exp_filter = exp_high_filter(my_img, D0=40, rank=2) # 生成指数高通滤波器
  116. exp_img = filter_use(my_img, exp_filter) # 将滤波器应用到图像,生成指数高通滤波图像
  117. fre_exp_img = DFT_show(exp_img) # 指数高通滤波图像的频域图像
  118. plt.figure(dpi=300)
  119. plt.subplot(221)
  120. plt.title('原图')
  121. plt.imshow(my_img, cmap=plt.cm.gray)
  122. plt.axis("off")
  123. plt.subplot(222)
  124. plt.title("指数高通滤波图像")
  125. plt.imshow(exp_img, cmap=plt.cm.gray)
  126. plt.axis("off")
  127. plt.subplot(223)
  128. plt.title('原图频域图')
  129. plt.imshow(fre_img, cmap=plt.cm.gray)
  130. plt.axis("off")
  131. plt.subplot(224)
  132. plt.title("指数高通滤波图像的频域图")
  133. plt.imshow(fre_exp_img, cmap=plt.cm.gray)
  134. plt.axis("off")
  135. plt.show()

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/78264
推荐阅读
相关标签
  

闽ICP备14008679号