标题

  • 统计排序滤波器
    • 中值、最大值、最小值、中点 滤波器
    • 修正阿尔法均值滤波器

统计排序滤波器

中值、最大值、最小值、中点 滤波器

f^(x,y)=median{g(r,c)}(5.27)\hat{f}(x, y) = \text{median} \{g(r,c)\} \tag{5.27}f^​(x,y)=median{g(r,c)}(5.27)
f^(x,y))=max{g(r,c)}(5.28)\hat{f}(x, y)) = \text{max} \{g(r,c)\} \tag{5.28}f^​(x,y))=max{g(r,c)}(5.28)
f^(x,y)=min{g(r,c)}(5.29)\hat{f}(x, y) = \text{min} \{g(r,c)\} \tag{5.29}f^​(x,y)=min{g(r,c)}(5.29)
f^(x,y)=12[max{g(r,c)}+min{g(r,c)}](5.30)\hat{f}(x, y) = \frac{1}{2}\big[\text{max}\{g(r,c)\} + \text{min}\{g(r,c)\} \big] \tag{5.30}f^​(x,y)=21​[max{g(r,c)}+min{g(r,c)}](5.30)

中值滤波器应用广泛,因为与大小相同的线性平滑滤波器相比,它能有效地降低某些随机噪声,且模糊度要小得多。对于单极和双极冲激噪声,中值滤波器的效果更好,但多次使用中值滤波器会使用图像模糊。

最大值滤波器可用于找到图像中的最亮点,或用于消弱与明亮区域相信的暗色区域。此外由于胡椒噪声的值很低,因此可用这种滤波器来降低胡椒噪声

最小值滤波器用于找到图像中的最暗点,或用于削弱与暗色区域的明亮区域。此外,还可通过最小运算降低盐粒噪声

中点滤波器是统计排序滤波器与平均滤波器的结合。它最适合于处理随机分布的噪声,如高斯噪声或均匀噪声

修正阿尔法均值滤波器

f^(x,y)=1mn−d∑g(r,c)(5.31)\hat{f}(x, y) = \frac{1}{mn - d} \sum g(r,c) \tag{5.31}f^​(x,y)=mn−d1​∑g(r,c)(5.31)

d的取值范围是从0到mn−10到mn - 10到mn−1。 当d=0d=0d=0时,简化为算术平均滤波器。当d=mn−1d=mn-1d=mn−1,那么为中值滤波器。ddd取其它值时,修正阿尔法滤波器适合于处理多种混合噪声,如高斯噪声和椒盐噪声。

使用时需要选取合适的ddd值,才能得到比较好的结果,不同的值差别也很大。

# 中值、最大值、最小值、中点 滤波器
def median_filter(image, kernel):"""median filter, math: $$\hat{f}(x, y) = \text{median} \{g(r,c)\}$$param: image:  input image for denoisingparam: kernel: input kernel, actually only use kernel shape, just want to keep the format as mean filterreturn: image after median filter"""height, width = image.shape[:2]m, n = kernel.shape[:2]padding_h = int((m -1)/2)padding_w = int((n -1)/2)# 这样的填充方式,可以奇数核或者偶数核都能正确填充image_pad = np.pad(image, ((padding_h, m - 1 - padding_h), \(padding_w, n - 1 - padding_w)), mode="edge")image_result = np.zeros(image.shape)for i in range(height):for j in range(width):temp = image_pad[i:i + m, j:j + n]image_result[i, j] = np.median(temp)return image_resultdef max_filter(image, kernel):"""max filter, math: $$\hat{f}(x, y)) = \text{max} \{g(r,c)\}$$param: image:  input image for denoisingparam: kernel: input kernel, actually only use kernel shape, just want to keep the format as mean filterreturn: image after max filter"""height, width = image.shape[:2]m, n = kernel.shape[:2]padding_h = int((m -1)/2)padding_w = int((n -1)/2)# 这样的填充方式,可以奇数核或者偶数核都能正确填充image_pad = np.pad(image, ((padding_h, m - 1 - padding_h), \(padding_w, n - 1 - padding_w)), mode="constant", constant_values=0)img_result = np.zeros(image.shape)for i in range(height):for j in range(width):temp = image_pad[i:i + m, j:j + n]img_result[i, j] = np.max(temp)return img_resultdef min_filter(image, kernel):"""min filter, math: $$\hat{f}(x, y) = \text{min} \{g(r,c)\}$$param: image:  input image for denoisingparam: kernel: input kernel, actually only use kernel shape, just want to keep the format as mean filterreturn: image after min filter"""height, width = image.shape[:2]m, n = kernel.shape[:2]padding_h = int((m -1)/2)padding_w = int((n -1)/2)# 这样的填充方式,可以奇数核或者偶数核都能正确填充image_pad = np.pad(image, ((padding_h, m - 1 - padding_h), \(padding_w, n - 1 - padding_w)), mode="edge", )img_result = np.zeros(image.shape)for i in range(height):for j in range(width):temp = image_pad[i:i + m, j:j + n]img_result[i, j] = np.min(temp)return img_resultdef middle_filter(image, kernel):"""middle filter, math: $$\hat{f}(x, y) = \frac{1}{2}\big[\text{max}\{g(r,c)\} + \text{min}\{g(r,c)\} \big]$$param: image:  input image for denoisingparam: kernel: input kernel, actually only use kernel shape, just want to keep the format as mean filterreturn: image after middle filter"""height, width = image.shape[:2]m, n = kernel.shape[:2]padding_h = int((m -1)/2)padding_w = int((n -1)/2)# 这样的填充方式,可以奇数核或者偶数核都能正确填充image_pad = np.pad(image, ((padding_h, m - 1 - padding_h), \(padding_w, n - 1 - padding_w)), mode="edge")img_result = np.zeros(image.shape)for i in range(height):for j in range(width):temp = image_pad[i:i + m, j:j + n]img_result[i, j] = int(temp.max()/2 + temp.min()/2)return img_result
# 中值、最大值、最小值、中点 滤波器处理胡椒噪声
img_ori = cv2.imread('DIP_Figures/DIP3E_Original_Images_CH05/Fig0508(a)(circuit-board-pepper-prob-pt1).tif', 0) #直接读为灰度图像kernel = np.ones([3, 3])
img_median = median_filter(img_ori, kernel=kernel)
img_max = max_filter(img_ori, kernel=kernel)
img_min = min_filter(img_ori, kernel=kernel)
img_middle = middle_filter(img_ori, kernel=kernel)plt.figure(figsize=(15, 10))plt.subplot(231), plt.imshow(img_ori, 'gray'), plt.title('Original'), plt.xticks([]), plt.yticks([])
plt.subplot(232), plt.imshow(img_median, 'gray'), plt.title('Median filter'), plt.xticks([]), plt.yticks([])
plt.subplot(233), plt.imshow(img_max, 'gray'), plt.title('Max filter'), plt.xticks([]), plt.yticks([])
plt.subplot(234), plt.imshow(img_min, 'gray'), plt.title('Min filter'), plt.xticks([]), plt.yticks([])
plt.subplot(235), plt.imshow(img_middle, 'gray'), plt.title('Middle filter'), plt.xticks([]), plt.yticks([])
plt.tight_layout()
plt.show()

# 中值、最大值、最小值、中点 滤波器处理盐粒噪声
img_ori = cv2.imread('DIP_Figures/DIP3E_Original_Images_CH05/Fig0508(b)(circuit-board-salt-prob-pt1).tif', 0) #直接读为灰度图像kernel = np.ones([3, 3])
img_median = median_filter(img_ori, kernel=kernel)
img_max = max_filter(img_ori, kernel=kernel)
img_min = min_filter(img_ori, kernel=kernel)
img_middle = middle_filter(img_ori, kernel=kernel)plt.figure(figsize=(15, 10))plt.subplot(231), plt.imshow(img_ori, 'gray'), plt.title('Original'), plt.xticks([]), plt.yticks([])
plt.subplot(232), plt.imshow(img_median, 'gray'), plt.title('Median filter'), plt.xticks([]), plt.yticks([])
plt.subplot(233), plt.imshow(img_max, 'gray'), plt.title('Max filter'), plt.xticks([]), plt.yticks([])
plt.subplot(234), plt.imshow(img_min, 'gray'), plt.title('Min filter'), plt.xticks([]), plt.yticks([])
plt.subplot(235), plt.imshow(img_middle, 'gray'), plt.title('Middle filter'), plt.xticks([]), plt.yticks([])
plt.tight_layout()
plt.show()

# 中值、最大值、最小值、中点 滤波器处理高斯噪声
img_ori = cv2.imread('DIP_Figures/DIP3E_Original_Images_CH05/Fig0507(b)(ckt-board-gauss-var-400).tif', 0) #直接读为灰度图像kernel = np.ones([3, 3])
img_median = median_filter(img_ori, kernel=kernel)
img_max = max_filter(img_ori, kernel=kernel)
img_min = min_filter(img_ori, kernel=kernel)
img_middle = middle_filter(img_ori, kernel=kernel)plt.figure(figsize=(15, 10))plt.subplot(231), plt.imshow(img_ori, 'gray'), plt.title('Original'), plt.xticks([]), plt.yticks([])
plt.subplot(232), plt.imshow(img_median, 'gray'), plt.title('Median filter'), plt.xticks([]), plt.yticks([])
plt.subplot(233), plt.imshow(img_max, 'gray'), plt.title('Max filter'), plt.xticks([]), plt.yticks([])
plt.subplot(234), plt.imshow(img_min, 'gray'), plt.title('Min filter'), plt.xticks([]), plt.yticks([])
plt.subplot(235), plt.imshow(img_middle, 'gray'), plt.title('Middle filter'), plt.xticks([]), plt.yticks([])
plt.tight_layout()
plt.show()

# 多次中值滤波器处理椒盐噪声
img_ori = cv2.imread('DIP_Figures/DIP3E_Original_Images_CH05/Fig0507(a)(ckt-board-orig).tif', 0) #直接读为灰度图像img_salt_pepper = add_salt_pepper(img_ori, ps=0.1, pp=0.1)kernel = np.ones([3, 3])
img_median_1 = median_filter(img_salt_pepper, kernel=kernel)
img_median_2 = median_filter(img_median_1, kernel=kernel)
img_median_3 = median_filter(img_median_2, kernel=kernel)plt.figure(figsize=(15, 10))
plt.subplot(231), plt.imshow(img_ori, 'gray'), plt.title('Original'), plt.xticks([]), plt.yticks([])
plt.subplot(232), plt.imshow(img_salt_pepper, 'gray'), plt.title('With salt pepper 0.1'), plt.xticks([]), plt.yticks([])
plt.subplot(233), plt.imshow(img_median_1, 'gray'), plt.title('1 time Median filter'), plt.xticks([]), plt.yticks([])
plt.subplot(234), plt.imshow(img_median_2, 'gray'), plt.title('2 times Median filter'), plt.xticks([]), plt.yticks([])
plt.subplot(235), plt.imshow(img_median_3, 'gray'), plt.title('3 times Median filter'), plt.xticks([]), plt.yticks([])
plt.tight_layout()
plt.show()

def modified_alpha_mean(image, kernel, d=0):"""modified alpha filter, math: $$$$\hat{f}(x, y) = \frac{1}{mn - d} \sum g(r,c)$$param: image:  input image for denoisingparam: kernel: input kernel, actually only use kernel shape, just want to keep the format as mean filterparam: d     : input int, which is from 0 to m * nreturn: image after modified alpha filter"""height, width = image.shape[:2]m, n = kernel.shape[:2]padding_h = int((m -1)/2)padding_w = int((n -1)/2)# 这样的填充方式,可以奇数核或者偶数核都能正确填充image_pad = np.pad(image, ((padding_h, m - 1 - padding_h), \(padding_w, n - 1 - padding_w)), mode="edge")img_result = np.zeros(image.shape)for i in range(height):for j in range(width):temp = np.sum(image_pad[i:i + m, j:j + n] * 1)img_result[i, j] = temp / (m * n - d)return img_result
# 修正阿尔法滤波器处理高斯噪声
img_ori = cv2.imread('DIP_Figures/DIP3E_Original_Images_CH05/Fig0507(b)(ckt-board-gauss-var-400).tif', 0) #直接读为灰度图像kernel = np.ones([3, 3])img_median = median_filter(img_ori, kernel=kernel)
img_max = max_filter(img_ori, kernel=kernel)
img_min = min_filter(img_ori, kernel=kernel)
img_alpha_d_1 = modified_alpha_mean(img_ori, kernel, d=1)
img_alpha_d_05 = modified_alpha_mean(img_ori, kernel, d=0.5)plt.figure(figsize=(15, 10))
plt.subplot(231), plt.imshow(img_ori, 'gray'), plt.title('Original'), plt.xticks([]), plt.yticks([])
plt.subplot(232), plt.imshow(img_median, 'gray'), plt.title('Median filter'), plt.xticks([]), plt.yticks([])
plt.subplot(233), plt.imshow(img_max, 'gray'), plt.title('Max filter'), plt.xticks([]), plt.yticks([])
plt.subplot(234), plt.imshow(img_min, 'gray'), plt.title('Min filter'), plt.xticks([]), plt.yticks([])
plt.subplot(235), plt.imshow(img_alpha_d_1, 'gray'), plt.title('Modified alpha d=1'), plt.xticks([]), plt.yticks([])
plt.subplot(236), plt.imshow(img_alpha_d_05, 'gray'), plt.title('Modified alpha d=0.5'), plt.xticks([]), plt.yticks([])
plt.tight_layout()
plt.show()

# 修正阿尔法滤波器处理高斯噪声+椒盐噪声
img_ori = cv2.imread('DIP_Figures/DIP3E_Original_Images_CH05/Fig0507(a)(ckt-board-orig).tif', 0) #直接读为灰度图像img_uniform = cv2.imread('DIP_Figures/DIP3E_Original_Images_CH05/Fig0512(a)(ckt-uniform-var-800).tif', 0)
img_salt_pepper = cv2.imread('DIP_Figures/DIP3E_Original_Images_CH05/Fig0512(b)(ckt-uniform-plus-saltpepr-prob-pt1).tif', 0) kernel = np.ones([5, 5])img_geometric_mean = geometric_mean(img_salt_pepper, kernel=kernel)
img_dst = img_salt_pepper - img_geometric_mean
img_median = median_filter(img_salt_pepper, kernel=kernel)
img_modified_alpha = modified_alpha_mean(img_salt_pepper, kernel=kernel, d=1)plt.figure(figsize=(15, 10))plt.subplot(231), plt.imshow(img_ori, 'gray'), plt.title('Original'), plt.xticks([]),plt.yticks([])
plt.subplot(232), plt.imshow(img_uniform, 'gray'), plt.title('Uniform noise'), plt.xticks([]),plt.yticks([])
plt.subplot(233), plt.imshow(img_salt_pepper, 'gray'), plt.title('Uniform plus salt pepper'), plt.xticks([]),plt.yticks([])
plt.subplot(234), plt.imshow(img_dst, 'gray'), plt.title('Geometric mean'), plt.xticks([]),plt.yticks([])
plt.subplot(235), plt.imshow(img_median, 'gray'), plt.title('1 time Median filter'), plt.xticks([]),plt.yticks([])
plt.subplot(236), plt.imshow(img_modified_alpha, 'gray'), plt.title('Modified alpha mean d=6'), plt.xticks([]),plt.yticks([])
plt.tight_layout()
plt.show()

第5章 Python 数字图像处理(DIP) - 图像复原与重建10 - 空间滤波 - 统计排序滤波器 - 中值、最大值、最小值、中点、修正阿尔法均值滤波器相关推荐

  1. 第5章 Python 数字图像处理(DIP) - 图像复原与重建12 - 空间滤波 - 使用频率域滤波降低周期噪声 - 陷波滤波、最优陷波滤波

    标题 使用频率域滤波降低周期噪声 陷波滤波深入介绍 最优陷波滤波 本章陷波滤波器有部分得出的结果不佳,如果有更好的解决方案,请赐教,不胜感激. 使用频率域滤波降低周期噪声 陷波滤波深入介绍 零相移滤波 ...

  2. 第5章 Python 数字图像处理(DIP) - 图像复原与重建13 - 空间滤波 - 线性位置不变退化 - 退化函数估计、运动模糊函数

    标题 线性位置不变退化 估计退化函数 采用观察法估计退化函数 采用试验法估计退化函数 采用建模法估计退化函数 运动模糊函数 OpenCV Motion Blur 在这一节中,得到的结果,有些不是很好, ...

  3. 第5章 Python 数字图像处理(DIP) - 图像复原与重建11 - 空间滤波 - 自适应滤波器 - 自适应局部降噪、自适应中值滤波器

    标题 自适应滤波器 自适应局部降噪滤波器 自适应中值滤波器 自适应滤波器 自适应局部降噪滤波器 均值是计算平均值的区域上的平均灰度,方差是该区域上的图像对比度 g(x,y)g(x, y)g(x,y)噪 ...

  4. 第5章 Python 数字图像处理(DIP) - 图像复原与重建9 - 空间滤波 - 均值滤波器 - 算术平均、几何平均、谐波平均、反谐波平均滤波器

    标题 只存在噪声的复原 - 空间滤波 均值滤波器 算术平均滤波器 几何均值滤波器 谐波平均滤波器 反(逆)谐波平均滤波器 只存在噪声的复原 - 空间滤波 仅被加性噪声退化 g(x,y)=f(x,y)+ ...

  5. 第5章 Python 数字图像处理(DIP) - 图像复原与重建1 - 高斯噪声

    本章主要讲图像复原与重建,首先是了解一下各种噪声的特点与模型,还有形成的方法.一些重点的噪声,如高斯噪声,均匀噪声,伽马噪声,指数噪声,还有椒盐噪声等. 本章主要的噪声研究方法主要是加性噪声. 标题 ...

  6. 第5章 Python 数字图像处理(DIP) - 图像复原与重建17 - 由投影重建图像、雷登变换、投影、反投影、反投影重建

    标题 由投影重建图像 投影和雷登变换 Johann Radon 反投影 滤波反投影重建 由投影重建图像 本由投影重建图像,主要是雷登变换与雷登把变换的应用,所以也没有太多的研究,只为了保持完整性,而添 ...

  7. 第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[ ...

  8. 第5章 Python 数字图像处理(DIP) - 图像复原与重建15 - 最小均方误差(维纳)滤波

    标题 最小均方误差(维纳)滤波 最小均方误差(维纳)滤波 目标是求未污染图像fff的一个估计f^\hat{f}f^​,使它们之间的均方误差最小. e2=E{(f−f^)2}(5.80)e^2 = E ...

  9. 第5章 Python 数字图像处理(DIP) - 图像复原与重建14 - 逆滤波

    标题 逆滤波 逆滤波 逆滤波 逆滤波 图像的退化函数已知或者由前面的方法获取退化函数,则可以直接逆滤波 F^(u,v)=G(u,v)H(u,v)(5.78)\hat{F}(u,v) = \frac{G ...

最新文章

  1. 微软亚洲研究院副院长刘铁岩:AI如何助力节能减排?
  2. Win32中GDI+应用(三)---Graphics类
  3. STL札记3-2(hashtable关联容器set、map)
  4. wxWidgets:wxSpinCtrl类用法
  5. 使用Jupyter notebook,按下ctrl+enter后,一直出现In[*]呢?
  6. 有赞的交易系统架构困局以及破局之道
  7. Oracle备份与恢复 关于expdp导出远程数据到本地的使用
  8. c语言条件运算符的作用,条件运算符的用法_C运算符的结合方向
  9. jsp内置对象*session
  10. cxf webservice:异常SOAPFaultException: Unexpected wrapper element found解决
  11. 小D课堂 - 零基础入门SpringBoot2.X到实战_第8节 数据库操作之整合Mybaties和事务讲解_33、SpringBoot2.x整合Mybatis3.x注解实战...
  12. MTK Android GT928触摸屏驱动客制化触摸的开关
  13. 异数OS 织梦师-水桶(三)-- RAM共享存储方案
  14. AI时代下,如何打造一个具有情感化属性的智能相册?
  15. java毕业设计旅游网站设计源码+lw文档+mybatis+系统+mysql数据库+调试
  16. 计算机毕业设计Java教师继续教育(源码+系统+mysql数据库+lw文档)
  17. 学生管理系统(Java版)
  18. 计蒜客/阿里的新游戏
  19. ROS-3DSLAM(3):信息流
  20. 计算机类参加比赛GMC,我校学生获得第19届国际企业管理挑战赛(GMC)中国赛区三等奖...

热门文章

  1. 跨域(Cross-Domain) AJAX for IE8 and IE9
  2. signal(SIGHUP, SIG_IGN);
  3. 利用union判断系统的大小端
  4. asp.net表单提交方法:GET\POST介绍
  5. cocos2d学习笔记2——学习资源
  6. 黑马训练营自学笔记(03)
  7. Vue3的响应式原理解析
  8. java 算法优化向导
  9. 操作系统 --- 进程和管程的不同
  10. 3.12PMP试题每日一题