8 偏导数和边缘检测

一 理解极限
二 微分学

基于偏导数的边缘检测

灰度图像是天然的z=f(x,y)z=f(x,y)z=f(x,y)函数,尽管以一种差分化的形式存在。其中,x,yx,yx,y分别代表图像坐标系中的坐标,zzz可以表示灰度图像的灰度值。

那么接下来我们可以观察一下偏导数作用在图像上是一个什么效果。图片当然是最经典的lena

library(imager)
img = load.image("lena.jpg")
dim(img)
[1] 512 512   1   3
gray = grayscale(img)
par(mfrow=c(1,2))
plot(img)
plot(gray)

gray显然变成了灰度图像,从其维度就能看得出来,然后将其变为二维的数组,接下来就可以进行求导操作了。

dim(gray)
[1] 512 512   1   1
mat = array(gray,dim=c(512,512))
mat_x = diff(mat,1)
mat_y = t(diff(t(mat),1))
par(mfrow=c(1,2))
image(mat_x)
image(mat_y)

由于图像坐标系默认是从上向下为yyy轴,从左向右为xxx轴,所以在我们熟知的坐标系中,图像是上下颠倒的。而且R语言还非常智能(障)地添加了一层伪彩色,这让我们更加清晰地看出,对图像进行差分操作,提取出了边缘信息。

这很容易理解,所谓“边缘”,往往意味着变化较大的点,如果我们抽取lena图的任意一行,

a=mat[256,]
par(mfrow=c(1,2))
plot(a,type='l')
plot(diff(a,1),type='l')

在变化剧烈处,相应地导数较大。

若将偏导数在图像空间中展开,由于任意两个像素点之间的差恒为1,则可得到其差分形式

∂un,m∂x=un+1,m−un,m1\frac{\partial u_{n,m}}{\partial x}=\frac{u_{n+1,m}-u_{n,m}}{1} ∂x∂un,m​​=1un+1,m​−un,m​​

由于这种差分方法利用了nnn前面的值n+1n+1n+1,故谓之前向差分;相应地可有后向差分

∂un,m∂x=un,m−un−1,m1\frac{\partial u_{n,m}}{\partial x}=\frac{u_{n,m}-u_{n-1,m}}{1} ∂x∂un,m​​=1un,m​−un−1,m​​

二者的均值,即中心差分

∂un,m∂x=un+1,m−un−1,m2\frac{\partial u_{n,m}}{\partial x}=\frac{u_{n+1,m}-u_{n-1,m}}{2} ∂x∂un,m​​=2un+1,m​−un−1,m​​

Roberts算子

求导是对整个函数的定义域展开的一次性操作,但在考察其差分形式之后却发现,数值偏导数可以写成一种对局部区域的反复操作。

例如,就前向差分而言,可以对图像的任意一个子矩阵

[unmun+1,mun,m+1un+1,m+1]\begin{bmatrix} u_{nm}&u_{n+1,m}\\ u_{n,m+1}&u_{n+1,m+1} \end{bmatrix} [unm​un,m+1​​un+1,m​un+1,m+1​​]

进行一个简单的内积

un′(mn)=[unmun+1,m]⋅[−11]u'_n(mn)=\begin{bmatrix} u_{nm}&u_{n+1,m} \end{bmatrix}\cdot\begin{bmatrix} -1&1 \end{bmatrix} un′​(mn)=[unm​​un+1,m​​]⋅[−1​1​]

其中,[−1,1][-1,1][−1,1]可以定义为梯度算子,表示的是对图像的xxx方向的数值偏导数。

同理,[−1,1]T[-1,1]^T[−1,1]T为梯度算子的另一部分——对yyy方向的数值偏导数。这两者在进行边缘检测时所展现出来的威力前文已经感受过了,但回顾方向导数的概念,无论∂∂x\frac{\partial}{\partial x}∂x∂​还是∂∂y\frac{\partial}{\partial y}∂y∂​,均只能表示单一方向的边缘。

如果将二者进行延拓,使之维数相等,则可分别写为

[−1100],[−1010]\begin{bmatrix} -1&1\\0&0 \end{bmatrix}, \begin{bmatrix} -1&0\\1&0 \end{bmatrix} [−10​10​],[−11​00​]

二者的线性组合,是否能够代表其任意方向的边缘信息呢?

M(θ)=[−1100]2cos⁡θ+[−1010]2sin⁡θM(\theta)= \begin{bmatrix} -1&1\\0&0 \end{bmatrix}\sqrt 2\cos\theta+ \begin{bmatrix} -1&0\\1&0 \end{bmatrix}\sqrt 2\sin\theta M(θ)=[−10​10​]2​cosθ+[−11​00​]2​sinθ

当M(θ)M(\theta)M(θ)作用于图像时,可以表示为

U∗M(θ)=ux′cos⁡θ+uy′sin⁡θU*M(\theta)=u'_x\cos\theta+u'_y\sin\theta U∗M(θ)=ux′​cosθ+uy′​sinθ

theta = c(pi/3,pi/4,pi/5,pi/6)
par(mfrow=c(2,2))
for(i in 1:4)
image(mat_x[,1:511]*cos(theta[i])+mat_y[1:511,]*sin(theta[i]))

可以看到,最后一张图片的法向角度为30°30°30°,而其右下角正好有一个30°30°30°附近的清晰的边缘。

当θ=−π4\theta=-\frac{\pi}{4}θ=−4π​时,

M(θ)=[01−10]M(\theta)=\begin{bmatrix} 0&1\\-1&0 \end{bmatrix} M(θ)=[0−1​10​]

此即Roberts算子,代表的是−π4-\frac{\pi}{4}−4π​方向的边缘信息。

其他算子

如果通过中心差分来定义算子,则统一维度后,其xxx和yyy向的梯度算子分别写为

[−101−101−101],[−1−1−1000111]\begin{bmatrix} -1&0&1\\-1&0&1\\-1&0&1\\ \end{bmatrix}, \begin{bmatrix} -1&-1&-1\\0&0&0\\1&1&1\\ \end{bmatrix} ⎣⎡​−1−1−1​000​111​⎦⎤​,⎣⎡​−101​−101​−101​⎦⎤​

此即Prewitt算子。

需要注意的是,这里所谓的“统一维度”,并非仅仅做了一个表面上的工作,实际上,每增加一个维度,都意味着增加一组计算。本来unmu_{nm}unm​点沿着xxx方向的导数和m+1m+1m+1行并没有关系,但由于Prewitt算子的介入,从而使得两者发生了关系。

Sobel算子为Prewitt增添了中心值的权重,记为

[−101−202−101],[−1−2−1000121]\begin{bmatrix} -1&0&1\\-2&0&2\\-1&0&1\\ \end{bmatrix}, \begin{bmatrix} -1&-2&-1\\0&0&0\\1&2&1\\ \end{bmatrix} ⎣⎡​−1−2−1​000​121​⎦⎤​,⎣⎡​−101​−202​−101​⎦⎤​

重读微积分:图像的边缘检测相关推荐

  1. 利用OpenCV的库函数Sobel和Scharr作图像的边缘检测

    图像处理开发需求.图像处理接私活挣零花钱,请加微信/QQ 2487872782 图像处理开发资料.图像处理技术交流请加QQ群,群号 271891601 图像边缘检测的概念我就不多说了,可以参考上一篇博 ...

  2. 【Matlab 图像】边缘检测算法及效果演示

    [Matlab 图像]边缘检测算法及效果演示 边缘检测 检测图像中的边缘 Matlab 代码 代码效果如下 边缘算法:robert 边缘算法:sobel prewitt 边缘算法:laplacian ...

  3. 二值形态学操作、图像的边缘检测、图像编码

    实验五 二值形态学操作 一.实验目的  了解二值形态学的基本运算  掌握基本形态学运算的Matlab实现  了解形态操作的应用 二.原理     收缩和膨胀是数学形态学最基本的变换,数学形态学的 ...

  4. OpenCV笔记(十五)——使用Laplace算子进行图像的边缘检测

    在笔记十四中,我们使用了Sobel算子对图像进行边缘检测,理论依据是像素变化最快的地方最有可能是边缘处,所以使用sobel算子对图像做微分,得到的结果图像当中灰度较大的区域,即为边缘处. 在这里,我们 ...

  5. 如何使用OpenCV进行图像的边缘检测和边缘增强?

    OpenCV提供了几种常见的边缘检测算法,包括Sobel.Scharr.Laplacian和Canny等.这些算法可以帮助我们找到图像中的边缘并增强它们,以提取有用的特征或分割图像中的对象. 如何使用 ...

  6. day9 - 对花朵图像进行边缘检测

    本期主要介绍常用于进行图像边缘检测的滤波器(算子):Sobel算子.Scharr算子.Laplacian算子:通过实验比较不同的算子的处理效果以及使用场景. 完成本期内容,你可以: 了解图像梯度的原理 ...

  7. IOS OpenGL ES GPUImage 图像Sobel边缘检测,类似漫画反色 GPUImageSobelEdgeDetectionFilter

    目录 一.简介 二.效果演示 三.源码下载 四.猜你喜欢 零基础 OpenGL (ES) 学习路线推荐 : OpenGL (ES) 学习目录 >> OpenGL ES 基础 零基础 Ope ...

  8. 图像的边缘检测-三种方法

    图像的边缘检测: 比较拉普拉斯算子,LOG算子,Canny算子三种边缘检测算法. 编程思路: 图像边缘就是图像灰度值突变的地方,也就是图像在该部分的像素值变化速度非常之快,就比如在坐标轴上一条曲线有刚 ...

  9. 【有三说图像】边缘检测(上)

    02 这是有三说图像第2期,边缘检测上篇 言有三 毕业于中国科学院,计算机视觉方向从业者,有三工作室等创始人 作者 | 言有三(微信号Longlongtogo) 编辑 | 言有三 这是<有三说图 ...

最新文章

  1. IBM被曝拟出售昔日明星业务Watson Health,10年医疗梦就此破碎?
  2. 皮一皮:真正的情侣服...一家人轮流穿...
  3. python 画图 内存-用python 10min手写一个简易的实时内存监控系统
  4. 转-D3D中的四元数
  5. 19 python正则表达式及相关函数
  6. python中with的用法,上下文管理器
  7. sts-bundle的使用_使用WS-Trust / STS采样器扩展JMeter
  8. android 获取webView高度,设置webView高度
  9. denison php,Parker / Denison丹尼逊柱塞泵首相系列相关说明
  10. 转载:MySQL数据库INSERT、UPDATE、DELETE以及REPLACE语句的用法详解
  11. (最短路)Shopping
  12. linux内核启动过程2:保护模式执行流程
  13. 禁用 Bootstrap 模态框(Modal) 点击空白时自动关闭
  14. BIO | NIO | AIO (Java版)
  15. CentOS 7上升级openssh7.5
  16. Shiny-Server的安装和使用教程
  17. 问题 J: 机器人足球
  18. 《大象--Thinking in UML》已经发售!简介及目录
  19. SCA连载GDPR 数据处理案件分析 | 德国数据保护局vs德国学术机构,谁是数据控制者?
  20. “走进名企”——微软亚洲研究院

热门文章

  1. 内存 technology_iPad Technology可以成为插画家吗?
  2. Vue + Element UI 中国省市区数据三级联动
  3. 招聘预示小米整车研发将落地上海徐汇
  4. 物联网与射频识别技术,课程实验(四)
  5. 看到一个程序员成长之路 一点点感慨
  6. 跨平台Android和IOS百度语音在线识别原生插件
  7. KISSY——事件Event.fire
  8. Acwing4366上课睡觉
  9. 常见DOS命令集合与文件路径
  10. c#中的vector_.NET Core 3 中的性能提升