计算机视觉——传统数字图像处理中图像去噪原理与代码实现细节
1. 概述
在现实世界中捕获的图像常常受到噪声的影响,这些噪声可能来源于环境因素、信号不稳定、相机传感器问题、照明条件差、电损失等多种因素。为了进一步处理这些图像并对结果进行准确解释,拥有尽可能低噪声的图像至关重要。图像去噪是数字图像处理中的一个关键过程,其目标是通过减少噪声来提高图像的视觉质量。这一领域具有挑战性,因为它不仅需要理解图像中的噪声类型,还需要应用能够有效减少噪声并提供更准确原始图像表示的去噪方法。

2. 图像去噪的数学表示
带噪声的图像可以数学表示为原始图像与噪声的和:
O b s e r v e d I m a g e ( y ) = U n k n o w n O r i g i n a l I m a g e ( x ) + N o i s e ( n ) Observed\ Image\ (y) = Unknown\ Original\ Image\ (x) + Noise\ (n) Observed Image (y)=Unknown Original Image (x)+Noise (n)
其中,噪声 ( n ) 可以是高斯噪声、盐和胡椒噪声、散斑噪声等多种类型。去噪的主要目的是在最小化原始图像特征损失的同时,减少噪声并提高信噪比。
3. 图像去噪
去噪的挑战在于在平滑图像的平坦区域的同时保护边缘不被模糊,避免在图像中产生新的物体,并且保持图像的纹理特征。由于无法从带噪声的观测图像中直接得到原始图像的唯一解,因此我们只能寻求对原始图像的一个较好的估计。以下是一些常见的噪声类型及其特点:
3.1. 高斯噪声
高斯噪声源于遵循高斯分布的随机变化。它表现为一种微妙的、均匀的噪声,可能在图像采集过程中引入。通常,它会模糊边缘,降低图像清晰度,并源于电子传感器或传输错误等来源。
import cv2
import numpy as np
import matplotlib.pyplot as plt# Load an image
image = cv2.imread('Dataset/1.jpg') # Replace 'path_to_your_image.jpg' with your image path
plt.figure(figsize=(6, 6))
plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
plt.title("Original Image")
plt.axis('off')
plt.show()
# Function to add Gaussian noise to the image
def add_gaussian_noise(image):mean = 0std_dev = 25 # 标准差h, w, c = image.shapegaussian = np.random.normal(mean, std_dev, (h, w, c))noisy_image = np.clip(image + gaussian, 0, 255).astype(np.uint8)return noisy_image, 'Gaussian Noise'

3.2. 盐和胡椒噪声
这种类型的噪声表现为图像中散布的孤立白色和黑色像素,类似于盐和胡椒的颗粒。这些随机像素通常是数据传输或存储错误的结果。盐和胡椒噪声可能会掩盖细节,并对视觉解释产生重大影响。
# Function to add salt-and-pepper noise to the image
def add_salt_and_pepper_noise(image, amount=0.05):noisy_image = np.copy(image)num_salt = np.ceil(amount * image.size * 0.5)salt_coords = [np.random.randint(0, i - 1, int(num_salt)) for i in image.shape]noisy_image[salt_coords] = 255num_pepper = np.ceil(amount * image.size * 0.5)pepper_coords = [np.random.randint(0, i - 1, int(num_pepper)) for i in image.shape]noisy_image[pepper_coords] = 0return noisy_image, 'Salt-and-Pepper Noise'

3.3. 散斑噪声
散斑噪声在通过超声波或合成孔径雷达获取的图像中很常见,会导致随机的亮度或暗度变化。它模糊了细节,改变了像素强度,并为图像分析和解释带来了挑战。
# Function to add speckle noise to the image
def add_speckle_noise(image):h, w, c = image.shapespeckle = np.random.randn(h, w, c)noisy_image = np.clip(image + image * speckle * 0.1, 0, 255).astype(np.uint8)return noisy_image, 'Speckle Noise'

3.4. 泊松噪声
泊松噪声源于泊松分布,常见于低光摄影或天文成像中。它表现为颗粒状的伪影,并在光线微弱的条件下降低了图像对比度和清晰度,影响整体图像质量。
# Function to add Poisson noise to the image
def add_poisson_noise(image):vals = len(np.unique(image))vals = 2 ** np.ceil(np.log2(vals))noisy_image = np.random.poisson(image * vals) / float(vals)return noisy_image.astype(np.uint8), 'Poisson Noise'

3.5. 周期性或频带噪声
周期性噪声以图像上的规则模式或频带呈现,通常由干扰或传感器问题引起。它扭曲了细节,改变了图像的外观,并为准确解释带来了挑战。
# Function to add periodic or banding noise to the image
def add_periodic_noise(image, frequency=16):h, w, c = image.shapex = np.arange(w)y = np.arange(h)X, Y = np.meshgrid(x, y)noise = np.sin(2 * np.pi * frequency * Y / h) * 128 + 128noisy_image = np.clip(image + noise[..., np.newaxis], 0, 255).astype(np.uint8)return noisy_image, 'Periodic Noise'

理解这些不同类型的噪声对于图像处理和分析至关重要。每种类型都表现出影响图像保真度的不同特征,推动了强大去噪技术的发展。通过全面认识这些噪声变化,图像处理领域的研究人员和从业者旨在制定有效的去噪策略,包括机器学习驱动的方法,如自编码器,努力减轻这些噪声影响,恢复图像质量,并在各种应用中实现准确分析。
4. 空间域滤波
空间域滤波涉及直接在空间域(图像本身)中操作图像的像素值,以增强或修改其特性。空间域滤波使用不同类型的滤波器来实现各种效果:
4.1. 平滑滤波器
- 均值滤波器:用邻近像素的平均值替换每个像素的值。它可以减少噪声,但可能会模糊边缘和细节。
- 高斯滤波器:根据高斯分布为邻近像素分配权重。它平滑图像,同时比均值滤波更好地保留边缘。
4.2. 锐化滤波器
- 拉普拉斯滤波器:通过突出突然的强度变化来增强边缘。它强调边缘,但也放大了噪声。
- 高通滤波器:强调高频分量,使边缘和细节更加明显。它可以增强图像,但也可能放大噪声。
4.3. 边缘检测滤波器
- Sobel和Prewitt滤波器:通过计算水平和垂直方向的梯度来识别边缘。它们突出显示不同方向的边缘。
- Canny边缘检测器:更高级,它使用多个步骤来准确地检测边缘,通过抑制噪声和寻找梯度中的局部最大值。
4.4. 其他滤波器
- 中值滤波器:用邻近像素的中值替换像素的值。在去除盐和胡椒噪声的同时保留边缘非常有效。
- 双边滤波器:在减少噪声的同时保留边缘。它根据空间和强度差异来平滑图像。
4.5. 空间域滤波过程
- 卷积操作:通过卷积应用滤波器,滤波器核在图像上移动,根据邻近像素的加权和计算新的像素值。
- 滤波器大小和参数:滤波器核(掩模)的大小和值决定了滤波器对图像的影响。较大的核具有更广泛的平滑效果,但它们可能会模糊细节。
4.6. 考虑因素
- 计算复杂性:由于较大的核尺寸或复杂的操作,一些滤波器需要更多的计算资源。
- 边缘保留:平滑滤波器可能会模糊边缘,影响图像的整体锐度。
- 伪影减少:像中值和双边这样的滤波器可以有效减少特定类型的噪声,同时保留图像细节。
4.7. 应用
空间域滤波在图像去噪、边缘检测、图像增强和特征提取中找到应用,涵盖医学成像、计算机视觉和摄影等多个领域。了解这些滤波器类型有助于根据期望的结果和图像及噪声的性质选择适当的滤波器进行特定的图像处理任务。
import cv2
import numpy as np
import matplotlib.pyplot as plt# Load an image
image = cv2.imread('Dataset/1.jpg', 0) # Replace 'path_to_your_image.jpg' with your image path and load as grayscale# Add noise to the image (example: Gaussian noise)
def add_gaussian_noise(image):mean = 0std_dev = 25h, w = image.shapegaussian = np.random.normal(mean, std_dev, (h, w))noisy_image = np.clip(image + gaussian, 0, 255).astype(np.uint8)return noisy_imagenoisy_image = add_gaussian_noise(image)# Apply different filters to the noisy image
filtered_mean = cv2.blur(noisy_image, (5, 5)) # Mean filter (5x5 kernel)
filtered_gaussian = cv2.GaussianBlur(noisy_image, (5, 5), 0) # Gaussian filter (5x5 kernel)
filtered_median = cv2.medianBlur(noisy_image, 5) # Median filter (5x5 kernel)
laplacian = cv2.Laplacian(noisy_image, cv2.CV_8U) # Laplacian filter
sobel_x = cv2.Sobel(noisy_image, cv2.CV_8U, 1, 0, ksize=5) # Sobel X filter (5x5 kernel)
sobel_y = cv2.Sobel(noisy_image, cv2.CV_8U, 0, 1, ksize=5) # Sobel Y filter (5x5 kernel)
canny = cv2.Canny(noisy_image, 100, 200) # Canny edge detection# Display the original noisy image and filtered images
titles = ['Noisy Image', 'Mean Filter', 'Gaussian Filter', 'Median Filter', 'Laplacian', 'Sobel X', 'Sobel Y', 'Canny']
images = [noisy_image, filtered_mean, filtered_gaussian, filtered_median, laplacian, sobel_x, sobel_y, canny]for i in range(len(images)):plt.subplot(2, 4, i + 1)plt.imshow(images[i], cmap='gray') # Display as grayscaleplt.title(titles[i])plt.axis('off')plt.tight_layout()
plt.show()

5. 变分去噪方法
变分去噪方法是一类图像去噪技术,旨在通过最小化目标函数或能量泛函来从图像中去除噪声。这些方法基于变分原理,通常使用数学模型以一种保留重要特征同时减少噪声的方式对图像进行正则化。以下是详细分解:
5.1. 变分去噪原理
- 能量泛函:通过定义一个由数据项和正则化项组成的能量泛函,将去噪表述为一个优化问题。
- 数据项:衡量带噪图像与期望的去噪图像之间的差异。
- 正则化项:编码有关噪声特征和去噪图像期望属性的先验知识。
5.2. 变分模型
- 总变分(TV)正则化:总变分(TV)正则化是图像处理中用于去噪和图像重建的技术。由于其在有效减少噪声的同时保留边缘和细节的能力,它是一种受欢迎的方法。
TV正则化的基础
- 目标:TV正则化的主要目标是在保留重要结构(如边缘)的同时最小化图像的总变分。
- 总变分:简单来说,图像的总变分衡量图像中存在的强度变化量。数学上,对于灰度图像 ( u ),( \frac{\partial u}{\partial x} ) 和 ( \frac{\partial u}{\partial y} ) 分别表示水平和垂直方向的梯度。
- 去噪中的TV正则化:当应用于去噪时,TV正则化技术在保留边缘的同时最小化带噪图像的总变分。它通过寻找一个同时保持平滑区域和尖锐过渡(边缘)的去噪图像来实现这一点。
TV正则化在去噪中的作用
- 噪声减少:TV正则化有效地减少噪声,同时保留像边缘和纹理这样的尖锐特征。它惩罚通常与噪声相关的图像中的高频分量。
- 边缘保留:TV正则化的关键优势是其保留边缘的能力。由于它最小化了总变分,它倾向于分段平滑区域,有效地将边缘作为高变分区域保留下来。
- 数学优化:基于TV的去噪被表述为一个优化问题,旨在找到一个去噪图像,该图像在接近带噪图像的同时最小化总变分。使用梯度下降或更复杂的优化算法来迭代解决这个问题。
考虑和挑战
- 参数调整:TV正则化方法通常涉及调整参数,如正则化参数(( \lambda )),以平衡去噪和保留图像结构之间的关系。
- 计算复杂性:TV正则化中的优化可能在计算上很密集,特别是对于大图像或高分辨率数据。
- 伪影:在某些情况下,TV去噪可能会引入被称为阶梯效应的伪影,其中平滑区域可能看起来块状或显示出不自然的边缘。
应用
- 医学成像:TV正则化在各种医学成像任务中使用,如MRI去噪、CT图像重建等,以提高图像质量。
- 图像恢复:它被应用于图像恢复任务中,以去除噪声并增强图像细节。
- 计算机视觉:由于其保留边缘的特性,TV正则化在计算机视觉任务中找到应用,如对象检测、边缘检测和特征提取。
ROF(Rudin-Osher-Fatemi)模型
ROF模型是一种基于TV正则化的去噪方法,通过迭代解决一个凸优化问题来获得去噪图像。它为TV正则化增加了一个额外的约束,以增强去噪能力。
相关文章:
计算机视觉——传统数字图像处理中图像去噪原理与代码实现细节
1. 概述 在现实世界中捕获的图像常常受到噪声的影响,这些噪声可能来源于环境因素、信号不稳定、相机传感器问题、照明条件差、电损失等多种因素。为了进一步处理这些图像并对结果进行准确解释,拥有尽可能低噪声的图像至关重要。图像去噪是数字图像处理中…...
【STM32】最后一刷-江科大Flash闪存-学习笔记
FLASH简介 STM32F1系列的FLASH包含程序存储器、系统存储器和选项字节三个部分,通过闪存存储器接口(外设)可以对程序存储器和选项字节进行擦除和编程,(系统存储器用于存储原厂写入的BootLoader程序,用于串口…...
JS实现动态点图酷炫效果
实现目标 分析问题 整个图主要是用canvas实现,其中难点是将线的长度控制在一定范围内、并且透明度随长度变化。 前置知识 canvas绘制点、线、三角形、弧形 // 点ctx.moveTo(this.x, this.y);ctx.arc(this.x, this.y, this.r,0, 2 * Math.PI, false);ctx.fillStyle …...
【第十三届“泰迪杯”数据挖掘挑战赛】【2025泰迪杯】【思路篇】A题解题全流程(持续更新)
【第十三届“泰迪杯”数据挖掘挑战赛】【2025泰迪杯】A题解题全流程-思路(持续更新) 写在前面: 1、A题、C题将会持续更新,陆续更新发布文章 2、赛题交流咨询Q群:1037590285 3、全家桶依旧包含: 代码、…...
爱普生晶体单元FC2012AN在5G RedCap中的应用
在 5G 技术向物联网领域深度渗透的今天,RedCap(5G 轻量化)作为衔接中高速物联网场景的关键技术,正加速推动工业、医疗、可穿戴等领域的智能化升级。爱普生 FC2012AN 低 ESR 晶体单元凭借其突破性的小尺寸、低功耗与高稳定性设计&a…...
vue 两种路由模式
一、两种模式比较 在vue.js中,路由模式分为两种:hash 模式和 history 模式。这两种模式决定了URL的结构和浏览器历史记录的管理方式。 1. hash 模式带 #,#后面的地址变化不会引起页面的刷新。换句话说,hash模式不会将#后面的地址…...
Java-servlet(十)使用过滤器,请求调度程序和Servlet线程(附带图谱表格更好对比理解)
Java-servlet(十)使用过滤器,请求调度程序和Servlet线程 前言一、Servlet 间通信(了解即可)二、Servlet 请求处理:getAttribute 和 getParameter 的区别与应用1.getAttribute 方法2.getParameter 方法 三、…...
ue5 学习笔记 FPS游戏制作35 GameMode与GameInstance
文章目录 相似GameMode介绍声明设置生效调用 GameInstance介绍声明设置生效调用 相似 两者都用来保存公共的数据和方法 数据都在内存里,关闭程序后数据消失 GameMode 介绍 生命周期跟随关卡,关卡销毁GameMode也跟随销毁 内部可以定义属性和方法 声明…...
rocky9.4 升级SSH 9.9p2
echo "##################################开始升级Openssh##################################################################################" ##ssh变量---------------------------------------- sshnumber9.9p2 sshnumber1ssh -V 2>&1 | cut -d, -f…...
基于WebSocket的金融数据实时推送系统架构设计对接多国金融数据API
基于WebSocket的金融数据实时推送系统架构设计 ——高可用、低延迟与全球化数据支持的技术实践 一、实时数据推送的技术演进 在证券交易、外汇监控、量化策略等场景中,毫秒级延迟可能带来完全不同的业务结果。早期基于HTTP轮询的方案存在三大核心问题:…...
山洪预警秒级响应-AI本地化部署在极端降雨短临预测中的技术突破。AI智能体开发与大语言模型的本地化部署、优化技术
极端降雨预测的技术痛点与边缘破局 1. 传统预警系统的三重瓶颈 延迟致命:WRF模式在1km分辨率下3小时预报耗时>45分钟,错过山洪黄金响应期 地形干扰大:复杂地形区(如横断山脉)降水预测误差超50% 数…...
矿山自动化监测解决方案
1.行业现状 为贯彻落实《中共中央国务院关于推进安全生产领域改革发展的意见》《“十四五”矿山安全生产规划》(应急〔2022〕64号)、《国务院安委会办公室关于加强矿山安全生产工作的紧急通知》(安委办〔2021〕3号)等有关工作部署…...
pytorch学习(b站小土堆学习)
1 环境配置 参考链接 2. dir 和 help函数 dir():用于查看某一模块函数的方法 help(): 用于查看某方法的使用方法 3. dataset类实战 利用Image对象打开图片,利用os模块的地址拼接组成图片路径 当我们用方括号访问元素对象时,…...
微信小程序:解决tabbar切换时,页面不刷新问题
在微信小程序中,默认情况下切换 tabBar 页面时,页面不会重新加载或刷新(而是保持之前的状态)。如果你需要在切换 tabBar 时触发数据刷新或重新执行某些逻辑,可以通过以下方法解决: 方法 1:…...
【最新】探索CFD的未来:从OpenFOAM到深度学习,全面解析计算流体力学的顶级资源与前沿技术
计算流体力学(CFD)作为现代工程与科学研究的核心工具,正以前所未有的速度迈向智能化与多物理场耦合的新时代。本文全面梳理了在线学习CFD的顶级资源,涵盖了从传统数值模拟到深度学习驱动的物理信息模型的广泛领域,旨在为研究者、工程师和学生提供一站式参考指南。内容分为…...
算法专题一:双指针算法(下)
书接上回 5.有效三角形个数 力扣: 有效三角形的个数 在做这道题前我们先讲一个数学知识:已知 a < b < c ,此时 ab>c 可以得出 有效三角形。 所以,我们做这道题时,可以不使用暴力算法。 可以优化为先排序ÿ…...
数据库部署在服务器表不存在解决方案
MySQL 数据库表不存在错误解决方案 MySqlException (0x80004005): Table store.SysLogOperate doesnt exist 服务器用的mysql5.6 用这个表syslogoperate只是全是小写 看起来你在使用 Pomelo.EntityFrameworkCore.MySql 作为 MySQL 数据库的提供程序,并且在初始化…...
咪咕MG101_晨星MSO9380芯片_安卓5.1.1_免拆卡刷固件包
咪咕MG101_晨星MSO9380芯片_安卓5.1.1_免拆卡刷固件包(内有教程) 刷机教程简单说明: 1、把下载好的刷机包,U盘里建立一个upgrade文件夹,固件放入此文件夹里,放入U盘中,注意升级包为压缩包不要对…...
cJSON类型及type值详解
cJSON的核心结构体 cJSON的核心结构体就是一个cJSON,理解了这个结构体,基本上对cJSON的使用就有了个基本概念了。该结构体具体定义如下: typedef struct cJSON { struct cJSON*next,*prev; /* 遍历数组或对象链的前向或后向链表指…...
T11 TensorFlow入门实战——优化器对比实验
🍨 本文為🔗365天深度學習訓練營 中的學習紀錄博客🍖 原作者:K同学啊 | 接輔導、項目定制 一、前期准备 1. 导入数据 # Import the required libraries import pathlib import matplotlib.pyplot as plt import tensorflow as t…...
2023年3月全国计算机等级考试真题(二级C语言)
😀 第1题 下列叙述中错误的是 A. 向量是线性结构 B. 非空线性结构中只有一个结点没有前件 C. 非空线性结构中只有一个结点没有后件 D. 只有一个根结点和一个叶子结点的结构必定是线性结构 概念澄清 首先,我们需要明确几个关键概念…...
在MFC中使用Qt(四):使用属性表(Property Sheet)实现自动化Qt编译流程
前言 首先回顾下前面文章介绍的: 在MFC中使用Qt(一):玩腻了MFC,试试在MFC中使用Qt!(手动配置编译Qt) 在MFC中使用Qt(二):实现Qt文件的自动编译流…...
Python-八股总结
目录 1 python 垃圾处理机制2 yield3 python 多继承,两个父类有同名方法怎么办?4 python 多线程/多进程/协程4.1 多线程与GIL全局解释器锁4.2 多进程4.3 协程 5 乐观锁/悲观锁6 基本数据结构**1. 列表(List)****2. 元组࿰…...
局域网数据同步软件,局域网数据备份的方法
局域网数据备份的方法: 局域网数据备份是确保数据安全性的重要措施,以下是一些常用的局域网数据备份方法: 1.使用NAS设备备份 特点:网络附加存储(NAS)设备提供了一种便捷的备份方式。 操作:…...
ngx_http_core_init_main_conf
定义在 src\http\ngx_http_core_module.c static char * ngx_http_core_init_main_conf(ngx_conf_t *cf, void *conf) {ngx_http_core_main_conf_t *cmcf conf;ngx_conf_init_uint_value(cmcf->server_names_hash_max_size, 512);ngx_conf_init_uint_value(cmcf->serv…...
座舱与智驾“双轮驱动”,芯擎科技打造智能汽车“芯”标杆
在比亚迪、吉利、奇瑞等各大主机厂打响“全民智驾”的关键时期,以芯擎科技为代表中国芯片厂商开始“放大招”。 2025年3月27日,芯擎科技在南京举办了“擎随芯动、智融万象”生态科技日,重磅发布了“星辰一号”、“星辰一号Lite”,…...
《新能源汽车 DEEA 平台开发策略》
一、引言 在新能源汽车行业加速向智能化、电动化转型的当下,电子电气架构(EEA)成为汽车技术创新的关键领域。DEEA 平台作为应对行业变革的重要举措,其开发策略对于提升汽车产品竞争力、满足市场多样化需求意义重大。本策略围绕平台…...
R语言实现轨迹分析--traj和lcmm包体会
R语言实现轨迹分析–traj和lcmm包体会 轨迹分析是对重复测量数据的一种归纳,转化为一种分类变量,比如手术后1~7天内的疼痛评分,可以形成术后急性痛轨迹。形成的轨迹作为一个分类变量,可以用于预测疾病的预后ÿ…...
Spring Boot中对同一接口定义多个切面的示例,分别通过接口方式和注解方式实现切面排序,并对比差异
以下是Spring Boot中对同一接口定义多个切面的示例,分别通过接口方式和注解方式实现切面排序,并对比差异: 一、接口方式实现切面排序 1. 定义接口 // 服务接口 public interface MyService {void methodA();void methodB(); }// 接口实现类…...
从零开始:Windows 系统中 PowerShell 配置 FFmpeg 的详细步骤
在Windows系统中不想每次都 cd 到FFmpeg目录中应用,现在可以通过PowerShell在任意目录下应用了。 PowerShell 基础概念 跨平台脚本工具 PowerShell 是微软开发的命令行外壳和脚本语言,支持 Windows、Linux 和 macOS 系统。其核心优势在于面向对象的操作…...
