文章目录

  • 前言
  • 一、为什么模板是那样?
  • 二、代码验证
    • 1.卷积函数
    • 2.验证
  • 总结

前言

前面学习了一阶微分的几个经典算子:
05Priwitt
04Sobel
03Roberts
今天学习的是二阶微分的Laplacian算子。

一、为什么模板是那样?

在学习的过程中,很多时候,他直接把模板给了,说这个是xxx算子的模板,但是为什么呢,为什么这个模板就是这个算子,为什么它可以实现某些功能呢?
下面简单介绍一下原理。
Laplacian 算子是一种二阶导数算子,对一个连续函数f(x,y),它在(x,y)处的拉普拉斯值定义为

如下图所示,对于阶跃状边缘,其二阶导数在边缘点出现零交叉,并且边缘点两旁像素的二阶导数异号。

拉普拉斯算子的推导过程如下:

写成模板就是:

看模板就看出来这个算子是与方向无关的各向同性(旋转轴对称)边缘检测算子,当我们只关心边缘点的位置而不顾其周围的实际灰度差,就可以选择该算子进行检测。
当然了,这个模板不是唯一的,因为对角邻域的数字近似方法是多种多样的,也可以借助其他模板来计算函数的拉普拉斯值,模板的基本要求是中心为负值,周边为正,但总和要为0。

二、代码验证

1.卷积函数

代码如下(示例):

import numpy as npdef my_filter2D(img,kernel):"""卷积函数:param image: 原图像,是灰度图:param kernel: 卷积核:return: 卷积后的图像"""k_rows,k_cols = kernel.shape[:2]i_rows,i_cols = img.shape[:2]new_img = np.zeros((img.shape[0],img.shape[1]),dtype=np.float32)#进行遍历操作for row in range(i_rows-k_rows+1):for col in range(i_cols-k_cols+1):#创建一个视图window,大小与kernel一致windows=img[row:row+k_rows,col:col+k_cols]#完成卷积操作out=abs(np.sum(windows * np.flip(kernel), axis=(0, 1)))#赋值 3*3的kernel是row+1,但是2*2 此时的位置是左上,那就等于row,col,将下面修改一下。#new_img[row+1,col+1] = outnew_img[row+k_rows//2,col+k_cols//2] = outnew_img = np.clip(new_img, 0, 255).astype(np.uint8)return new_img

2.验证

代码如下(示例):

import cv2
import numpy as np
import matplotlib.pyplot as plt
import img_filter2Dimg = cv2.imread("lena.bmp",0)
#给拉普拉斯算子的模板
H1 = np.array([[0,1,0],[1,-4,1],[0,1,0]])
H2 = np.array([[1,1,1],[1,-8,1],[1,1,1]])#使用卷积函数
new_img1 = img_filter2D.my_filter2D(img,H1)
new_img2 = img_filter2D.my_filter2D(img,H1)#打印图片
figure_ = plt.figure()
ax1 = figure_.add_subplot(131)
ax1.set_title('original img')
plt.imshow(img,cmap='gray')#不要忘记这一步
ax2= figure_.add_subplot(132)
ax2.set_title('H1')
plt.imshow(new_img1,cmap='gray')ax3 = figure_.add_subplot(133)
ax3.set_title('H2')
plt.imshow(new_img2,cmap='gray')
plt.show()


为了改善锐化效果,可以脱离微分的计算原理,在原有的算子基础上,对模板系数进行调整。下面将上面的卷积模板改成H3,H4,H5,H6得到的结果如下,可以看到,每个模板得到的效果都不太一样的,具体使用哪一个,还需要进一步的选择。

#调整系数的算子模板
H3 = np.array([[0,-1,0],[-1,4,-1],[0,-1,0]])
H4 = np.array([[1,-2,1],[-2,4,-2],[1,-2,1]])
H5 = np.array([[-1,2,-1],[2,-4,2],[-1,2,-1]])
H6 = np.array([[-1,-1,--1],[-1,8,-1],[-1,-1,-1]])


看到了一个很不同的模板,别的模板的和都是0,而下面的这个模板的和为1,与上面的H6有点像,这种和为1的模板其实是很接近原图的,可能会拿Laplacian算子来进行滤波操作的使用到。

#特殊的模板
H7 = np.array([[0,-1,0],[-1,5,-1],[0,-1,0]])

总结

在图像中,边缘通常是像素值的急剧变化。因此,在边缘附近,像素值的变化率很高。拉普拉斯算子的主要目标是找到这种突然的变化,因此只关心边缘点的位置。而且,如果考虑周围像素之间的实际灰度差异,可能会使边缘检测更难以实现,因为它们可能会引入噪声或毛刺。因此,在实际操作中,通常会使用拉普拉斯算子以及其他边缘检测算子来识别图像中的边缘。

还需要注意的是,梯度算子和Laplacian算子都对噪声很敏感,一般在使用它们检测边缘前要对图像进行平滑处理。

06 Laplacian算法相关推荐

  1. 06 聚类算法 - 代码案例二 - K-Means算法和Mini Batch K-Means算法比较

    03 聚类算法 - K-means聚类 04 聚类算法 - 代码案例一 - K-means聚类 05 聚类算法 - 二分K-Means.K-Means++.K-Means||.Canopy.Mini ...

  2. 06 回归算法 - 损失函数、过拟合欠拟合

    == 损失函数 == 损失函数是衡量一个模型好坏的指标,一般来说损失函数的值越小越好. 0~1损失函数: J(θ)=$begin{cases} 1,Y≠f(X)\ 0,Y=f(X)\ end{case ...

  3. js算法初窥06(算法模式03-函数式编程)

    在解释什么是函数式编程之前,我们先要说下什么是命令式编程,它们都属于编程范式的一种.命令式编程其实就是一块一块的代码,其中包括了我们要执行的逻辑或者判断或者一些运算.也就是按部就班的一步一步完成我们所 ...

  4. 机器学习必知必会10大算法!

    Datawhale干货 作者:Fahim ul Haq,编译:InfoQ 现在,机器学习有很多算法.如此多的算法,可能对于初学者来说,是相当不堪重负的.今天,我们将简要介绍 10 种最流行的机器学习算 ...

  5. 机器学习常见算法及优缺点!

    点击上方"Datawhale",选择"星标"公众号 第一时间获取价值内容 ? Index 决策树算法 分类算法 聚类算法 集成算法(AdaBoost算法) 人工 ...

  6. 面试必备:6个你必须熟练掌握的机器学习算法

    简要介绍一下机器学习中的经典代表方法.重点是这些方法内涵的思想. 01 回归算法 在大部分机器学习课程中,回归算法都是介绍的第一个算法.原因有两个:一回归算法比较简单,介绍它可以让人平滑地从统计学迁移 ...

  7. 层次聚类 matlab代码_聚类算法解析一

    01 概述 本次针对聚类算法进行讲解,因为内容较多,会分多篇文章进行讲解,主要的内容包括聚类算法的整体介绍,针对不同类别的聚类算法比如划分聚类.层次聚类.密度聚类等算法进行介绍,在讲解每类算法时会结合 ...

  8. min java_LeetCode算法题-Min Stack(Java实现)

    这是悦乐书的第177次更新,第179篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第36题(顺位题号是155).设计一个支持push,pop,top和在恒定时间内检索最小 ...

  9. Java构造字符串算法题_LeetCode算法题-Repeated Substring Pattern(Java实现)

    这是悦乐书的第236次更新,第249篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第103题(顺位题号是459).给定非空字符串检查是否可以通过获取它的子字符串并将子字符 ...

最新文章

  1. nginx alias php,Nginx Alias 无法解析PHP的解决办法
  2. pandas使用query函数查询指定日期索引之间对应的dataframe数据行(select rows date index between a certain date interval)
  3. 【鸿蒙 HarmonyOS】UI 组件 ( 多选按钮 | Checkbox 组件 )
  4. S3C2410中断系统
  5. BZOJ 4720 [Noip2016]换教室
  6. [Leetcode] 第306题 累加数
  7. 假设以带头结点的循环链表表示队列_关于反转链表,看这一篇就够了!
  8. 非阻塞connect
  9. java学习(72):GUL流式布局管理器
  10. 软件项目管理第二课—项目投标准备工作及投标函
  11. (78)Vivado设置时钟组约束
  12. 29.FFmpeg+OpenGLES+OpenSLES播放器实现(三.FFmpeg配置和编译脚本)
  13. Atitit 提升效率 降低技术难度与提升技术矛盾的解决方案 1. 问题 2 1.1. 高手喜欢技术挑战怎么办,但会提升技术难度 导致新手不会用怎么办 2 2. 解决方案 2 2.1. 通过开会统
  14. Android学习路(正在写)
  15. dosbox汇编环境turboC环境配置
  16. 禅道项目管理软件配置及使用
  17. tekla钢结构算量_钢结构、Tekla及建筑工业化厂商对Tekla软件的开发和应用
  18. 登录mysql服务器的典型命令_Mysql 远程登录及常用命令
  19. BinaryOperator示例
  20. ES2015 解构 Destructuring

热门文章

  1. 黑帽SEO隐藏文字和链接提升搜索排名
  2. DRM加密技术是怎么一回事
  3. 12对胸椎对应体表标志_人体各部位名称及体表标志
  4. html样式 css一些常用属性与style内部样式表
  5. 通过图新地球将GPS信息写入照片
  6. Beyond Max-Margin: Class Margin Equilibrium for Few-shot Object Detection (2021 CVPR)
  7. PKS生态服务平台使用指南-登录篇
  8. 3G中经常提到的R99,R4,R5等为什么这么命名?是指的年份么?
  9. Dell PowerEdge R720 装机实录
  10. Macbook最好用的两款免费OCR软件