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

一、简介:

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

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

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

  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
    # 估计线性系数a
    a = cov_Ip / (var_I + eps)
    # 估计线性系数b
    b = 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_b
    return 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 作为小波基。
  • 41
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值