首页 > 其他分享 >opencv图像增强一:传统图像去噪方法整理

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

时间:2024-08-10 12:26:36浏览次数:17  
标签:图像去噪 滤波 image cv2 小波 像素 opencv 图像 图像增强

一、简介:

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

文章目录

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

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

  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, 10,10, 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 作为小波基。

标签:图像去噪,滤波,image,cv2,小波,像素,opencv,图像,图像增强
From: https://blog.csdn.net/HanWenKing/article/details/141013435

相关文章

  • 图像增强方法
    2.1直方图均衡化(HistogramEqualization)介绍直方图均衡化是一种图像处理技术,用于增强图像的对比度。通过调整图像的灰度值分布,使得图像的细节更加清晰。原理直方图均衡化通过累积分布函数(CDF)重新分配灰度值,使得图像的像素值分布更加均匀,从而提升图像的整体对比度。公......
  • OpenCV与AI深度学习 | 手把手教你用Python和OpenCV搭建一个半自动标注工具(详细步骤 +
    本文来源公众号“OpenCV与AI深度学习”,仅用于学术分享,侵权删,干货满满。原文链接:手把手教你用Python和OpenCV搭建一个半自动标注工具(详细步骤+源码)导 读    本文将手把手教你用Python和OpenCV搭建一个半自动标注工具(包含详细步骤+源码)。背景介绍    样本标......
  • opencv4.5 带cuda 安装
    opencv4.5cmake-DCMAKE_BUILD_TYPE=RELEASE-DCMAKE_CXX_FLAGS_RELEASE="-O3"-DCMAKE_INSTALL_PREFIX=/home/slam/Thirdpart/opencv-4.5.2/install-DOPENCV_EXTRA_MODULES_PATH=/home/slam/Thirdpart/opencv-4.5.2/opencv_contr......
  • OpenCV图像滤波(6)高斯滤波函数GaussianBlur()的使用
    操作系统:ubuntu22.04OpenCV版本:OpenCV4.9IDE:VisualStudioCode编程语言:C++11算法描述函数使用高斯滤波器对图像进行模糊处理。该函数使用指定的高斯核对源图像进行卷积。支持原位过滤。高斯模糊是一种有效的图像平滑技术,可以减少图像中的噪声和细节。函数原型vo......
  • OpenCV图像滤波(7)cv::getDerivKernels() 函数的使用
    操作系统:ubuntu22.04OpenCV版本:OpenCV4.9IDE:VisualStudioCode编程语言:C++11算法描述函数返回用于计算空间图像导数的滤波系数。该函数计算并返回用于空间图像导数的滤波系数。当ksize=FILTER_SCHARR时,生成Scharr3x3核(参见Scharr)。否则,生成Sobel核(参见Sob......
  • OpenCV 其他形态学操作
    一:顶帽实现(原图像与开操作图像的差值)importcv2ascvimportnumpyasnpdeftop_hat_demo(image):gray=cv.cvtColor(image,cv.COLOR_BGR2GRAY)ret,binary=cv.threshold(gray,0,255,cv.THRESH_BINARY|cv.THRESH_OTSU)cv.imshow("binary",binary)......
  • OpenCV 分水岭算法
    使用分水岭算法进行图像分割(一)获取灰度图像,二值化图像,进行形态学操作,消除噪点defwatershed_demo(image):blur=cv.pyrMeanShiftFiltering(image,10,100)gray=cv.cvtColor(blur,cv.COLOR_BGR2GRAY)#获取灰度图像ret,binary=cv.threshold(gray,0,2......
  • OpenCV 人脸检测
    目录一:相关依赖文件下载二:实现步骤(图片检测)  (一)读取图片  (二)灰度转换  (三)获取人脸识别训练数据  (四)探测人脸,获取相关数据  (五)根据相关数据在原图像上画出人脸位置  (六)全部代码三:实现视频检测人脸  步骤相同,我们只需要将视频中每一帧图像进行处理,......
  • OpenCV 数字验证码识别
    目录一:依赖环境安装二:安装tesseract-ocr  (一)介绍  (二)下载地址  (三)下载traineddata训练数据三:代码实现一:依赖环境安装pipinstallPillowpip3installpytesseract二:安装tesseract-ocr(一)介绍其中pytesseract会直接调用tesseract模块,我们需要进行安装不......
  • OpenCV 基本使用
    OpenCV基本使用参考教程:GitHub-gaoxiang12/slambook2:edition2oftheslambook1.安装OpenCV1.1下载OpenCV参考教程:无法定位软件包libjasper-dev的解决办法-CSDN博客视觉slam14讲ch5opencv安装ubuntu20.04_libvtk5-dev-CSDN博客OpenCV提供了大量的开源图像算......