各向异性扩散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-anisotropic-diffusion-perona-malik/content/anisodiff_Perona-Malik/anisodiff2D.m

void CImageObj::Perona_Malik(int iter, double dt, double kappa, int option)
{
	int i, j;
	int nx = m_width, ny = m_height;

	double** I_t = NewDoubleMatrix(nx, ny);
	double** I_tmp = NewDoubleMatrix(nx, ny);
	for (i = 0; i < ny; i++)
		for (j = 0; j < nx; j++)
			I_t[i][j] = I_tmp[i][j] = m_imgData[i][j];

	for (int t = 0; t < iter; t++)
	{
		for (i = 0; i < ny; i++)
		{
			for (j = 0; j < nx; j++)
			{
				int iUp = i - 1, iDown = i + 1;
				int jLeft = j - 1, jRight = j + 1;    // 边界处理
				if (0 == i) iUp = i; if (ny - 1 == i) iDown = i;
				if (0 == j) jLeft = j; if (nx - 1 == j) jRight = j;

				double deltaN = I_t[iUp][j] - I_t[i][j];
				double deltaS = I_t[iDown][j] - I_t[i][j];
				double deltaE = I_t[i][jRight] - I_t[i][j];
				double deltaW = I_t[i][jLeft] - I_t[i][j];

				double cN, cS, cE, cW;
				if (1 == option)
				{
					cN = exp(-(deltaN / kappa) * (deltaN / kappa));
					cS = exp(-(deltaS / kappa) * (deltaS / kappa));
					cE = exp(-(deltaE / kappa) * (deltaE / kappa));
					cW = exp(-(deltaW / kappa) * (deltaW / kappa));
				}
				else if (2 == option)
				{
					cN = 1.0 / (1 + (deltaN / kappa) * (deltaN / kappa));
					cS = 1.0 / (1 + (deltaS / kappa) * (deltaS / kappa));
					cE = 1.0 / (1 + (deltaE / kappa) * (deltaE / kappa));
					cW = 1.0 / (1 + (deltaW / kappa) * (deltaW / kappa));
				}

				I_tmp[i][j] += dt * (cN * deltaN + cS * deltaS + cE * deltaE + cW * deltaW);
			}
		}  // 一次迭代

		for (i = 0; i < ny; i++)
			for (j = 0; j < nx; j++)
			{
				I_t[i][j] = I_tmp[i][j];
			}

	} // 迭代结束

	// 给图像赋值
	for (i = 0; i < ny; i++)
		for (j = 0; j < nx; j++)
		{
			double tmp = I_t[i][j];
			tmp = max(0, min(tmp, 255));
			m_imgData[i][j] = (unsigned char)tmp;
		}

	DeleteDoubleMatrix(I_t, nx, ny);
	DeleteDoubleMatrix(I_tmp, nx, ny);
}
时间: 2024-08-02 15:18:02

各向异性扩散PM模型原理与C++实现的相关文章

各向异性扩散滤波器(anisotropic diffusion filter)

各向异性扩散,也叫做P–M扩散,在图像处理和计算机视觉中广泛用于保持图像细节特征的同时减少噪声. 定义 有灰度图像I(x,y),其各向异性扩散方程如下 ?I?t=div(c(x,y,t)?I)=?c?I+c(x,y,t)ΔI 其中Δ是Laplacian算子 ,?是梯度算子,div是散度,c(x,y,t)是扩散系数.控制着扩散速率,通常选取的图像梯度函数,这样在扩散时保护到图像边缘信息.这些由Perona和Malik在90年代初发现,他们提出两种扩散系数方程,也就是有名的P-M方程: c(||?I

Select模型原理

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

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

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

Lakes Environmental ARTM View v1.4.2 1CD放射物扩散模拟模型

Lakes Environmental ARTM View v1.4.2 1CD放射物扩散模拟模型Lakes.AERMOD.View.v8.9.0 1CD大气扩散模型软件包ARTM(Atmospheric Radionuclide Transport Model)模型是根据德国核电法案计算气载放射性物质扩散的新标准,由德国联邦办公室基于 德国环境保护署的大气扩散模型-AUSTAL2000,而开发的放射物扩散模拟模型,它是拉格朗日粒子跟踪空气扩散模型,它不但可以模拟点源. 面源.线源.体源,还可以

全变分(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, do

[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