Python图像处理【14】基于非线性滤波器的图像去噪

基于非线性滤波器的图像去噪

    • 0. 前言
    • 1. min 滤波器
    • 2. max 滤波器
    • 3. mode 滤波器
    • 4. 高斯、中值、mode 和 max 滤波器对比
    • 小结
    • 系列链接

0. 前言

本节中我们将介绍诸如 maxmin 之类的非线性滤波器,与中值滤波器一样,它们根据滑动窗口中像素的顺序统计信息决定像素值。在本节中,我们将学习如何应用 maxminmode 滤波器去除图像中的噪声。

1. min 滤波器

min 滤波可以将核中央像素替换为邻域滑动窗口中最暗的像素(即最小值像素),该滤波器通常可用于去除图像中的盐噪声 (salt noise)。

(1) 读取输入图像,并在图像中添加随机盐噪声。由于我们不需要添加胡椒噪声,因此将相应的参数 pepper 设置为 False

import numpy as np
import matplotlib.pylab as plt
from PIL import Image, ImageFilter
from copy import deepcopydef plot_image(image, title=None, sz=10):plt.imshow(image)plt.title(title, size=sz)plt.axis('off')def add_noise(im, prop_noise, salt=True, pepper=True):im = deepcopy(im)n = int(im.width * im.height * prop_noise)x, y = np.random.randint(0, im.width, n), np.random.randint(0, im.height, n)for (x,y) in zip(x,y):im.putpixel((x, y),         # generate salt-and-pepper noise((0,0,0) if np.random.rand() < 0.5 else (255,255,255)) if salt and pepper \else (255,255,255) if salt \else (0, 0, 0)) # if pepperreturn imorig = Image.open('2.png')
im = add_noise(orig, prop_noise = 0.2, pepper=False)

(2) 使用 PIL 函数指定 ImageFilter.MinFilter 参数应用 min 滤波器,并初始化不同核尺寸的 min 滤波器,绘制输出图像:

plt.figure(figsize=(20,10))
plt.subplot(1,4,1)
plot_image(im, 'Input noisy image')
i = 2
for sz in [3,7,11]:im1 = im.filter(ImageFilter.MinFilter(size=sz)) plt.subplot(1,4,i), plot_image(im1, 'Output (Filter size=' + str(sz) + ')')i += 1
plt.tight_layout()
plt.show()

min滤波器
从上图可以看出,min 滤波器能够从图像中删除盐噪声。

2. max 滤波器

max 滤波器使用最明亮的像素(即最大值的像素)替换核中央像素,该滤波器通常可用于从图像中删除椒噪声。

(1) 添加随机椒噪声到原始输入图像。由于我们不需要添加盐噪声,因此将相应的参数 salt 设置为 False

import numpy as np
import matplotlib.pylab as plt
from PIL import Image, ImageFilter
from copy import deepcopydef plot_image(image, title=None, sz=10):plt.imshow(image)plt.title(title, size=sz)plt.axis('off')def add_noise(im, prop_noise, salt=True, pepper=True):im = deepcopy(im)n = int(im.width * im.height * prop_noise)x, y = np.random.randint(0, im.width, n), np.random.randint(0, im.height, n)for (x,y) in zip(x,y):im.putpixel((x, y),         # generate salt-and-pepper noise((0,0,0) if np.random.rand() < 0.5 else (255,255,255)) if salt and pepper \else (255,255,255) if salt \else (0, 0, 0)) # if pepperreturn imorig = Image.open('2.png')
im = add_noise(orig, prop_noise = 0.3, salt=False)

(2) 使用 PIL 函数指定 ImageFilter.Maxfilter 参数应用 max 滤波器,并初始化不同核尺寸的 max 滤波器,绘制输出图像:

plt.figure(figsize=(20,10))
plt.subplot(1,4,1)
plot_image(im, 'Input noisy image')
i = 2
for sz in [3,7,11]:im1 = im.filter(ImageFilter.MaxFilter(size=sz)) plt.subplot(1,4,i), plot_image(im1, 'Output (Filter size=' + str(sz) + ')')i += 1
plt.tight_layout()
plt.show()

max滤波器
从上图可以看出,max 滤波器能够从图像中删除胡椒噪声。

3. mode 滤波器

mode 滤波器通过使用从特定窗口大小中选择最频繁出现的像素值(像素邻居的模式值)替换中心像素来从图像中去除噪声,mode 滤波器在去除噪声的同时可以保持图像中的清晰边缘。

(1) 读取输入图像,在图像中添加 10% 的椒盐噪声:

import numpy as np
import matplotlib.pylab as plt
from PIL import Image, ImageFilter
from copy import deepcopydef plot_image(image, title=None, sz=10):plt.imshow(image)plt.title(title, size=sz)plt.axis('off')def add_noise(im, prop_noise, salt=True, pepper=True):im = deepcopy(im)n = int(im.width * im.height * prop_noise)x, y = np.random.randint(0, im.width, n), np.random.randint(0, im.height, n)for (x,y) in zip(x,y):im.putpixel((x, y),         # generate salt-and-pepper noise((0,0,0) if np.random.rand() < 0.5 else (255,255,255)) if salt and pepper \else (255,255,255) if salt \else (0, 0, 0)) # if pepperreturn imorig = Image.open('2.png')
im = add_noise(orig, prop_noise = 0.1)  

(2) 使用 PIL 函数指定 ImageFilter.ModeFilter 参数应用 mode 滤波器,并初始化不同核尺寸的 mode 滤波器,绘制输出图像:

plt.figure(figsize=(20,10))
plt.subplot(1,4,1)
plot_image(im, 'Input noisy image')
i = 2
for sz in [3,7,11]:im1 = im.filter(ImageFilter.ModeFilter(size=sz)) plt.subplot(1,4,i), plot_image(im1, 'Output (Filter size=' + str(sz) + ')')i += 1
plt.tight_layout()
plt.show()

mode滤波器
从上图可以看出,mode 滤波器能够在保持输出图中的水平和垂直边缘锐利的同时消除输入图像中的椒盐噪声。

4. 高斯、中值、mode 和 max 滤波器对比

在本节中,我们将逐步将高斯、中值、modemax 滤波器应用于输入图像(对每个滤波器进行四次迭代,每次从输入图像开始,在上一次迭代获得的滤波输出上应用滤波器),对比输出结果。
绘制每个滤波器每次迭代时的图像,以查看每次迭代时的输出结果。第 i i i 行对应于第 2 ∗ i 2*i 2i 次应用滤波器获得的输出:

import numpy as np
import matplotlib.pylab as plt
from PIL import Image, ImageFilter
from copy import deepcopydef plot_image(image, title=None, sz=10):plt.imshow(image)plt.title(title, size=sz)plt.axis('off')def add_noise(im, prop_noise, salt=True, pepper=True):im = deepcopy(im)n = int(im.width * im.height * prop_noise)x, y = np.random.randint(0, im.width, n), np.random.randint(0, im.height, n)for (x,y) in zip(x,y):im.putpixel((x, y),         # generate salt-and-pepper noise((0,0,0) if np.random.rand() < 0.5 else (255,255,255)) if salt and pepper \else (255,255,255) if salt \else (0, 0, 0)) # if pepperreturn imim = Image.open('2.png')
plt.figure(figsize=(10,15))
plt.subplots_adjust(0,0,1,0.95,0.05,0.05)
im1 = im.copy()
sz = 5
for i in range(8):im1 = im1.filter(ImageFilter.GaussianBlur(radius=sz)) if i % 2 == 0:plt.subplot(4,4,4*i//2+1), plot_image(im1, 'Gaussian Blur' if i == 0 else None, 10)
im1 = im.copy()
for i in range(8):im1 = im1.filter(ImageFilter.MedianFilter(size=sz)) if i % 2 == 0:plt.subplot(4,4,4*i//2+2), plot_image(im1, 'Median' if i == 0 else None, 10)
im1 = im.copy()
for i in range(8):im1 = im1.filter(ImageFilter.ModeFilter(size=sz)) if i % 2 == 0:plt.subplot(4,4,4*i//2+3), plot_image(im1, 'Mode' if i == 0 else None, 10)
im1 = im.copy()
for i in range(8):im1 = im1.filter(ImageFilter.MaxFilter(size=sz)) if i % 2 == 0:plt.subplot(4,4,4*i//2+4), plot_image(im1, 'Max' if i == 0 else None, 10)
plt.show()

以及非线性滤波器中值滤波器,不同滤波器效果对比
在上图中可以看出,中值滤波器可以产生最佳结果,它不会像高斯模糊那样过分模糊图像,而不会像 mode 滤波器扭曲/像素化图像。mode 滤波器可以更好地保留锐利的边缘,但代价是引入了伪影/像素化。
中值滤波和 mode 滤波器几乎在最后一次迭代时停止改变输出图像,而高斯模糊始终具有模糊效果(最终,它将产生具有均匀颜色/强度的图像)。

小结

噪声是干扰图像正常分析和处理的一个重要因素,一幅图像在实际应用中可能存在各种各样的噪声,噪声可能在拍摄中产生,也可能在传输过程中产生。在本节中,我们学习了几种常见的非线性滤波器包括 minmaxmode 滤波器,并将这些滤波器用于图像降噪,从而提高图像质量,便于后续进行处理与分析,并且对比了不同滤波器在图像去噪方面的不同效果。

系列链接

Python图像处理【1】图像与视频处理基础
Python图像处理【2】探索Python图像处理库
Python图像处理【3】Python图像处理库应用
Python图像处理【4】图像线性变换
Python图像处理【5】图像扭曲/逆扭曲
Python图像处理【6】通过哈希查找重复和类似的图像
Python图像处理【7】采样、卷积与离散傅里叶变换
Python图像处理【8】使用低通滤波器模糊图像
Python图像处理【9】使用高通滤波器执行边缘检测
Python图像处理【10】基于离散余弦变换的图像压缩
Python图像处理【11】利用反卷积执行图像去模糊
Python图像处理【12】基于小波变换执行图像去噪
Python图像处理【13】使用PIL执行图像降噪

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/167845.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【数据分享】2023年我国上市公司数据(Excel格式/Shp格式)

企业是经济活动的参与主体&#xff0c;一个城市的企业数量决定了这个城市的经济发展水平&#xff01;之前我们分享过2023年高新技术企业数据&#xff08;可查看之前的文章获悉详情&#xff09;&#xff0c;我国专精特新“小巨人”企业数据&#xff08;可查看之前的文章获悉详情…

macOS Sonoma 桌面小工具活学活用!

macOS Sonoma 虽然不算是很大型的改版&#xff0c;但当中触目的新功能是「桌面小工具」&#xff08;Widget&#xff09;。如果我们的萤幕够大&#xff0c;将能够放更多不同的Widget&#xff0c;令用户无须开App 就能显示资讯&#xff0c;实在相当方便。 所有iPhone Widget 也能…

金山终端安全系统V9.0 SQL注入漏洞复现

0x01 产品简介 金山终端安全系统是一款为企业提供终端防护的安全产品&#xff0c;针对恶意软件、病毒和外部攻击提供防范措施&#xff0c;帮助维护企业数据和网络。 0x02 漏洞概述 金山终端安全系统V9.0 /inter/update_software_info_v2.php页面存在sql注入漏洞&#xff0c;该…

小白学java--垃圾回收机制(Garbage Collection)

压测过程中&#xff0c;作为测试会时不时听到研发说命中gc了&#xff0c;如果一头雾水&#xff0c;来看看什么是gc。 1、什么是垃圾回收机制 垃圾回收的执行过程会导致一些额外的开销&#xff0c;例如扫描和标记对象、回收内存空间等操作。这些开销可能会导致一定的性能损失和…

JSX看着一篇足以入门

JSX 介绍 学习目标&#xff1a; 能够理解什么是 JSX&#xff0c;JSX 的底层是什么 概念&#xff1a; JSX 是 javaScriptXML(HTML) 的缩写&#xff0c;表示在 JS 代码中书写 HTML 结构 作用&#xff1a; 在 React 中创建 HTML 结构&#xff08;页面 UI 结构&#xff09; 优势&a…

linux-(from_timer)-定时器的升级

查看linux版本&#xff1a;cat proc/version 使用旧主板型号&#xff08;SSD202D&#xff09;4.9.84 使用新主板型号&#xff08;RV1126&#xff09;4.19.111 移植yaffs驱动时发现内核对定时器进行了升级&#xff0c;很扯淡啊&#xff01; 多亲切多易懂啊&#xff01; 你看这…

ScrapeKit 和 Swift 编写程序

以下是一个使用 ScrapeKit 和 Swift 编写的爬虫程序&#xff0c;用于爬取 图片。同时&#xff0c;我们使用了proxy 这段代码来获取代理。 import ScrapeKit ​ class PeopleImageCrawler: NSObject, ScrapeKit.Crawler {let url: URLlet proxyUrl: URL ​init(url: URL, proxy…

微信native-v3版支付对接流程及demo

1.将p12证书转为pem证书&#xff0c;得到商户私钥 openssl pkcs12 -in apiclient_cert.p12 -out apiclient_cert.pem -nodes 密码是&#xff1a;商户id 2.将获取到的apiclient_cert.pem证书&#xff0c;复制出这一块内容&#xff0c;其他的不要 3.下载这个工具包 https://gi…

Rust结构体

结构体 Rust 中的结构体与其他语言中的定义一样&#xff0c;这是一种自定义的数据类型&#xff0c;用来组织多个相关的值&#xff0c;这些被放在结构体里的值就被称为字段(field)&#xff0c;当然按以前的习惯还是叫成员变量更顺嘴。Rust 中结构体的成员变量都默认是私有的&am…

看得懂的——数据库中的“除”操作

通过一个例子来解释数据库中的“除”操作 R➗S其实就是判断关系R中X各个值的象集Y是否包含关系S中属性Y的所有值 求解步骤 第一步 找出关系R和关系S中相同的属性&#xff0c;即Y属性。在关系S中对Y做投影&#xff08;即将Y列取出&#xff09;&#xff1b;所得结果如下&#x…

众和策略:跨界收购算力公司 高新发展斩获3连板

高新展开23日开盘再度一字涨停&#xff0c;截至发稿&#xff0c;该股报21.74元&#xff0c;涨停板上封单超200万手。至此&#xff0c;该股已连续3个生意日涨停。 公司18日晚间宣布生意预案&#xff0c;拟通过发行股份及支付现金的方式购买高投电子集团持有的华鲲振宇30%股权、…

医院智能电力系统解决方案

摘要&#xff1a;智能电力系统主要体现在“智能”&#xff0c;在医院中智能电力系统主要以数字电力系统为主&#xff0c;它主要表现为信息化、自动化。通过对数据的采集分析&#xff0c;以及反馈传输运行。其中医院智能电力系统优点在于&#xff0c;(1)通过医院的生产数据&…

python免杀初探

文章目录 loader基础知识loader参数介绍 evilhiding项目地址免杀方式修改加载器花指令混淆loader源码修改签名加壳远程条件触发修改ico的md5加密 loader基础知识 loader import ctypes #&#xff08;kali生成payload存放位置&#xff09; shellcode bytearray(b"shellc…

CSS3属性详解(一)文本 盒模型中的 box-ssize 属性 处理兼容性问题:私有前缀 边框 背景属性 渐变 前端开发入门笔记(七)

CSS3是用于为HTML文档添加样式和布局的最新版本的层叠样式表&#xff08;Cascading Style Sheets&#xff09;。下面是一些常用的CSS3属性及其详细解释&#xff1a; border-radius&#xff1a;设置元素的边框圆角的半径。可以使用四个值设置四个不同的圆角半径&#xff0c;也可…

自然语言处理---RNN经典案例之使用seq2seq实现英译法

1 seq2seq介绍 1.1 seq2seq模型架构 seq2seq模型架构分析&#xff1a; seq2seq模型架构&#xff0c;包括两部分分别是encoder(编码器)和decoder(解码器)&#xff0c;编码器和解码器的内部实现都使用了GRU模型&#xff0c;这里它要完成的是一个中文到英文的翻译&#xff1a;欢迎…

设计模式:策略模式(C#、JAVA、JavaScript、C++、Python、Go、PHP)

简介&#xff1a; 策略模式&#xff0c;它是一种行为型设计模式&#xff0c;它定义了算法族&#xff0c;分别封装起来&#xff0c;让它们之间可以互相替换。策略模式让算法的变化独立于使用算法的客户&#xff0c;降低了耦合&#xff0c;增加了系统的可维护性和可扩展性。 策…

AI的Prompt是什么

一.AI的Prompt的作用 在人工智能&#xff08;AI&#xff09;中&#xff0c;"Prompt"通常指的是向AI系统提供的输入或指令&#xff0c;用于引导AI进行特定的操作或生成特定的输出。例如&#xff0c;在一个对话型AI系统中&#xff0c;用户输入的问题就是一个prompt&…

使用 VS 2022 开发C#项目的tips

代码操作 删除注释或空行 参考C#【必备技能篇】Visual Studio删除所有的注释和空行 删除所有行注释&#xff1a;包括行内和行外&#xff0c;如下所示 Ctrl H 替换&#xff0c;第一行输入&#xff1a;//[^\n]*\n, 第二行输入&#xff1a;\n。替换即可。 这一步可能出现很多空…

C#上位机序列9: 批量读写+事件广播+数据类型处理

一、源码结构&#xff1a; 二、运行效果&#xff1a; 三、源码解析 1. 读取配置文件及创建变量信息&#xff08;点位名称&#xff0c;地址&#xff0c;数据类型&#xff08;bool/short/int/float/long/double&#xff09;&#xff09; 2. 异步任务处理&#xff1a;读任务&…

组态软件和人机界面与plc之间Profinet无线通讯

在实际应用中&#xff0c;车间里分布的多台PLC&#xff0c;会由一台触摸屏集中控制&#xff0c;同时用户也许要将PLC数据共享给总控的上位机软件进行数据监控。此时需要实现&#xff0c;PLC、触摸屏、上位机之间的数据实时共享功能。在有通讯需求的时候&#xff0c;如果布线的话…