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

news2024/12/24 21:05:05

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

    • 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 deepcopy

def 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 pepper
    return im

orig = 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 deepcopy

def 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 pepper
    return im

orig = 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 deepcopy

def 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 pepper
    return im

orig = 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 deepcopy

def 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 pepper
    return im

im = 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.coloradmin.cn/o/1120305.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

css中px、em、rem、%、vw、vh、vm、rpx 这些单位的区别

序言 px&#xff1a;像素 相对长度单位&#xff0c;相对于显示器屏幕分辨率(推荐使用) em&#xff1a;相对长度单位 基准点为父节点字体的大小&#xff0c;如果自身定义了font-size按自身来计算&#xff08;浏览器默认字体是16px&#xff09;&#xff0c;整个页面内1em不是一个…

10个最流行的土木工程BIM软件

建筑信息模型 (BIM) 是一种数字化流程&#xff0c;最近在土木工程领域受到广泛关注。 它是一种设计、构建和管理项目的协作方法。 它涉及创建和使用建筑物的详细数字表示&#xff0c;包括 3D 模型、数据和有关项目的信息。 BIM 在参与项目的不同利益相关者之间提供实时协作&…

【Docker从入门到入土 2】Docker数据管理、网络通信和网络模式 1.0

Part2 一、Docker网络模式&#xff08;面试高频&#xff09;1.1 Docker 网络实现原理1.2 host模式1.3 container模式1.4 none模式1.5 bridge模式1.6 自定义网络 二、Docker网络通信2.1 端口映射2.2 容器互联 三、Docker资源控制3.1 Cgroup简介3.2 CPU资源控制3.2.1 设置CPU使用…

JAVA高级教程-Java Map(6)

目录 6、Map的使用 6、Map的使用 package Map01;import java.util.HashMap; import java.util.Map; import java.util.Set;/*** Map接口的使用*/ public class Demo01_HashMap {public static void main(String[] args) {Map<String,String> mapnew HashMap<>();ma…

黔院长 | 不忘初心在逆境中前行!

随着我国经济不断发展进步&#xff0c;以及人口老龄化程度的加深&#xff0c;加上自然环境质量的下降&#xff0c;人们越来越关注和重视自己的健康问题。据世界卫生组织相关数据显示&#xff0c;目前我国的亚健康率已经高达95%&#xff01;健康发展刻不容缓&#xff01; 国家政…

strlen函数

文章目录 strlen函数模拟实现&#xff1a; strlen函数 strlen函数是用来计算字符串长度的&#xff0c;不包括‘\0’ 使用&#xff1a; #include<stdio.h> #include<string.h>int main() {char arr[] "abcdef";int len strlen(arr);printf("%d\n…

Java基础(第一期):IDEA的下载和安装(步骤图) 项目结构的介绍 项目、模块、类的创建。第一个代码的实现

文章目录 IDEA1.1 IDEA概述1.2 IDEA的下载和安装1.2.1 下载1.2.2 安装 1.3 IDEA中层级结构介绍1.3.1 结构分类1.3.2 结构介绍project&#xff08;项目、工程&#xff09;module&#xff08;模块&#xff09;package&#xff08;包&#xff09;class&#xff08;类&#xff09; …

vue3 使用 elementUi: ./lib/theme-chalk/index.css is not exported from package

目录 1. 在 vue3 中使用 element-ui2. 如果启动报错&#xff1a;Module not found: Error: Package path ./lib/theme-chalk/index.css is not exported from package 1. 在 vue3 中使用 element-ui 在 vue3 中使用 element-ui&#xff0c;我们的流程一般是这样的&#xff1a;…

17 Transformer 的解码器(Decoders)——我要生成一个又一个单词

Transformer 编码器 编码器在干吗&#xff1a;词向量、图片向量&#xff0c;总而言之&#xff0c;编码器就是让计算机能够更合理地&#xff08;不确定性的&#xff09;认识人类世界客观存在的一些东西 Transformer 解码器 解码器会接收编码器生成的词向量&#xff0c;然后通…

Go并发编程之二

一、前言 前一篇 Go并发编程之一 主要介绍了如何通过go语句启动协程&#xff08;goroutine&#xff09;以及协程调度的不确定性&#xff0c;这一篇我们重点来介绍一下协程中另外一个重要概念channel&#xff0c;记住第一句话&#xff1a; goroutine之间不是通过共享内存来通信…

JUC高并发容器-CopyOnWriteArrayList

CopyOnWriteArrayList JUC高并发容器线程安全的同步容器类什么是高并发容器&#xff1f;CopyOnWriteArrayList JUC高并发容器 线程安全的同步容器类 Java同步容器类通过Synchronized(内置锁)来实现同步的容器&#xff0c;比如Vector、HashTable以及SynchronizedList等容器。线…

react封装一个简单的upload组件(待完善)

目录 react封装一个简单的upload组件component / uploadImg / uploadImg.jsx使用效果 react封装一个简单的upload组件 component / uploadImg / uploadImg.jsx import React, { useState } from react; import { LoadingOutlined, PlusOutlined } from ant-design/icons; imp…

【源码】C/C++运动会计分系统 期末设计源码

文章目录 题目介绍功能源码效果展示带报告&#xff08;内容&#xff09; 题目介绍 使用语言&#xff1a; 两个版本都会发&#xff1a; 版本1&#xff1a;C语言 版本2&#xff1a; C 代码量&#xff1a; 500 题目介绍&#xff1a; 要求&#xff1a;初始化输入&#xff1a;N-参赛…

C++ 中的模型预测路径积分 (MPPI) 控制

一、说明 模型预测路径积分控制&#xff08;MPPI&#xff09;是一种基于采样的模型预测控制算法。是MPC控制模型的延申和拓宽&#xff0c;要了解MPPI需要先理解MPC&#xff0c;参见文章&#xff1a;MPC预测控制概述和C 中的模型库-CSDN博客 二、模型预测路径积分 (MPPI) 控制 模…

【小白专用23.10.22 已验证】windows 11 安装PHP8.2 +Apache2.4

环境说明 windows:windows 11 x64apache: Apache/2.4.43php :php-8.2.11 一.php 1、PHP下载 PHP For Windows: Binaries and sources Releases 注意&#xff1a; 1.要下载Thread Safe&#xff0c;否则没有php8apache2_4.dll这个文件&#xff1b;如果使用Apache作为服务器…

Casbin实战经验大揭秘:教育培训领域的创新实践和高效优化策略

策略描述语言&#xff08;论文&#xff09; 摘要: 为了保护云资源的安全&#xff0c;防止数据泄露和非授权访问&#xff0c;必须对云平台的资源访问实施访问控制。然而&#xff0c;目前主流云平台通常采用自己的安全策略语言和访问控制机制&#xff0c;从而造成两个问题&#x…

Jenkins简介及安装配置详解:开启持续集成之旅

目录 一、Jenkins介绍1.1 持续集成1.2 Jenkins持续集成的过程&#xff08;传统方式与自动化部署&#xff09; 二、环境搭建1、准备工作2、WEB发布服务器环境搭建3、SVN服务器环境搭建4、Jenkins环境搭建 一、Jenkins介绍 Jenkins是一个开源的、用Java编写的持续集成和持续交付&…

Defender Antivirus占用资源怎么禁止

前言 有时Defender Antivirus 突然磁盘IO很高。导致机器卡得很&#xff0c;开发代码很不方便&#xff0c;本文就介绍如何禁用这个服务。2f089809-2c6f-4fb7-86f5-8b5cbca8bd0d 操作 下载Defender Control https://www.sordum.org/9480/defender-control-v2-1/ 这是当前的最…

Adobe Photoshop 基本操作

PS快捷键 图层 选择图层 Ctrl T&#xff1a;可以对图层的大小和位置进行调整 填充图层 MAC: AltBackspace (前景) or CtrlBackspace (背景) WINDOWS: AltDelete (前景) or CtrlDelete (背景) 快速将图层填充为前景色或背景色 平面化图层&#xff08;盖印图层&#xff09…

uniapp实现登录组件之外区域置灰并引导登录

实现需求 每个页面需要根据用户是否登录决定是否显示登陆组件,登录组件半屏底部显示,登录组件之外区域置灰,功能按钮点击之后引导提示登录.页面效果如下: 实现思路说明 设置登录组件背景颜色为灰色,将页面分成登录区域(底部)和非登陆区域(上面灰色显示部分), 置灰区域添加…