OpenCV计算摄影学(2)图像去噪函数denoise_TVL1()

  • 操作系统:ubuntu22.04
  • OpenCV版本:OpenCV4.9
  • IDE:Visual Studio Code
  • 编程语言:C++11

算法描述

原始-对偶算法是用于解决特定类型变分问题(即,寻找一个函数以最小化某个泛函)的算法。特别地,图像去噪可以被视为一种变分问题,因此可以使用原始-对偶算法来进行去噪,这正是这里实现的内容。

需要注意的是,此实现取自2013年7月的一篇博客文章[194],该文章还包含了(稍微更通用的)现成的Python源代码。随后,Vadim Pisarevsky在2013年7月底用C++和OpenCV重写了这段代码,并最终由后续作者对其进行了轻微调整。

尽管可以在[49]中找到对该算法的详细讨论和理论依据,但在这里根据[194]简要概述一下是有意义的。首先,我们将1字节灰度级图像视为从像素矩形域(可以看作是集合{(x,y)∈N×N∣1≤x≤n,1≤y≤m},对于某些m,n∈N)到{0,1,…,255}的函数。我们将噪声图像表示为fi,并且在这种视角下,给定相同大小的图像x,我们可以通过以下公式衡量它的“坏程度”: ∥ ∥ ∇ x ∥ ∥ + λ ∑ i ∥ ∥ x − f i ∥ ∥ \left\|\left\|\nabla x\right\|\right\| + \lambda\sum_i\left\|\left\|x-f_i\right\|\right\| x+λixfi 这里的 ∥ ∥ ⋅ ∥ ∥ \|\|\cdot\|\| ∥∥∥∥
表示L2范数,如你所见,第一个加项表明我们希望我们的图像尽可能平滑(理想情况下,梯度为零,从而保持常数),第二个加项则表明我们希望结果接近我们得到的观测值。如果我们把x视为一个函数,这就是我们寻求最小化的泛函,而此时原始-对偶算法就派上用场了。

cv::denoise_TVL1 是 OpenCV 中用于图像去噪的一个函数,它使用基于总变分(Total Variation, TV)的 L1 正则化方法来处理图像噪声。这种方法特别适合于去除图像中的加性噪声,同时尽可能保留边缘信息。

函数原型

void cv::denoise_TVL1	
(const std::vector< Mat > & 	observations,Mat & 	result,double 	lambda = 1.0,int 	niters = 30 
)	

参数

  • 参数observations 这个数组应该包含一个或多个需要被恢复的图像的噪声版本。
  • 参数result 去噪后的图像将存储在这里。不需要预先分配存储空间,因为如果必要的话会自动分配。
  • 参数lambda 对应于上述公式中的λ。随着它的增大,更平滑(模糊)的图像相比细节丰富(但可能有更多的噪声)的图像会被更优地对待。粗略地说,随着它变小,结果会更加模糊,但可以去除更多的严重异常值。
  • 参数niters 算法运行的迭代次数。当然,迭代次数越多越好,但是很难从定量的角度来精确说明这一点,因此通常使用默认值并在结果不佳时增加迭代次数。

代码示例

#include <opencv2/opencv.hpp>
#include <vector>using namespace cv;
using namespace std;int main()
{// 加载一组观察图像(例如,多次拍摄的同一场景)vector< Mat > observations;observations.push_back( imread( "noisy_image_1.jpg", IMREAD_GRAYSCALE ) );observations.push_back( imread( "noisy_image_2.jpg", IMREAD_GRAYSCALE ) );observations.push_back( imread( "noisy_image_3.jpg", IMREAD_GRAYSCALE ) );if ( observations[ 0 ].empty() || observations[ 1 ].empty() || observations[ 2 ].empty() ){cout << "Could not open or find the images!" << endl;return -1;}// 确保所有图像具有相同的大小和类型for ( size_t i = 1; i < observations.size(); ++i ){if ( observations[ i ].size() != observations[ 0 ].size() || observations[ i ].type() != observations[ 0 ].type() ){cout << "All images must have the same size and type." << endl;return -1;}}Mat result;// 使用默认参数调用 denoise_TVL1 函数denoise_TVL1( observations, result );// 显示原始图像和去噪后的结果imshow( "Noisy Image 1", observations[ 0 ] );imshow( "Denoised Image", result );waitKey( 0 );return 0;
}

运行结果

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/70791.shtml

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

相关文章

在 Windows 下的 Docker 中安装 R语言

以下是在 Windows 系统的 Docker 中安装 R 语言的详细教程&#xff0c;包括 Docker 的安装、配置以及如何在容器中运行 R 语言的步骤。 步骤 1&#xff1a;安装 Docker 下载 Docker Desktop 访问 Docker 官方网站&#xff1a;Docker Desktop: The #1 Containerization Tool for…

【数据挖掘在量化交易中的应用:特征发现与特征提取】

好的&#xff0c;我将撰写一篇关于金融领域数据挖掘的技术博客&#xff0c;重点阐述特征发现和特征提取&#xff0c;特别是在量化交易中的应用。我会提供具体的实操步骤&#xff0c;并结合Python和TensorFlow进行代码示例。 完成后&#xff0c;我会通知您进行查看。 数据挖掘…

如何在视频中提取关键帧?

在视频处理中&#xff0c;提取关键帧是一项常见的任务。下面将介绍如何基于FFmpeg和Python&#xff0c;结合OpenCV库来实现从视频中提取关键帧的功能。 实现思路 使用FFmpeg获取视频的关键帧时间戳&#xff1a;FFmpeg是一个强大的视频处理工具&#xff0c;可以通过命令行获取…

九、数据治理架构流程

一、总体结构 《数据治理架构流程图》&#xff08;Data Governance Architecture Flowchart&#xff09; 水平结构&#xff1a;流程图采用水平组织&#xff0c;显示从数据源到数据应用的进程。 垂直结构&#xff1a;每个水平部分进一步划分为垂直列&#xff0c;代表数据治理的…

Docker 搭建 Gitlab 服务器 (完整详细版)

参考 Docker 搭建 Gitlab 服务器 (完整详细版)_docker gitlab-CSDN博客 Docker 安装 (完整详细版)_docker安装-CSDN博客 Docker 日常命令大全(完整详细版)_docker命令-CSDN博客 1、Gitlab镜像 # 查找Gitlab镜像 docker search gitlab # 拉取Gitlab镜像 docker pull gitlab/g…

Spring MVC 框架学习笔记:从入门到精通的实战指南

目录 1. Spring MVC 概述 2. Spring MVC 项目搭建 3. Spring MVC 执行流程 4. Spring MVC RequestMapping 注解 5. Spring MVC 获取请求参数 6. Spring MVC 常见注解 7. Spring MVC 响应处理 8. Spring MVC SSM 整合 9. Spring MVC 作用域传参 10. Spring MVC 上传 1…

RK3568开发笔记-AD7616调试笔记

目录 前言 一、AD7616介绍 高分辨率 高速采样速率 宽模拟输入范围 集成丰富功能 二、原理图连接 三、设备树配置 四、内核驱动配置 五、AD芯片测试 总结 前言 在嵌入式数据采集领域,将模拟信号精准转换为数字信号至关重要。AD7616 作为一款性能卓越的 16 位模数转换器…

【对话推荐系统】Towards Topic-Guided Conversational Recommender System 论文阅读

Towards Topic-Guided Conversational Recommender System 论文阅读 Abstract1 Introduction2 Related Work2.1 Conversation System2.2 Conversational Recommender System2.3 Dataset for Conversational Recommendation 3 Dataset Construction3.1 Collecting Movies for Re…

ASP.NET Core 8.0学习笔记(二十八)——EFCore反向工程

一、什么是反向工程 1.原则&#xff1a;DBFirst 2.反向工程&#xff1a;根据数据库表来反向生成实体类 3.生成命令&#xff1a;Scaffold-DbContext ‘连接字符串’ 字符串示例&#xff1a; Server.;DatabaseDemo1;Trusted_Connectiontrue; MultipleActiveResultSets true;Tru…

springcloud和dubbo的区别

Spring Cloud和Dubbo作为微服务架构中非常流行的两个框架&#xff0c;它们在多个方面存在显著的区别。以下是对两者区别的详细分析&#xff1a; 1. 初始定位和生态环境 Spring Cloud&#xff1a;定位为微服务架构下的一站式解决方案&#xff0c;依托于Spring平台&#xff0c;…

【大模型LLM】DeepSeek LLM Scaling Open-Source Language Models with Longtermism

深度探索LLM&#xff1a;以长期主义扩展开源语言模型 0.论文摘要 开源大语言模型&#xff08;LLMs&#xff09;的快速发展确实令人瞩目。然而&#xff0c;以往文献中描述的扩展规律得出了不同的结论&#xff0c;这为LLMs的扩展蒙上了一层阴影。我们深入研究了扩展规律&#…

C#快速调用DeepSeek接口,winform接入DeepSeek查询资料 C#零门槛接入DeepSeek C#接入DeepSeek源代码下载

下载地址<------完整源码 在数字化转型加速的背景下&#xff0c;企业应用系统对智能服务的需求日益增长。DeepSeek作为先进的人工智能服务平台&#xff0c;其自然语言处理、图像识别等核心能力可显著提升业务系统的智能化水平。传统开发模式下&#xff0c;C#开发者需要耗费大…

Qt常用控件之多行输入框QTextEdit

多行输入框QTextEdit QTextEdit 是一个多行输入框控件&#xff0c;支持富文本和 markdown 格式&#xff0c;当文本内容超出编辑框的范围时能自动提供滚动条。 QPlainTextEdit 是只支持富文本格式的多行输入框&#xff0c;属性和使用上与 QTextEdit 几乎没有区别。 QTextEdit属…

VC++零基础入门之系列教程 【附录E MFC快速参考指南】

附录E MFC快速参考指南 E.1 创建窗口 使用M F C CWnd wnd; W n d . C r e a t e E x ( E xSt y l e , C l a s s N a m e , Wi n d o w N a m e , S t y l e , x , y, Wi d t h , H e i g h t , P a r e n t , M e n u , P a r a m ) ; 使用A P I HWND hwnd=::CreateWi n d …

【前端】react+ts 轮播图的实现

一、场景描述 在很多网站的页面中都有轮播图&#xff0c;所以我想利用react.js和ts实现一个轮播图。自动轮播图已经在前面实现过了&#xff0c;如&#xff1a;https://blog.csdn.net/weixin_43872912/article/details/145622444?sharetypeblogdetail&sharerId145622444&a…

python与C系列语言的差异总结(4)

如果具有传统编译型语言的经验&#xff0c;大家可能会对是否使用字典而犹豫不决&#xff0c;担心字典的效率比列表或数组低。事实上Python字典的执行速度已经相当快了。Python语言的许多内部特性都依赖于字典&#xff0c;为提高字典的效率已经投入了大量的心血。Python的所有数…

[Web 安全] 反序列化漏洞 - 学习笔记

关注这个专栏的其他相关笔记&#xff1a;[Web 安全] Web 安全攻防 - 学习手册-CSDN博客 0x01&#xff1a;反序列化漏洞 — 漏洞介绍 反序列化漏洞是一种常见的安全漏洞&#xff0c;主要出现在应用程序将 序列化数据 重新转换为对象&#xff08;即反序列化&#xff09;的过程中…

深入理解C语言中的位段

在C语言编程中&#xff0c;我们常常会遇到需要对内存进行精细控制的场景&#xff0c;位段&#xff08;bit - field&#xff09;便是C语言提供的一种强大工具&#xff0c;它允许我们在一个字节或多个字节内对数据进行按位的定义和操作&#xff0c;极大地提高了内存使用效率。 一…

实现使用RBF(径向基函数)神经网络模拟二阶电机数学模型中的非线性干扰,以及使用WNN(小波神经网络)预测模型中的非线性函数来抵消迟滞影响的功能

下面将详细介绍如何实现使用RBF&#xff08;径向基函数&#xff09;神经网络模拟二阶电机数学模型中的非线性干扰&#xff0c;以及使用WNN&#xff08;小波神经网络&#xff09;预测模型中的非线性函数来抵消迟滞影响的功能。我们将按照以下步骤进行&#xff1a; 步骤1&#x…

Grouped-Query Attention(GQA)详解: Pytorch实现

Grouped-Query Attention&#xff08;GQA&#xff09;详解 Grouped-Query Attention&#xff08;GQA&#xff09; 是 Multi-Query Attention&#xff08;MQA&#xff09; 的改进版&#xff0c;它通过在 多个查询头&#xff08;Query Heads&#xff09;之间共享 Key 和 Value&am…