全变分(TV)模型原理与C++实现

本文介绍了TV模型的基本原理,并给出了C++代码实现。

一、TV模型原理

二、C++实现

关于Matlab的程序实现,有一个经典的主页: http://visl.technion.ac.il/~gilboa/PDE-filt/tv_denoising.html

有博主改成了C++代码:见经典的变分法图像去噪的C++实现

另有博主改成了更简洁的版本:见【图像处理】全分发TV图像去噪

本文代码基本参照上面的版本

void CImageObj::Total_Variation(int iter, double dt, double epsilon, double lambda)
{
	int i, j;
	double ep2 = epsilon * epsilon;

	double** I_t = NewDoubleMatrix(m_width, m_height);
	for (i = 0; i < m_height; i++)
		for (j = 0; j < m_width; j++)
			I_t[i][j] = m_imgData[i][j];

	for (int t = 0; t < iter; t++)
	{
		for (i = 1; i < m_height - 1; i++)
		{
			for (j = 1; j < m_width - 1; j++)
			{
				double tmp_x = (I_t[i][j + 1] - I_t[i][j - 1]) / 2.0;
				double tmp_y = (I_t[i + 1][j] - I_t[i - 1][j]) / 2.0;
				double tmp_xx = I_t[i][j + 1] + I_t[i][j - 1] - 2 * I_t[i][j];
				double tmp_yy = I_t[i + 1][j] + I_t[i - 1][j] - 2 * I_t[i][j];
				double tmp_xy = (I_t[i + 1][j + 1] + I_t[i - 1][j - 1] - I_t[i - 1][j] - I_t[i][j - 1]) / 4.0;
				double tmp_num = tmp_yy * (tmp_x * tmp_x + ep2) + tmp_xx * (tmp_y * tmp_y + ep2) - 2 * tmp_x * tmp_y * tmp_xy;
				double tmp_den = pow(tmp_x * tmp_x + tmp_y * tmp_y + ep2, 1.5);

				I_t[i][j] += dt*(tmp_num / tmp_den + lambda*(m_imgData[i][j] - I_t[i][j]));
			}
		}

	} // 迭代结束

	// 给图像赋值
	for (i = 0; i < m_height; i++)
		for (j = 0; j < m_width; j++)
		{
			double tmp = I_t[i][j];
<span style="white-space:pre">			</span>tmp = max(0,min(tmp, 255));
			m_imgData[i][j] = (unsigned char)tmp;
		}

	DeleteDoubleMatrix(I_t, m_width, m_height);
}
时间: 2024-10-29 19:17:39

全变分(TV)模型原理与C++实现的相关文章

[家里蹲大学数学杂志]第057期图像复原中的改进 TV 模型

$\bf 摘要$: 本文给出了王大凯等编的<图像处理中的偏微分方程方法>第 6.2 节的详细论述. $\bf 关键词$: 图像复原; TV 模型; matlab 编程 1. 前言 图像在形成.传输和存储过程中中, 图像质量可能退化 (degradation). 而退化的图像可用数学模型: $$\bee\label{1:d} u_0=h_d*f+n \eee$$来描述, 其中 (1)$f(x,y)$ 是理想的图像; (2)$h_d(x,y)$ 是成像系统的点弥散函数 (point-spread

Select模型原理

Select模型原理 利用select函数,推断套接字上是否存在数据,或者是否能向一个套接字写入数据.目的是防止应用程序在套接字处于锁定模式时,调用recv(或send)从没有数据的套接字上接收数据,被迫进入堵塞状态. select參数和返回值意义例如以下: int select ( IN int nfds,                           //0,无意义 IN OUT fd_set* readfds,      //检查可读性 IN OUT fd_set* writefds

各向异性扩散PM模型原理与C++实现

本文介绍了各向异性扩散PM模型,并给出了C++代码实现. 一.PM模型原理 其中,                                                      二.C++代码实现 MATLAB代码可参考:http://www.csse.uwa.edu.au/~pk/research/matlabfns/Spatial/anisodiff.m http://www.mathworks.com/matlabcentral/fileexchange/14995-aniso

comet反向Ajax模型原理与模型(笔记一)

comet反向Ajax模型原理与模型(笔记一) 网页实时聊天有两种方式: 第一种:不断的查询是否有新消息,耗费资源,并非真正的实时 第二种:使用反向Ajax,页面不断开,一有数据就立即发送,真正的实时 我们先简单做一个页面不断开的浏览器页面: 1 ob_start(); 2 3 <?php 4 5 /* 反向Ajax原理 6 7 * comet 反向ajax 8 9 * 又叫服务器推技术 server push 10 11 * 在"实时聊天","消息推送"中,

[NLP] TextCNN模型原理和实现

1. 模型原理 1.1 论文 Yoon Kim在论文(2014 EMNLP) Convolutional Neural Networks for Sentence Classification提出TextCNN. 将卷积神经网络CNN应用到文本分类任务,利用多个不同size的kernel来提取句子中的关键信息(类似于多窗口大小的ngram),从而能够更好地捕捉局部相关性. 1.2 网络结构 TextCNN的详细过程原理图如下: TextCNN详细过程: Embedding:第一层是图中最左边的7

[白话解析] 深入浅出朴素贝叶斯模型原理及应用

[白话解析] 深入浅出朴素贝叶斯模型原理及应用 0x00 摘要 朴素贝叶斯模型是机器学习中经常提到的概念.但是相信很多朋友都是知其然而不知其所以然.本文将尽量使用易懂的方式介绍朴素贝叶斯模型原理,并且通过具体应用场景和源码来帮助大家深入理解这个概念. 0x01 IT相关概念 1. 分类问题 已知m个样本 (x1,y1), ...... (xm,ym),x是特征变量,y是对应的类别.要求得一个模型函数或者映射规则h,对于新的样本 xt,能够尽量准确的预测出 yt = h(xt). 我们也可以从概率

最大熵模型原理小结

最大熵模型(maximum entropy model, MaxEnt)也是很典型的分类算法了,它和逻辑回归类似,都是属于对数线性分类模型.在损失函数优化的过程中,使用了和支持向量机类似的凸优化技术.而对熵的使用,让我们想起了决策树算法中的ID3和C4.5算法.理解了最大熵模型,对逻辑回归,支持向量机以及决策树算法都会加深理解.本文就对最大熵模型的原理做一个小结. 1. 熵和条件熵的回顾 在决策树算法原理(上)一文中,我们已经讲到了熵和条件熵的概念,这里我们对它们做一个简单的回顾. 熵度量了事物

GMM-HMM语音识别模型 原理篇

转自http://blog.csdn.net/abcjennifer/article/category/1173803/3 本文简明讲述GMM-HMM在语音识别上的原理,建模和测试过程.这篇blog只回答三个问题: 1. 什么是Hidden Markov Model? HMM要解决的三个问题: 1) Likelihood 2) Decoding 3) Training 2. GMM是神马?怎样用GMM求某一音素(phoneme)的概率? 3. GMM+HMM大法解决语音识别 3.1 识别 3.2

关于Spring @RequestBody 自动映射模型原理

关于Spring @RequestBody 自动映射模型 2016年10月18日 22:17:12 稻子丶 阅读数:5049 在很多时候,Spring的注解为我们提供了很多方便,但只知道其用法,不懂其执行原理,有时候出错了,很难快速的定位出错原因,今天我想把自己对于@Requestbody这个注解的一点想法和大家分享下. 首先Spring处理一个请求时,请求的入口就是大家在配置文件中配置的 DispathcherServlet 这分发类,其实这个类能够接受到request的原理就是它实现了Ser