opencv-python图像增强一:传统图像去噪方法整理

news/2024/11/15 5:45:25/

一、简介:

在数字图像处理领域,噪声一直是影响图像质量的重要因素。无论是拍摄过程中的环境干扰,还是传输过程中的信号失真,噪声都可能导致图像模糊、细节丢失,甚至影响后续的图像分析和应用。为了提高图像的视觉效果和使用价值,图像去噪技术应运而生,成为图像预处理环节中不可或缺的一环。在本文中介绍几个常用的传统图像去噪的方法以及其应用情景。

文章目录

  • 一、简介:
  • 二:常用的去噪方法梳理:
  • 三:简述与实现方法:
    • 3.1均值滤波
    • 3.2中值滤波
    • 3.3高斯滤波
    • 3.4双边滤波
    • 3.5非局部均值去噪
    • 3.6引导滤波去噪
    • 3.7小波变换去噪

二:常用的去噪方法梳理:

在传统图像处理领域,去噪技术是提高图像质量的重要手段。以下是一些常见的去噪技术:

  1. 均值滤波去噪:该方法通过对图像中的每个像素点及其邻域内的像素点取平均值,来替代原始像素值,从而实现去噪。均值滤波简单易实现,但容易导致图像边缘模糊。
  2. 中值滤波去噪:中值滤波将图像中每个像素点与其邻域内的像素点进行排序,取中值作为滤波结果。这种方法在去除噪声的同时,能较好地保护图像的边缘信息。
  3. 高斯滤波去噪:高斯滤波是一种加权平均滤波,权重是根据高斯函数计算得出的。它能够有效地去除图像中的高斯噪声,同时保留图像的细节。
  4. 双边滤波去噪:双边滤波结合了空间邻近度和像素值相似度,是一种保边缘的滤波方法。它既能去除噪声,又能保持图像的边缘信息。
  5. 非局部均值去噪:非局部均值去噪考虑了图像中重复的纹理信息,通过搜索整个图像来寻找相似块,并进行加权平均。这种方法在去除噪声的同时,能更好地保持图像的细节和结构。
  6. 引导滤波去噪:引导滤波利用引导图像与待滤波图像之间的关系,对图像进行局部线性滤波。这种方法在去噪的同时,能有效保护图像的边缘和细节。
  7. 小波变换去噪:小波变换将图像分解为不同尺度和方向的小波系数,通过对这些系数进行阈值处理,达到去噪的目的。小波变换去噪在去除噪声的同时,能较好地保留图像的纹理和细节。

三:简述与实现方法:

3.1均值滤波

均值滤波是一种简单的图像去噪方法,属于线性滤波器的一种。它的基本思想是用目标像素周围邻域内的像素的平均值来代替目标像素的值,从而消除图像中的随机噪声。
均值滤波常用于图像预处理阶段,特别是在需要快速去噪且对图像细节要求不高的场合或者用于模糊图像细节只保留颜色等图像低频信息。

代码如下:

import cv2
# 读取图像
image = cv2.imread('noisy_image.jpg', cv2.IMREAD_GRAYSCALE)
# 应用3x3的均值滤波
blurred_image = cv2.blur(image, (3, 3))
# 显示原图和均值滤波后的图像
cv2.imshow('Original Image', image)
cv2.imshow('Blurred Image', blurred_image)
# 等待按键后退出
cv2.waitKey(0)
cv2.destroyAllWindows()

3.2中值滤波

中值滤波是一种非线性的数字滤波技术,主要用于去除图像中的椒盐噪声(由离散的黑白像素组成)和其他类型的脉冲噪声。中值滤波器的核心思想是使用像素邻域中的像素值的中值来代替目标像素的值。
中值滤波一般都用在黑白蒙版上用来去除二值化后所带来的椒盐噪声,以此来获取干净的蒙版。

代码如下:

import cv2# 读取图像
image = cv2.imread('noisy_image.jpg', cv2.IMREAD_GRAYSCALE)
# 应用3x3的中值滤波
median_filtered_image = cv2.medianBlur(image, 3)
# 显示原图和均值滤波后的图像
cv2.imshow('Original Image', image)
cv2.imshow('Median Filtered Image', median_filtered_image)
# 等待按键后退出
cv2.waitKey(0)
cv2.destroyAllWindows()

3.3高斯滤波

高斯滤波是一种基于高斯函数的线性平滑滤波器,用于去除图像中的噪声,同时保留图像的边缘和细节。它通过对图像中每个像素的值进行加权平均来实现去噪,其中权重由高斯函数确定。使用高斯滤波参数的时候通常,可以从较小的标准差和核大小开始,逐渐增加,直到找到一个平衡点,既能有效去除噪声,又能保留图像的细节。

代码如下:


import cv2
# 读取图像
image = cv2.imread('noisy_image.jpg', cv2.IMREAD_GRAYSCALE)
# 应用高斯滤波,这里使用3x3的窗口和标准差为2的高斯核
gaussian_filtered_image = cv2.GaussianBlur(image, (3, 3), 2)
# 显示原图和高斯滤波后的图像
cv2.imshow('Original Image', image)
cv2.imshow('Gaussian Filtered Image', gaussian_filtered_image)
# 等待按键后退出
cv2.waitKey(0)
cv2.destroyAllWindows()

3.4双边滤波

双边滤波是一种非线性的滤波技术,用于去除图像中的噪声,同时尽可能保留边缘细节。与高斯滤波器不同,双边滤波器考虑了像素之间的空间邻近性和像素值相似性,从而在去除噪声的同时更好地保留边缘。双边滤波器能够很好地保留图像的边缘和细节,因为它不仅考虑像素的空间邻近性,还考虑像素值的相似性。但相应的双边滤波器的计算复杂度较高,推理时间相对较慢。

代码如下:

import cv2# 读取图像
image = cv2.imread('noisy_image.jpg', cv2.IMREAD_GRAYSCALE)
# 应用双边滤波,这里使用3x3的窗口
bilateral_filtered_image = cv2.bilateralFilter(image, 9, 25, 25)
# 显示原图和双边滤波后的图像
cv2.imshow('Original Image', image)
cv2.imshow('Bilateral Filtered Image', bilateral_filtered_image)
# 等待按键后退出
cv2.waitKey(0)
cv2.destroyAllWindows()

双边滤波有三个参数

  1. diameter: 邻域大小,以像素为单位。这个参数决定了滤波器的邻域大小。较大的直径可以覆盖更多的像素,从而更好地平滑噪声,但可能会模糊边缘。较小的直径则可以更好地保留边缘细节,但去噪效果可能不够理想。
  2. sigmaColor: 颜色空间相似性的权重。较大的值会更多地平滑颜色差异较大的像素,而较小的值会更多地保留颜色差异较大的像素。这个参数控制了颜色空间内的相似性权重。
  3. sigmaSpace: 空间邻近性的权重。较大的值会更多地平滑空间上相邻的像素,而较小的值会更多地保留空间上相邻的像素。这个参数控制了空间邻近性权重。的权重值可以更好地保留边缘,但去噪效果可能不够理想。

3.5非局部均值去噪

非局部均值去噪(Non-Local Means Denoising)是一种基于图像内容相似性的去噪方法,它通过搜索图像中的相似块,并计算这些相似块的平均值来估计目标像素的值,从而实现去噪。这种方法特别适用于去除高斯噪声和其他类型的随机噪声

代码如下:

import cv2
# 读取图像
image = cv2.imread('noisy_image.jpg', cv2.IMREAD_GRAYSCALE)
# 应用非局部均值去噪
non_local_filtered_image = cv2.fastNlMeansDenoising(image, None, 1010, 10, 7)
# 显示原图和非局部均值去噪后的图像
cv2.imshow('Original Image', image)
cv2.imshow('Non-Local Means Filtered Image', non_local_filtered_image)
# 等待按键后退出
cv2.waitKey(0)
cv2.destroyAllWindows()

其参数为:

  1. image: 输入图像,可以是灰度图像或彩色图像。
  2. dst: 输出图像,用于存储去噪后的结果。如果不指定,则由函数自动分配。
  3. h: 噪声估计的标准差。该参数控制了去噪的强度,较大的值会更多地去除噪声,但可能会模糊图像的细节。较小的值则可以更好地保留细节,但去噪效果可能不够理想。
  4. hforcolorcomponents:与h相同,但仅用于彩色图像。(通常与H相同)
  5. templateWindowSize: 模板窗口大小,以像素为单位。较大的值可以覆盖更多的像素,从而更好地平滑噪声,但可能会模糊边缘。较小的值则可以更好地保留边缘细节,但去噪效果可能不够理想。
  6. searchWindowSize: 搜索窗口大小,以像素为单位。较大的值可以覆盖更多的像素,从而更好地平滑噪声,但可能会模糊边缘。较小的值则可以更好地保留边缘细节,但去噪效果可能不够理想。

3.6引导滤波去噪

**引导滤波(Guided Filter)**是一种无监督的线性滤波器,它能够根据输入图像和引导图像(Guide Image)来估计输出图像。引导滤波去噪是引导滤波的一种应用,它利用引导图像来指导滤波器去除噪声,从而保留图像的细节。

代码如下:

def guidedfilter(I, p, r, eps):# 获取图像的高度和宽度height, width = I.shape# 计算引导图像I的局部均值m_I = cv2.boxFilter(I, -1, (r, r))# 计算输入图像p的局部均值m_p = cv2.boxFilter(p, -1, (r, r))# 计算引导图像I和输入图像p的局部乘积的均值m_Ip = cv2.boxFilter(I * p, -1, (r, r))# 计算引导图像I和输入图像p的局部协方差cov_Ip = m_Ip - m_I * m_p# 计算引导图像I自身的局部协方差,即局部方差m_II = cv2.boxFilter(I * I, -1, (r, r))var_I = m_II - m_I * m_I# 估计线性系数aa = cov_Ip / (var_I + eps)# 估计线性系数bb = m_p - a * m_I# 对系数a和b进行全局均值滤波,得到平滑的系数m_a = cv2.boxFilter(a, -1, (r, r))m_b = cv2.boxFilter(b, -1, (r, r))# 计算输出图像,即m_a * I + m_breturn m_a * I + m_b

参数说明:
I: 输入图像,可以是灰度图像或彩色图像。
p: 引导图像,用于指导滤波器。引导图像应与输入图像具有相同的尺寸和类型。
r: 引导滤波器的半径,以像素为单位。较大的半径可以覆盖更多的像素,从而更好地平滑噪声,但可能会模糊边缘。较小的半径则可以更好地保留边缘细节,但去噪效果可能不够理想。
eps: 引导滤波器的正则化参数。较大的值可以更好地平滑噪声,但可能会模糊图像的细节。较小的值则可以更好地保留细节,但去噪效果可能不够理想。

3.7小波变换去噪

**小波变换(Wavelet Transform)**是一种在数学和信号处理中常用的分析工具,它能够将一个信号或函数表示为一系列基函数(小波函数)的叠加。这些基函数被称为小波基,它们是具有特定频率和时间特性的函数。小波变换可以将信号分解为不同的频率成分,这些成分称为小波系数。常用的小基波有如下几种:Haar小波、Daubechies小波、Symlet小波等。常用的小波变换集成在pywt库中。

安装:pip install PyWavelets
代码如下:


import numpy as np
import matplotlib.pyplot as plt
from pywt import Wavelet, dwt2, idwt2
# 读取图像
image = plt.imread('image.jpg')  # 假设图像以BGR格式读取
# 转换为灰度图像
image_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 选择小波基,这里使用的是 'db4'
wavelet = Wavelet('db4')
# 执行二维离散小波变换
coeffs = dwt2(image_gray, wavelet)
# 显示小波系数
titles = ['LL', 'LH', 'HL', 'HH']
coeffs_image = [coeffs[0], coeffs[1][0], coeffs[1][1], coeffs[2]]
for i, a in enumerate(coeffs_image):plt.subplot(2, 2, i + 1), plt.imshow(a, cmap='gray')plt.title(titles[i]), plt.xticks([]), plt.yticks([])plt.show()# 执行逆二维离散小波变换,重构图像
reconstructed_image = idwt2(coeffs, wavelet)
# 显示重构后的图像
plt.imshow(reconstructed_image, cmap='gray')
plt.title('Reconstructed Image'), plt.xticks([]), plt.yticks([])
plt.show()

其中常用的小基波可以选择下面几种:

wavelets = [‘db2’, ‘db4’, ‘db6’, ‘db8’, ‘sym2’, ‘sym4’, ‘sym6’, ‘sym8’, ‘coif1’, ‘coif2’, ‘coif3’, ‘coif4’]

其分别代表:

  1. Daubechies小波 (‘dbN’):
    ○ N 表示滤波器的阶数,N 越大,滤波器越长,光滑性越好。
    ○ 常用的阶数有 db2, db4, db6, db8 等。
  2. Symlet小波 (‘symN’):
    ○ Symlet小波是Daubechies小波的改进版,具有更好的对称性。
    ○ 常用的阶数有 sym2, sym4, sym6, sym8 等。
  3. Coiflet小波 (‘coifN’):
    ○ Coiflet小波提供了比Daubechies小波更高的消失矩。
    ○ 常用的阶数有 coif1, coif2, coif3, coif4 等。
    在选择小波基时,需要考虑以下因素:
    光滑性:阶数较高的Daubechies小波或Symlet小波具有较好的光滑性。
    消失矩:较高的消失矩可以帮助更好地表示信号的瞬时特性。
    对称性:Symlet小波具有更好的对称性,有助于减少相位失真。
    计算复杂度:阶数较高的Daubechies小波计算复杂度较高。
    在实际应用中,通常需要根据具体的需求和图像特性来选择合适的小波基。例如,对于需要较高光滑性的图像,可以选择 db6 或 sym8 作为小波基。对于需要较高消失矩的图像,可以选择 coif4 作为小波基。

http://www.ppmy.cn/news/1508726.html

相关文章

24/8/8算法笔记 决策树构建鸢尾花

决策树是一种由算法自动设计的模型。在机器学习中,构建决策树的过程通常遵循以下步骤: 特征选择:算法会评估每个特征,并选择一个特征作为节点分裂的依据。这个选择基于某种准则,如信息增益(ID3算法&#xf…

《王道》课后练习1:栈

03: 栈的初态和终态均为空,以I和O分别表示入栈和出栈,则出入栈的操作序列可表示为由I和O组成的序列,可以操作的序列称为合法序列,否则称为非法序列。 1)下面所示的序列中哪些是合法的? 分析:…

redis 入门,一起学习redis

文章目录 一、什么是redis? redis的作用?二、redis的特点三、redis的基本数据结构类型四、redis 的三种特殊数据类型五、redis 作为缓存六、redis 作为缓存存在的问题6.1 数据一致性6.2 缓存雪崩6.3 缓存穿透6.4 缓存击穿 七、redis为什么那么快?八、re…

C语言——预处理详解(下)

目录 前言 #和## 1.#运算符 2.##运算符 命名约定 #undef 命令行定义 条件编译 1.单分支条件编译 2.多分支条件编译 3.判断是否被定义 4.嵌套指令 头文件的包含 1.头文件被包含的方式 (1)本地文件包含 (2)库文件包含 2.嵌套文件包含 其他预处理指令 1.#error…

第三章 zookeeper+kafka群集

消息队列 概念 消息(Message)是指在应用间传送的数据消息队列(Message Queue)是一种应用间的通信方式解决方法,确保消息的可靠传递 特征 存储 将消息存储在某种类型的缓冲区中,直到目标进程读取这些消…

【HarmonyOS NEXT星河版开发学习】小型测试案例11-购物车数字框

个人主页→VON 收录专栏→鸿蒙开发小型案例总结​​​​​ 基础语法部分会发布于github 和 gitee上面(暂未发布) 前言 经过一周的学习,我发现还是进行拆分讲解效果会比较好,因为鸿蒙和前端十分的相识。主要就是表达的方式不同罢了…

设计模式-单例设计模式

单例模式的设计和线程安全 单例模式是一种创建型设计模式,确保一个类只有一个实例,并提供一个全局访问点。实现单例模式时,线程安全性是一个重要考虑因素,特别是在多线程环境中。 1. C11 之前的线程安全实现 在 C11 之前&#…

电商平台的推荐算法需要备案吗?

答案是肯定的! 政策要求: 根据我国《互联网信息服务算法推荐管理规定》(以下简称《规定》)第六条,具有舆论属性或社会动员能力的互联网信息服务,包括电商平台的推荐算法,需要进行备案。 电商平…