各向异性扩散滤波(Anisotropic Filter,又称 Perona-Malik Filter),主要是用来平滑图像,克服了高斯滤波模糊的缺陷,各向异性扩散在平滑图像的同时又能保留图像边缘;此外,Perona-Malik Filter 在地学影像处理中也得到了相应的应用,如平滑DEM数据、河道提取 等。
将图像看作热量场,每个像元看作热流,根据当前像元和周围像元的关系,来确定是否需要向周围扩散。如果某个邻域像元和当前像元差别较大,那么这个邻域像元可能是边界,当前像元就不向这个方向扩散了,该边界也就得到保留。
主要迭代方程如下:
I t + 1 = I t + λ ( c N x , y ∇ N ( I t ) + c S x , y ∇ S ( I t ) + c E x , y ∇ E ( I t ) + c W x , y ∇ W ( I t ) ) I_{t+1}=I_t+\lambda(cN_{x,y}\nabla_N(I_t)+cS_{x,y}\nabla_S(I_t)+cE_{x,y}\nabla_E(I_t)+cW_{x,y}\nabla_W(I_t)) It+1​=It​+λ(cNx,y​∇N​(It​)+cSx,y​∇S​(It​)+cEx,y​∇E​(It​)+cWx,y​∇W​(It​))其中, I I I 为图像, t t t 为迭代次数。
四个散度公式是在四个方向上对当前像素求偏导,公式如下:
∇ N ( I x , y ) = I x , y − 1 − I x , y ∇ S ( I x , y ) = I x , y + 1 − I x , y ∇ E ( I x , y ) = I x − 1 , y − I x , y ∇ W ( I x , y ) = I x + 1 , y − I x , y \begin{array}{lcl} \nabla_N(I_{x,y})=I_{x,y-1}-I_{x,y} \\ \nabla_S(I_{x,y})=I_{x,y+1}-I_{x,y} \\ \nabla_E(I_{x,y})=I_{x-1,y}-I_{x,y} \\ \nabla_W(I_{x,y})=I_{x+1,y}-I_{x,y} \end{array} ∇N​(Ix,y​)=Ix,y−1​−Ix,y​∇S​(Ix,y​)=Ix,y+1​−Ix,y​∇E​(Ix,y​)=Ix−1,y​−Ix,y​∇W​(Ix,y​)=Ix+1,y​−Ix,y​​
而 c N cN cN、 c S cS cS、 c E cE cE 和 c W cW cW 代表四个方向上的导热系数,公式如下:
c N x , y = e − ∥ ∇ N ( I ) ∥ 2 k 2 c S x , y = e − ∥ ∇ S ( I ) ∥ 2 k 2 c E x , y = e − ∥ ∇ E ( I ) ∥ 2 k 2 c W x , y = e − ∥ ∇ W ( I ) ∥ 2 k 2 \begin{array}{lcl} cN_{x,y}=e^{-\frac{\rVert\nabla_N(I)\rVert^2}{k^2}} \\ cS_{x,y}=e^{-\frac{\rVert\nabla_S(I)\rVert^2}{k^2}} \\ cE_{x,y}=e^{-\frac{\rVert\nabla_E(I)\rVert^2}{k^2}} \\ cW_{x,y}=e^{-\frac{\rVert\nabla_W(I)\rVert^2}{k^2}} \end{array} cNx,y​=e−k2∥∇N​(I)∥2​cSx,y​=e−k2∥∇S​(I)∥2​cEx,y​=e−k2∥∇E​(I)∥2​cWx,y​=e−k2∥∇W​(I)∥2​​
整个公式需要设置的参数主要有三个,迭代次数 t t t,根据情况设置;导热系数相关的 k k k,取值越大,结果越平滑,越不易保留边缘; λ \lambda λ 取值越大,结果越平滑。
C++实现(未使用opencv):

void AnisotropicFilter(float *ppafScan, float *outppafScan, int nImgWidth, int nImgHeight, int iterationSum, float k, float lambda)
{//ppafScan 输入数据//outppafScan   输出数据//nImgWidth, nImgHeight 数据的宽和高//iterationSum    迭代总次数//k    导热系数,控制平滑//lambda   控制平滑for(int iter = 0; iter < iterationSum; ++iter){for(int i = 0; i < nImgHeight; ++i){for (int j = 0; j < nImgWidth; ++j){if(i == 0 || i == nImgHeight - 1 || j == 0 || j == nImgWidth - 1){outppafScan[i * nImgWidth + j] = ppafScan[i * nImgWidth + j];continue;}float NI = ppafScan[i * nImgWidth + (j - 1)] - ppafScan[i * nImgWidth + j];float EI = ppafScan[(i - 1) * nImgWidth + j] - ppafScan[i * nImgWidth + j];float WI = ppafScan[(i + 1) * nImgWidth + j] - ppafScan[i * nImgWidth + j];float SI = ppafScan[i * nImgWidth + (j + 1)] - ppafScan[i * nImgWidth + j];float cN = exp(-NI * NI / (k * k));float cE = exp(-EI * EI / (k * k));float cW = exp(-WI * WI / (k * k));float cS = exp(-SI * SI / (k * k));outppafScan[i * nImgWidth + j] = ppafScan[i * nImgWidth + j] + lambda * (cN * NI + cS * SI + cE * EI + cW * WI);}}}return;
}

当 t = 20 t=20 t=20, k = 30 k=30 k=30, λ = 0.20 \lambda=0.20 λ=0.20 时,结果如下图所示:

左:原始图像,右:滤波后的影像

高斯滤波(线性)和Perona-Malik滤波(非线性)的比较:(a)原始影像;(b) Gaussian filtering (the kernels = 7 m);© Perona-Malik filter (t = 50);(d) Gaussian filtering (the kernels = 14 m);(e) Perona-Malik filter (t = 200) [原图链接]

欢迎大家批评指正。

各向异性扩散滤波(Anisotropic Filter)原理与C++实现相关推荐

  1. OpenCV 保边滤波器 各向异性扩散滤波(Anisotropic Filter)

    各向异性扩散滤波(Anisotropic filter),是双边滤波的一种简化,具有双边滤波的保留图像边缘同时减少噪声的作用,又加快了算法的实现速度. 首先,我们来了解一下各向异性扩散. 各向异性扩散 ...

  2. 图像保边滤波器集锦---各向异性扩散滤波(Anisotropic Filter)算法与实现

    本篇集锦要介绍的是各向异性扩散滤波,也叫Anisotropic filter,它克服了高斯模糊的缺陷,具有保留图像边缘细节同时减少噪声的作用,因此,也是可以做人像美颜磨皮算法的: 首先,我们来了解一下 ...

  3. 各向异性扩散滤波_原理与算法

    1.原理简述 各向异性扩散滤波主要是用来平滑图像的,克服了高斯模糊的缺陷,各向异性扩散在平滑图像时是保留图像边缘的,和双边滤波很像. 通常我们有将图像看作矩阵的,看作图的,看作随机过程的,记得过去还有 ...

  4. 图形算法与实战:1.滤波专题 (4)各向异性扩散滤波

    4. 各向异性扩散滤波 本文作者:图像与视觉InSight 行者 杨尚朋 转载请注明 目录 4. 各向异性扩散滤波 4.1 处理效果展示 图像处理前后对比 4.2 各向异性扩散滤波原理 4.2.1 概 ...

  5. 数字图像处理Python语言实现-图像增强-各向异性扩散滤波

    各向异性扩散滤波 各向异性扩散滤波 1. 前言 2. 各向异性扩散滤波描述 3. 代码实现 1. 前言 各向异性扩散滤波主要是基于热扩散框架,通过偏微分方程来表示.基于偏微分方程的各向异性扩散被广泛用 ...

  6. 双边滤波(Bilateral filter)原理介绍及matlab程序实现

    双边滤波 1.原理介绍 双边滤波由C. Tomasi在1998年提出,是一种经典的非线性空间滤波方法.在滤波器稀疏的制定上,双边滤波同时考虑到了输出像素与邻域内其它像素的欧氏距离和取值的差异,即:同时 ...

  7. 各项异性扩散(Anisotropic diffusion)--算法简介(python)代码实现

    各项异性扩散(Anisotropic diffusion)–算法简介(python)代码实现 学习博文 https://blog.csdn.net/qq_38784098/article/detail ...

  8. 详解——导向滤波(Guided Filter)和快速导向滤波

    文章目录 导读 原理推导 导向滤波的应用 导向滤波的实现 快速导向滤波的实现 算法效果 代码 参考 导读 在图像滤波算法中,导向滤波.双边滤波.最小二乘滤波并称三大保边滤波器,他们是各向异性滤波器.相 ...

  9. matlab练习程序(各向异性扩散)

    主要是用来平滑图像的,克服了高斯模糊的缺陷,各向异性扩散在平滑图像时是保留图像边缘的(和双边滤波很像). 通常我们有将图像看作矩阵的,看作图的,看作随机过程的,记得过去还有看作力场的. 这次新鲜,将图 ...

最新文章

  1. oracle date怎么用,Oracle to_date的使用方法
  2. C#截取屏幕保存图片
  3. redis的使用场景和基本数据类型
  4. C# IOCP完成端口模型(简单实用高效)
  5. 使用.NET Core 3.0 预览版,Web API和Visual Studio 2019进行ASP.NET Core Blazor游戏开发
  6. ubuntu使用python opencv_Ubuntu中“利用Opencv + python进行特征匹配”的环境搭建
  7. svn 备份恢复【转】
  8. mysql时间10位数字_mysql—MySQL数据库中10位时间戳转换为标准时间后,如何对标准时间进行加减X天处理...
  9. 关于神经网络的输出神经元个数的思考
  10. 乾隆的太医留下来的民间偏方
  11. 【PM杂谈】我理解的项目管理
  12. 单窗口单ip技术是什么
  13. 关于腾讯云域名访问问题的几个可能解决方案
  14. linux 硬盘时间查询,Linux 查看硬盘通电时间
  15. 大智慧专业财务数据服务器文件,大智慧专业财务数据及代码内容对照表-2
  16. 从细胞发现到DNA分子结构的发现,人类经历了三百年
  17. centos7 搭建 svn 服务端
  18. ubuntu16 安装文本对比软件
  19. 经典网络-ResNet论文及实践
  20. 互联网快讯:极米NEW Z6成年轻人投影首选;高德地图在北京上线无障碍公交

热门文章

  1. 线程同步的注解:@ThreadSafe、@Immutable、@NotThreadSafe、@GuardedBy
  2. 重启与新生,哪家在线教育的转型最有看点?
  3. 【Codeforces 891 E】 Lust(生成函数)
  4. [统计学教程] 第七章 假设检验
  5. 微信公众号如何无限制的定向推送消息--模板消息的应用
  6. JAVA向client打印一行_java8 httpclient NameValuePair转换14行代码一行搞定!
  7. windows 可以禁用的服务盘点
  8. 钉钉扫码登录网站(两种方式实现)
  9. Android学习博客和文章存档
  10. 适用于Windows 10的所有Microsoft PowerToys的全部解释