完整代码可以在 我的AI学习笔记 - github 中获取

原理

传统的中值滤波算法在椒盐噪声的去除领域有着比较广泛的应用,其具有较强的噪点鉴别和恢复能力,也有比较低的时间复杂度:其基本思想是采用像素点周围邻接的若干像素点的中值来代替被污染的像素点;但也存在一定的缺陷,随着图像被污染程度的加深,此方法恢复的图像细节模糊、边缘损失也会越严重。

中值滤波的思想就是比较一定领域内的像素值的大小,取出其中值作为这个领域的中心像素新的值。假设对一定领域内的所有像素从小到大进行排序,如果存在孤立的噪声点,比如椒盐噪声(椒噪声——较小的灰度值,呈现的效果是小黑点;盐噪声——较大的灰度值,呈现的效果是小白点),那么从小到大排序的这个数组中,那些孤立的噪声一定会分布在两边(要么很小,要么很大),这样子取出的中值点可以很好地保留像素信息,而滤除了噪声点的影响。
中值滤波器受滤波窗口大小影响较大,用于消除噪声和保护图像细节,两者会存在冲突。如果窗口较小,则能较好地保护图像中的一些细节信息,但对噪声的过滤效果就会打折扣;反之,如果窗口尺寸较大则会有较好的噪声过滤效果,但也会对图像造成一定的模糊效果,从而丢失一部分细节信息。

此处采用改进的自适应中值滤波算法进行图像恢复:

  1. 根据图像处理的空间相关性原则,采用自适应的方法选择不同的滑动窗口大小;
  2. 在算法中单滤波窗口大小达到最大值时,采用均值滤波;

代码实现

def get_window(res_img,noise_mask,sc,i,j,k):listx = []if i-sc >= 0:starti = i-sc else:starti = 0if j+1 <= res_img.shape[1]-1 and noise_mask[0,j+1,k] !=0:listx.append(res_img[0,j+1,k])if j-1 >=0 and noise_mask[0,j-1,k] !=0:listx.append(res_img[0,j-1,k])if i+sc <= res_img.shape[0]-1:endi = i+scelse:endi = res_img.shape[0]-1if j+1 <= res_img.shape[1]-1 and noise_mask[endi,j+1,k] !=0:listx.append(res_img[endi,j+1,k])if j-1 >=0 and noise_mask[endi,j-1,k] !=0:listx.append(res_img[endi,j-1,k])if j+sc <= res_img.shape[1]-1:endj = j+scelse:endj = res_img.shape[1]-1if i+1 <= res_img.shape[0]-1 and noise_mask[i+1,endj,k] !=0:listx.append(res_img[i+1,endj,k])if i-1 >=0 and noise_mask[i-1,endj,k] !=0:listx.append(res_img[i-1,endj,k])if j-sc >= 0:startj = j-scelse:startj = 0if i+1 <= res_img.shape[0]-1 and noise_mask[i+1,0,k] !=0:listx.append(res_img[i+1,0,k])if i-1 >=0 and noise_mask[i-1,0,k] !=0:listx.append(res_img[i-1,0,k])for m in range(starti,endi+1):for n in range(startj,endj+1):if noise_mask[m,n,k] != 0:listx.append(res_img[m,n,k])listx.sort()return listxdef get_window_small(res_img,noise_mask,i,j,k):listx = []sc = 1             if i-sc >= 0 and noise_mask[i-1,j,k]!=0:listx.append(res_img[i-1,j,k])if i+sc <= res_img.shape[0]-1 and noise_mask[i+1,j,k]!=0:listx.append(res_img[i+1,j,k])if j+sc <= res_img.shape[1]-1 and noise_mask[i,j+1,k]!=0:listx.append(res_img[i,j+1,k])if j-sc >= 0 and noise_mask[i,j-1,k]!=0:listx.append(res_img[i,j-1,k])listx.sort()return listxdef restore_image(noise_img, size=4):"""使用 你最擅长的算法模型 进行图像恢复。:param noise_img: 一个受损的图像:param size: 输入区域半径,长宽是以 size*size 方形区域获取区域, 默认是 4:return: res_img 恢复后的图片,图像矩阵值 0-1 之间,数据类型为 np.array,数据类型对象 (dtype): np.double, 图像形状:(height,width,channel), 通道(channel) 顺序为RGB"""# 恢复图片初始化,首先 copy 受损图片,然后预测噪声点的坐标后作为返回值。res_img = np.copy(noise_img)# 获取噪声图像noise_mask = get_noise_mask(noise_img)for i in range(noise_mask.shape[0]):for j in range(noise_mask.shape[1]):for k in range(noise_mask.shape[2]):if noise_mask[i,j,k] == 0:sc = 1listx = get_window_small(res_img,noise_mask,i,j,k)if len(listx) != 0:res_img[i,j,k] = listx[len(listx)//2]else:while(len(listx) == 0):listx = get_window(res_img,noise_mask,sc,i,j,k)sc = sc+1if sc > 4:res_img[i,j,k] = np.mean(listx)else:res_img[i,j,k] = listx[len(listx)//2]return res_img

恢复效果:

原始图片

添加噪点

恢复后

改进的自适应中值滤波算法 去除椒盐噪声 python 代码实现相关推荐

  1. matlab中基于十字形窗口的滤波算法,#215;字形滤波窗口在Matlab自适应中值滤波算法中的应用 - 21ic中国电子网...

    由于种种原因,图像在生成.传输.变换等过程中往往会受到各种噪声的污染,从而导致图像质量退化.噪声信号的滤波是图像处理的基本任务之一,主要有线性滤波和非线性滤波两种方法.线性滤波方法一般具有低通特性,而 ...

  2. MATLAB自编自适应中值滤波算法

    代码原理: 在噪声密度不是很大的情况下(根据经验,噪声的出现的概率小于0.2),使用中值滤波的效果不错.但是当噪声出现的概率比较高时,原来的中值滤波算法就不是很有效了.只有增大滤波器窗口尺寸,尽管会使 ...

  3. 数字图像处理,自适应中值滤波的C++实现

    自适应中值滤波的原理 自适应中值滤波的思想是根据噪声密度改变滤波窗口的大小,同时对噪声点和信号点采取不同的处理方法.对噪声点进行中值滤波,对信号点保持其灰度值不变. 设为fij为点(i,j)的灰度值, ...

  4. matlab设计自适应中值滤波,matlab课程设计(自适应中值滤波).doc

    matlab课程设计(自适应中值滤波).doc 10信息工程系课程设计报告课程MATLAB课程设计专业通信工程班级2级本科二班学生姓名1景学号114学生姓名2学号1414学生姓名3王学号6学生姓名4学 ...

  5. 自适应中值滤波及实现

    前言 无意中看到了一篇比较老的论文,Adaptive median filters: new algorithms and results.感兴趣的可以下载下来看看.主要就是提出了一种自适应中值滤波算 ...

  6. matlab编程实现自适应均值滤波和自适应中值滤波

    matlab编程实现自适应滤波器 一.自适应均值滤波器 1. 原理部分: 2. 程序代码 3. 结果对比 二.自适应中值滤波 1. 原理部分 2.程序代码 3. 结果对比 一.自适应均值滤波器 1. ...

  7. 滑动窗口滤波 c语言,关于中值滤波算法,以及C语言实现(转)

    1.什么是中值滤波? 中值滤波是对一个滑动窗口内的诸像素灰度值排序,用其中值代替窗口中心象素的原来灰度值,它是一种非线性的图像平滑法,它对脉冲干扰级椒盐噪声的抑制效果好,在抑制随机噪声的同时能有效保护 ...

  8. matlab练习程序(自适应中值滤波RAMF)

    中值滤波是很经典的算法了.今天看论文又知道还有一种叫自适应中值滤波的算法RAMF.原论文在这里. RAMF主要通过以下两步来处理图像. 1.首先确定最大的滤波半径,然后用一个合适的半径r对图像进行滤波 ...

  9. 关于中值滤波算法,以及C语言实现(转)

    源:关于中值滤波算法,以及C语言实现 1.什么是中值滤波? 中值滤波是对一个滑动窗口内的诸像素灰度值排序,用其中值代替窗口中心象素的原来灰度值,它是一种非线性的图像平滑法,它对脉冲干扰级椒盐噪声的抑制 ...

  10. 滑动窗口滤波 c语言,关于中值滤波算法 以及C语言实现

    1.什么是中值滤波? 中值滤波是对一个滑动窗口内的诸像素灰度值排序,用其中值代替窗口中心象素的原来灰度值,它是一种非线性的图像平滑法,它对脉冲干扰级椒盐噪声的抑制效果好,在抑制随机噪声的同时能有效保护 ...

最新文章

  1. JAVA第一次实验 ——实验楼
  2. python gui插件_Python进阶量化交易专栏场外篇17- GUI控件在回测工具上的添加
  3. python rindex()_Python3 rindex()方法
  4. strstr的实现 和key=value字符串的实现
  5. linux下的微博客户端,Linux下非官方的新浪微博客户端:WeCase(微盒),附安装方法...
  6. 国际市场营销知识框架图_货币银行学知识怎么学?知识点很杂乱?已经为你整理好了!...
  7. 浮点错误的意思-PAT 、OJ
  8. 扫描识别工具Dynamic Web TWAIN使用教程:单独添加/删除对象
  9. 【浙江大学PAT真题练习乙级】1002 写出这个数(20分) 真题解析
  10. js 二维数组_JS数独验证--难度☆☆☆☆☆
  11. BIM知识 | BIM管线综合原则
  12. Taskctl的定时任务调度
  13. grads插值_GrADS中格点插值到站点(gr2stn)的详细方法
  14. 重装系统后没有网卡驱动
  15. 模糊PI控制的Simulink仿真(保姆级别)
  16. raid5换硬盘显示ready_服务器RAID磁盘坏道修复实战
  17. 《东周列国志》第三十八回 周襄王避乱居郑 晋文公守信降原
  18. 2022届浙江工业大学考研计算机技术专硕上岸经验 初试复试经验
  19. 2018阿里菜鸟无人仓一面面经
  20. 玩转软路由 篇二:软路由中Esxi 7.0 安装教程和避坑指南

热门文章

  1. basler相机参数简要中文说明_Basler相机参数在NI软件下打开相机参数说明
  2. 现代控制理论-6李雅普诺夫稳定性
  3. CANoe教程:CAPL编程
  4. 超强免费OCR文字识别工具推荐
  5. 期末前端web大作业——基于HTML当当图书网项目的设计与实现 网上书城 网上书店 在线书店网页
  6. 华为手机序列号前三位_华为手机序列号怎么查询?
  7. WinRAR5.40版 无广告
  8. 2022张宇考研基础30讲 第十讲 积分等式与积分不等式
  9. 2016-408-计组-有如下c语言程序段
  10. 继CDH收费之后,这家公司率先推出了免费版大数据套件服务!