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

devtools/2025/2/26 5:55:06/
  • 操作系统: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.ppmy.cn/devtools/162737.html

相关文章

webdriver-manager

webdriver-manager是一个用于管理Selenium WebDriver的命令行工具&#xff0c;它可以帮助用户安装、更新和启动Selenium WebDriver。以下是对webdriver-manager的详细解释&#xff1a; 一、webdriver-manager的用途 自动下载WebDriver&#xff1a;webdriver-manager可以自动检…

28.C++多态1 (多态的概念与简单使用,虚函数,final,override)

⭐上篇文章&#xff1a;27.C继承 3 (复杂的菱形继承与菱形虚拟继承)-CSDN博客 ⭐本篇代码&#xff1a;c学习/17.C三大特性-多态 橘子真甜/c-learning-of-yzc - 码云 - 开源中国 (gitee.com) ⭐标⭐是比较重要的部分 目录 一. C多态简介 1.1 构成多态的两个必要条件 二. vir…

装箱和拆箱是什么?(C#)

在 C# 中&#xff0c;装箱&#xff08;Boxing&#xff09;和拆箱&#xff08;Unboxing&#xff09;是值类型&#xff08;Value Type&#xff09;和引用类型&#xff08;Reference Type&#xff09;之间相互转换的过程。 目录 1 装箱 2 拆箱 3 性能影响 1 装箱 装箱是将值…

axios几种请求类型的格式

Axios 是一个基于 Promise 的 HTTP 客户端&#xff0c;广泛用于浏览器和 Node.js 中发送 HTTP 请求。它支持多种请求格式&#xff0c;包括 GET、POST、PUT、DELETE 等。也叫RESTful 目录 一、axios几种请求类型的格式 1、get请求 2、post请求 3、put请求 4、delete请求 二…

Visual Studio Code 跨平台安装与配置指南(附官方下载链接)

一、软件定位与核心功能 Visual Studio Code&#xff08;简称VS Code&#xff09;是微软开发的开源跨平台代码编辑器&#xff0c;支持超过50种编程语言的智能补全、调试和版本控制功能。2025版本新增AI辅助编程模块&#xff0c;可自动生成单元测试代码和API文档注释。 二、下载…

选择排序:简单高效的选择

大家好&#xff0c;今天我们来聊聊选择排序&#xff08;Selection Sort&#xff09;算法。这是一个非常简单的排序算法&#xff0c;适合用来学习排序的基本思路和操作。选择排序在许多排序算法中以其直观和易于实现的特点著称&#xff0c;虽然它的效率不如其他高效算法&#xf…

VS2022配置FFMPEG库基础教程

1 简介 1.1 起源与发展历程 FFmpeg诞生于2000年&#xff0c;由法国工程师Fabrice Bellard主导开发&#xff0c;其名称源自"Fast Forward MPEG"&#xff0c;初期定位为多媒体编解码工具。2004年后由Michael Niedermayer接任维护&#xff0c;逐步发展成为包含音视频采…

服务器释放screen资源(Detached状态并不会释放资源)

你可以使用 screen 命令来列出所有会话并手动关闭它们&#xff0c;或者直接终止所有的会话来释放资源。以下是如何操作的步骤&#xff1a; 1. 列出所有 screen 会话 你已经使用 screen -ls 列出了当前所有的 screen 会话。输出中显示了每个会话的 ID 和状态&#xff08;Detac…