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

学习博文 https://blog.csdn.net/qq_38784098/article/details/81605963
时执行的结果展示:
1.原理简介

各向异性扩散滤波主要是用来平滑图像的,克服了高斯模糊的缺陷,各向异性扩散在平滑图像时是保留图像边缘的,和双边滤波很像。各向异性扩散,也叫做P–M扩散,在图像处理和计算机视觉中广泛用于保持图像细节特征的同时减少噪声。

通常我们有将图像看作矩阵的,看作图的,看作随机过程的,记得过去还有看作力场的。这次新鲜,将图像看作热量场了。每个像素看作热流,根据当前像素和周围像素的关系,来确定是否要向周围扩散。比如某个邻域像素和当前像素差别较大,则代表这个邻域像素很可能是个边界,那么当前像素就不向这个方向扩散了,这个边界也就得到保留了。

具体的推导公式都是热学上的,自己也不太熟悉,感兴趣的可以去看原论文,引用量超7000吶。我这里只介绍一下最终结论用到的公式。
主要迭代方程如下:

I就是图像了,因为是个迭代公式,所以有迭代次数t。
四个散度公式是在四个方向上对当前像素求偏导,news就是东南西北嘛,公式如下:

而cN/cS/cE/cW则代表四个方向上的导热系数,边界的导热系数都是小的。公式如下:

最后整个公式需要先前设置的参数主要有三个,迭代次数t,根据情况设置;导热系数相关的k,取值越大越平滑,越不易保留边缘;lambda同样也是取值越大越平滑。

2.Python代码

import cv2
import numpy as np
import math
class anisodiff2D(object):def __init__(self, num_iter=5, delta_t=1/7, kappa=30, option=2):super(anisodiff2D, self).__init__()self.num_iter = num_iterself.delta_t = delta_tself.kappa = kappaself.option = optionself.hN = np.array([[0, 1, 0], [0, -1, 0], [0, 0, 0]])self.hS = np.array([[0, 0, 0], [0, -1, 0], [0, 1, 0]])self.hE = np.array([[0, 0, 0], [0, -1, 1], [0, 0, 0]])self.hW = np.array([[0, 0, 0], [1, -1, 0], [0, 0, 0]])self.hNE = np.array([[0, 0, 1], [0, -1, 0], [0, 0, 0]])self.hSE = np.array([[0, 0, 0], [0, -1, 0], [0, 0, 1]])self.hSW = np.array([[0, 0, 0], [0, -1, 0], [1, 0, 0]])self.hNW = np.array([[1, 0, 0], [0, -1, 0], [0, 0, 0]])def fit(self, img):diff_im = img.copy()dx = 1; dy = 1; dd = math.sqrt(2)for i in range(self.num_iter):nablaN = cv2.filter2D(diff_im, -1, self.hN)nablaS = cv2.filter2D(diff_im, -1, self.hS)nablaW = cv2.filter2D(diff_im, -1, self.hW)nablaE = cv2.filter2D(diff_im, -1, self.hE)nablaNE = cv2.filter2D(diff_im, -1, self.hNE)nablaSE = cv2.filter2D(diff_im, -1, self.hSE)nablaSW = cv2.filter2D(diff_im, -1, self.hSW)nablaNW = cv2.filter2D(diff_im, -1, self.hNW)cN = 0; cS = 0; cW = 0; cE = 0; cNE = 0; cSE = 0; cSW = 0; cNW = 0if self.option == 1:cN = np.exp(-(nablaN/self.kappa)**2)cS = np.exp(-(nablaS/self.kappa)**2)cW = np.exp(-(nablaW/self.kappa)**2)cE = np.exp(-(nablaE/self.kappa)**2)cNE = np.exp(-(nablaNE/self.kappa)**2)cSE = np.exp(-(nablaSE/self.kappa)**2)cSW = np.exp(-(nablaSW/self.kappa)**2)cNW = np.exp(-(nablaNW/self.kappa)**2)elif self.option == 2:cN = 1/(1+(nablaN/self.kappa)**2)cS = 1/(1+(nablaS/self.kappa)**2)cW = 1/(1+(nablaW/self.kappa)**2)cE = 1/(1+(nablaE/self.kappa)**2)cNE = 1/(1+(nablaNE/self.kappa)**2)cSE = 1/(1+(nablaSE/self.kappa)**2)cSW = 1/(1+(nablaSW/self.kappa)**2)cNW = 1/(1+(nablaNW/self.kappa)**2)diff_im = diff_im + self.delta_t * ((1/dy**2)*cN*nablaN +(1/dy**2)*cS*nablaS +(1/dx**2)*cW*nablaW +(1/dx**2)*cE*nablaE +(1/dd**2)*cNE*nablaNE +(1/dd**2)*cSE*nablaSE +(1/dd**2)*cSW*nablaSW +(1/dd**2)*cNW*nablaNW)return diff_im

3.实验结果展示

  1. 背景复杂,过度曝光,全部作为热量高的区域(保护一下隐私哈~本人太丑哈哈哈)

  2. 背景简单 (本人对图片先进行了轮廓检测提取前景目标)

  3. 其实我的目的只是想实现这篇论文中的思想:

    论文注明:曾华前辈的论文,(懒得写字,就截图了)

各项异性扩散(Anisotropic diffusion)--算法简介(python)代码实现相关推荐

  1. 热传导与图像处理:非线性各项异性扩散

    首先,用通俗的语言说明两个基本概念,非线性和各向异性 非线性,可以从线性说起,不严谨的说,如果两个变量之间的关系是一次函数,那么就说他们是线性关系,比如一维的一条直线: y=kx+b,k和b都是实数, ...

  2. 各项异性扩散滤波 -- OpenCV实现

    /*********************************** *功能 -- 各项异性扩散滤波 *by 垚 *visual studio 2010 & windows 7 ultim ...

  3. 感知机算法之Python代码实现

    感知机算法之Python代码实现 1.算法简介 感知机学习算法原始形式: 输入:训练集T 输出:w,b 感知机模型:f(x)=sign(w·x+b) 算法步骤: 1.初始化参数w0,b0 2.在训练集 ...

  4. PnP算法简介与代码解析-柴政

    PnP算法简介与代码解析-柴政 PnP求解算法是指通过多对3D与2D匹配点,在已知或者未知相机内参的情况下,利用最小化重投影误差来求解相机外参的算法.PnP求解算法是SLAM前端位姿跟踪部分中常用的算 ...

  5. 【计算机视觉】PnP算法简介与代码解析-柴政(solvepnp理论篇)

    PnP算法简介与代码解析-柴政 PnP求解算法是指通过多对3D与2D匹配点,在已知或者未知相机内参的情况下,利用最小化重投影误差来求解相机外参的算法.PnP求解算法是SLAM前端位姿跟踪部分中常用的算 ...

  6. 决策树模型 - (ID3算法、C4.5算法) - Python代码实现

    目录 算法简介 信息熵(Entropy) 信息增益(Information gain) - ID3算法 信息增益率(gain ratio) - C4.5算法 源数据 代码实现 - ID3算法 代码实现 ...

  7. Berlekamp-Massey算法及python代码实现

    1. Berlekamp-Massey算法原理介绍 1.1 基本概念简介   设 a‾=(a0,,a1,⋯,aN−1)\underline{a}=\left( a_{0,},a_1,\cdots ,a ...

  8. 维吉尼亚密码的破解算法及python代码实现

    目录 1. 密文描述 1.1 密文1 1.2 密文2 2. 破解原理 2.1 重合指数法确定密钥长度 2.2 互重合指数确定子串间相对偏移 2.3 密钥字的确定 2.4 密文破解 3. 破解代码 参考 ...

  9. 算法笔记(11)逻辑回归算法及Python代码实现

    逻辑回归算法是一种被广泛使用的分类算法,通过训练数据中的正负样本,学习样本特征到样本标签之间的假设函数.逻辑回归假设因变量 y 服从伯努利分布,而线性回归假设因变量 y 服从高斯分布. 因此与线性回归 ...

最新文章

  1. 皮一皮:当群聊被封,大家是如何聊天的...
  2. 一文看懂WebTransport
  3. 想快速拥有个人网站?来试试这个...
  4. 物联网通信协议——比较-MQTT、 DDS、 AMQP、XMPP、 JMS、 REST、 CoAP
  5. 万字长文,一篇文章带你入门Python
  6. Markdown编辑器中字号、颜色的设置方法及一些好看的颜色示例
  7. 程序员的工资普遍在20k以上
  8. Alluxio在多级分布式缓存系统中的应用
  9. HDU2098 分拆素数和【筛选法】
  10. 解析Disruptor:写入ring buffer
  11. 4用计算机显示内存不足,电脑提示内存不足的解决方法总汇
  12. 打开FTP server或者wftpd32提示 unknow error 10013
  13. 高斯过程回归(GPR)
  14. 用python求圆的表面积_【用python写一组类(class)对应各种几何体(正方体,长方体,球,圆柱)的表面积和体积的编码】作业帮...
  15. C++ 优缺点之我见
  16. 遥控视频小车实际应用效果以及功能实现
  17. Blender(二)bpy模块
  18. 2008北京第29届奥运会总奖牌榜
  19. 视频教程-卷积神经网络CNN-深度学习
  20. 485电路设计:上拉电阻和限流电阻对光耦的通信速度的影响

热门文章

  1. C语言 memcpy和memcpy_s
  2. 【多线程】多线程基础知识
  3. DrGraph - 新起点
  4. 创建两个文本框,一个按钮。第 1 个文本框绑定任意键事件,敲击键盘任意可显示字符,在交互窗口中显示该字符;
  5. 创业都是从一个想法开始
  6. Java+spring+springmvc 基于ssm的家乡特产销售系统#毕业设计
  7. 双系统如何修改系统默认启动项?简易教程
  8. 网络安全:网络攻击原理与方法.
  9. TaskView简述
  10. 什么是BST?什么是哈希表?一文带你了解并实现查找的基础知识