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

本文介绍了各向异性扩散PM模型,并给出了C++代码实现。

一、PM模型原理

c6a165a76dd7394e8364028e6221cf7d.png

cee54d71bee238473911e87c5fd97fe7.png

其中,

f845be9a8668dc373b1e5abafdca088a.png                                              

ae67f970ef7fd3574e47e69cbb9313f3.png

89b0f899479960f9dd5229ad53190f80.png

74bd228b1840b363704cfd4d6a99661e.png

二、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);

}

原文:http://blog.csdn.net/cyh706510441/article/details/45248049

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值