图像sobel梯度详细计算过程_数字图像处理(第十章)

  • 点、线、边缘检测

背景知识。书中主要介绍了图像的一阶导数与二阶导数,这个之前的文章中有过介绍这里在复习一遍。对于函数

,对于点
在x方向的一阶偏导为:

,二阶偏导为:

85b42fbabd48231d5dca543531d8ce25.png

之后书中总结了一阶导与二阶导对于图像求取边缘的结论:

e1da884bf13692ec5a4679224e3dede2.png

孤立点检测。图像中孤立点检测使用二阶梯度。公式如下:

caf39a52c337b8dbf5f23eac7f347efb.png

e9b3f033c1b1ed3f39405bd2311c88c3.png

(扩展:用于边缘检测的sobel算子属于一阶梯度。)

拓展一下拉普拉斯,包含像素

四个对角,那么可以使用如下模板。

0fa075cfc3efb8c9199c9d54591c909c.png

线检测

线检测同样使用拉普拉斯变换,不过不同的方向使用不同的二阶偏导。如下图是不同方向直线检测模板。

7f27d6f78a26f17da0b226a3dbf1869d.png

例如水平方向的检测模板,使用y方向的二阶偏导。

  • 基本边缘检测

选择梯度作为在图像

处边缘的强度和方向。梯度表示如下:

,沿梯度方向灰度变化率最大。

梯度大小:

梯度方向:沿

轴的夹角:
,梯度表示如下图。

08a4a6617e09b9acbe27fc3ef92d4375.png

任意点

处边缘的方向与该点处梯度向量的方向正交。

梯度向量有时被称为边缘法线。当向量通过除以其幅值而归一化为单位向量,结果称为边缘单位法线。

  • 梯度算子

如下图几种常用梯度算子:

755f078195d8ec132b3024e873edb4aa.png

Prewitt算子与Sobel算子的区别在于Sobel算子的中心元素是前者的2倍,这提供了平滑的作用,中心元素2倍于两边的元素,这可以看作高斯分布的简化版,如果模板再大些,可以使用高斯分布初始化各个模板中各个系数。Prewitt与Sobel具有各项同性的特点。两种算子对角的模板如下图。

4b387af473ddf639204f181ade741417.png
  • 更先进的边缘检测技术

Marr-Hildreth边缘检测器。

  1. 使用高斯拉普拉斯滤波处理图像;
  2. 找到零交叉点。

高斯拉普拉斯函数本质上是求高斯函数的二阶梯度,具体公式如下图:

1749991e07d60641fbc502a81b64cb0e.png

拉普拉斯模板可以将模板的

坐标带入到公式中,调整模板的系数都是整数,保证系数和为0.

零交叉点:一阶导数的局部最大值对应二阶导数的零交叉点(zero crossing),于是通过找出图像强度的二阶导数的零交叉点就能找到精确的边缘点。Laplacian算子是常用的二阶导数算子。

  • canny算子

步骤:

  1. 平滑;
  2. 梯度幅值与方向检测;
  3. 非极大值抑制减少假边缘;
  4. 双阈值减少小边缘。

主要介绍3,4步骤。第3步将每一个待处理的边缘像素方向分为8份,一共有水平、垂直、-45、+45四个方向。如下图。

8c42e8ceff544c40b2700fe4f9e81e4e.png

在图a中,假设现在有一水平边缘,那么该边缘的法线方向一定穿过p2,p8(梯度方向),所以比较p5与p2、p8的幅值大小,如果p5均大于两者,那么保留,否则抑制为0.

步骤4设置两个阈值,大阈值、小阈值,梯度幅值大于大阈值的保留、小于小阈值的置零,中间的幅值如果与大阈值相邻,那么保留。

  • 边缘连接与边界检测

前面已经讲过可以使用一阶梯度算子得到边缘的梯度强度以及方向,由于其他因素的干扰,边缘点是不连续的。那么设计算法将相似边缘点进行连接,以点

为中心的八邻域内的点
,确定边缘相似有两个性质:

cbb5e5661cfc5c8d24d8215c17f52b3c.png

梯度强度差小于阈值

95ed6d1f47383fe4ec425531e507e561.png

梯度方向差小于阈值

0cda6be5fd8c76c67b5ad747b6e8112d.png

步骤2中

表示角度
左右
范围。

步骤4的意思是旋转图像,再执行步骤3的扫描,将扫描结果旋转回来。

书中举了车牌识别的例子,如下图。

233da92267379b87315bbea2c4129fd0.png

分别连接水平竖直的边缘并合并,根据车牌的长宽比定位车牌位置(可以计算连通区域)。

  • 使用多边形近似连接边缘
  • 使用霍夫变换找直线

对于二维平面的直线

,可以写成参数形式:
,那么对于一条直线来说,在参数空间对应于一点,对于一点来说,参数空间对应于一条直线。具体如下图:

be5bedd867e39598f0c2dc319d74e17d.png

那么对于图a中直线对应于b图中的点

,那么图a中直线上的点对应于b图中经过点
的直线。但是在实际使用过程中,对于逼近垂直方向的直线来说,其斜率无限大,计算不方便产生较大误差,所以使用直线法线表示方法。

其中

是直线与x轴的夹角,
是原点到直线的距离,那么在参数
空间中,直线上每一点都是一条正弦曲线,这些曲线交于的一点就是该直线。如下图。

72531b8479881da52a3b3973eeb4d9cb.png

图c是

平面的累加单元,其中两个参数的范围为:
,
.
是对角线之间的距离。使用方法是对于
平面上前景点求其在
平面上的曲线,并在
平面的累加单元上画出并累加,统计累加点数多的
坐标,该坐标是判断出的直线。

霍夫变换法还可拓展到曲线的检测。

  • 阈值处理

影响图像二值化分割的因素:噪声、光照不均匀、物体表面反射光线不均匀。

存在噪声可以使用一些平滑算法、又由于噪声多数为频率较高的分量,可以使用低通滤波处理。光照不均匀可以使用同态滤波,同态滤波假设不均匀光照是低频分量,那么转换到频率域,抑制低频,增强高频;可以使用局部阈值进行处理;可以使用顶帽变换处理,先使用与前景物体大小类似结构元去掉物体留下背景,使用剩余的背景均匀原背景,最后阈值分割。

  • Otus

图像灰度被分类两类,该算法选择分类边界阈值

,使用的方法是计算最大类间方差,对于[0,255]的灰度也就是说
取多少,类间方差最大。那么将问题转化为如何求解类间方差:

45fdac0fd97010f529d38547d2cc2f07.png

其中

是两类像素的概率,
是两类像素的平均灰度值,
是全局灰度值。
  • 使用边缘检测改善阈值处理效果

书中介绍了一种方法,该方法用于对抗噪声的干扰,主要意思是对有噪声污染的待处理图像进行边缘检测,对检测后的图像进行二值化,使用二值化后的图像作为掩膜,对掩膜中的图像进行阈值化例如Otus。下面两个例子如下图。

d4f785a81494f3a6a9efefad92575811.png

fe53d445283c22549e3eb7e6672bdd16.png
  • 多阈值处理

类似OTUS算法,只不过OTUS是计算一个阈值,分成两类,多阈值可以计算多个阈值。

  • 可变阈值处理

这一小结所讲算法也是针对于非均匀光照这类问题而提出的,再次总结以下前面对于非均匀光照使用的方法,可以使用同态滤波或顶帽变换进行处理。

分块阈值

将图像分成小份,每个小份进行单独阈值处理,该方法基于每个小块的灰度是均匀的。

使用局部灰度标准差、局部灰度均值来确定局部阈值,公式如下:

9e17f4fab660414de6d90f7279ee6a8e.png

其中

表示标准差,
表示均值。
是常数权值。

移动平均阈值

能够稳定有效处理光照不均匀的文本图像,和一些受正弦波污染的图像。

  • 多变量阈值处理

对于灰度图像,每一个像素是单通道数值,那么灰度图像是单变量的图像,对于RGB彩色图像,每一个像素是3通道数值,那么彩色图像是多变量的图像。灰度图像阈值分割是通过灰度值距离进行分割,所以引申到彩色图像,是通过彩色像素值距离进行分割,彩色像素是多通道,那么可以使用多变量距离进行区分。例如:微红色像素值向量为

,那么对于待分割图像的每一个像素
,它们之间的距离可以使用欧式距离来表示:

3a60d9ee2eea2e33e7ef29a7aec27524.png

如果考虑像素之间的关系,可以使用马氏距离:

8f716d545d9ade7cee5194dcf1e9c406.png

其中

的协方差矩阵,当
时,马氏距离转换为欧式距离,表示各个通道之间无关。
  • 区域生长

区域生长的方法的原理与种子填充算法类似,首先需要种子点,根据相似度(灰度、纹理等)将不同区域进行合并进而分割。

  • 分裂合并

按照某一规则对一副图像进行细分,直到每一细分区域都满足该规则为止,在对细分后 的区域进行合并。

上面两个算法原理比较好理解,区域生长实质上是分裂合并的合并步骤。

  • 分水岭分割
  • 运动过程中的分割

空间域分析

使用运动视频中每一帧之间的像素差值来作为运动变化的证据进行分析。两幅图像之间的差值图像定义如下:

32f90ea8b7f09fe2b805f4ee4062f66a.png

累计运动图像。

8edaeeaf7d78d500c967760186608aa6.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/330079.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

idea部署maven+javaweb项目到jboss

小编习惯使用eclipse对jboss跑的项目部署,第一次使用idea进行jboss部署项目,遇到很多问题,做此文章以帮助更多人. 图中涂鸦的是项目名,对应上自己的项目名即可 1.导入项目,这一步不多说 2.配置项目: a>点击file-->Project-Stucture-->Project 3.配置Modules 配置…

Java8-本地缓存

转载自 Java8-本地缓存这里我将会给大家演示用ConcurrentHashMap类和lambda表达式实现一个本地缓存。因为Map有一个新的方法可以在key为Null的时候自动计算一个新的value值。非常完美的实现cache。来看下代码:12345678910111213141516publicstatic void main(String…

Integer和Int的比较,谈谈拆卸和装箱

示例代码 public static void main(String[] args) {Integer a new Integer(10111);int b 10111;boolean equal1 a b;//自动拆箱,xxxValue()boolean equal2 a.equals(b);//自动装箱, valueOf()System.out.println(equal1);System.out.println(equal2); }反编译…

python调用webservice接口实例_python调用webservice接口的实现

使用suds这个第三方模块 from suds.client import Client url http://ip:port/?wsdl cilentClient(url) print cilent 查看webservice接口的具体信息: 调用接口方法,通常 client.service.methodname 实际测试过程中遇到的坑: 1、tns 值为Lo…

idea2021部署maven+javaweb项目到jboss(diy)

【README】 我为什么要写这个文章,看了这位老哥的博文 https://blog.csdn.net/PacosonSWJTU/article/details/118074604 部署成功了,很感谢,所以也想照做一下; 【1】创建web项目module (Project02 是一个空项目&…

Java对象内存结构

转载自 Java对象内存结构学C/C出身的我,对Java有一点非常困惑,那就是缺乏计算对象占用内存大小的机制。而在C中就可以通过sizeof运算符来获得基本类型以及类实例的大小。C和C中的这个操作符对于指针运算、内存拷贝和IO操作都非常有用。 Java中并没有一个…

Java版大顶堆的实现

堆的概念 堆是一棵完全二叉树,一般使用数组来存储。通俗来讲堆其实就是利用数组来维护一个完全二叉树。 按照堆的特点可以把堆分为大顶堆和小顶堆 大顶堆:堆的每个结点的值都大于或等于其左右孩子结点的值 小顶堆:堆的每个结点的值都小于或…

Java 8新特性探究(二)深入解析默认方法

转载自 Java 8新特性探究(二)深入解析默认方法 什么是默认方法,为什么要有默认方法 简单说,就是接口可以有实现方法,而且不需要实现类去实现其方法。只需在方法名前面加个default关键字即可。 为什么要有这个特性&am…

把本地库推送到github远程库

【1】 github上创建远程库 注意 ,远程库的名字要与本地库相同 【2】新建github远程库别名origin 【3】 代码提交 git add ./* : 把修改内容添加到暂存区 ; git commit -m msg : 提交暂存区的修改内容到本地库; g…

react antd confirm content list_React造轮系列:对话框组件 - Dialog 思路

React造轮系列:对话框组件 - Dialog 思路对话框一般是我们点击按钮弹出的这么一个东西,主要类型有 Alter, Confirm 及 Modal, Modal 一般带有半透明的黑色背景。当然外观可参考 AntD 或者 Framework 等。确定 APIAPI 方面主要还是要参考同行,…

Spring IOC 和 AOP 概览

IOC(控制反转) IoC(Inversion of Control,控制倒转)。所谓IoC,对于spring框架来说,就是由spring来负责控制对象的生命周期和对象间的关系。 在没有IOC时,我们通过new 等关键字等方…

Java 并发实践 — ConcurrentHashMap 与 CAS

转载自 Java 并发实践 — ConcurrentHashMap 与 CAS最近在做接口限流时涉及到了一个有意思问题,牵扯出了关于concurrentHashMap的一些用法,以及CAS的一些概念。限流算法很多,我主要就以最简单的计数器法来做引。先抽象化一下需求:…

git rebase命令(转)

转自&#xff1a; https://www.yiibai.com/git/git_rebase.html git rebase命令在另一个分支基础之上重新应用&#xff0c;用于把一个分支的修改合并到当前分支。 使用语法 git rebase [-i | --interactive] [options] [--exec <cmd>] [--onto <newbase>][<u…

python tkinter计算器实例_python -Tkinter 实现一个小计算器功能

原博文 2017-03-25 22:08 − 文章来源&#xff1a;http://www.cnblogs.com/Skyyj/p/6618739.html 本代码是基于python 2.7的 如果是对于python3.X 则需要将 tkinter 改为Tkinter 将tkMessagebox&... 相关推荐 2019-12-10 15:59 − python GUI编程(Tkinter) Python 提供了多…

Spring IOC 容器启动、Bean生命周期详解

前言 在Spring IOC 和 AOP 概览中&#xff0c;简要介绍了IOC容器和AOP&#xff0c;没有深入IOC容器Bean的实例化&#xff0c;此文承接上文深入分析Bean的实例化过程、生命周期。 Spring IOC的过程 Spring的IoC容器在实现控制反转和依赖注入的过程中,可以划分为两个阶段: 容…

java 8 Lambda 表达式(副作用)

【1】转自&#xff1a; https://www.cnblogs.com/linlinismine/p/9283532.html 早在2014年oracle发布了jdk 8,在里面增加了lambda模块。于是java程序员们又多了一种新的编程方式&#xff1a;函数式编程&#xff0c;也就是lambda表达式。我自己用lambda表达式也差不多快4年了&am…

Java NIO:浅析I/O模型

转载自 Java NIO&#xff1a;浅析I/O模型也许很多朋友在学习NIO的时候都会感觉有点吃力&#xff0c;对里面的很多概念都感觉不是那么明朗。在进入Java NIO编程之前&#xff0c;我们今天先来讨论一些比较基础的知识&#xff1a;I/O模型。下面本文先从同步和异步的概念 说起&…

ubuntu安装python3.8_Ubuntu 16.04 安装 python3.8

Ubuntu 16.04 amd64 (64bit)&#xff08;纯净版&#xff09; 自带python2.7和python3.5 执行"whereis python"查看当前安装的python [rootroot ~]# whereis python python: /usr/bin/python2.7 /usr/bin/python /usr/lib/python2.7 /usr/lib64/python2.7 /etc/python…

Spring IOC 如何解决循环依赖?

前言 假设对象A、B 之间相互依赖&#xff0c;Spring IOC是如何解决A、B两个对象的实例化的&#xff1f;答案是三级缓存。 三级缓存 SpringIOC 通过三级缓存来解决循环依赖问题&#xff0c;三级缓存指的是三个Map&#xff1a; singletonObjects&#xff1a;一级缓存&#xf…

pythondocx模板_使用python-docx-template修改word文档

由于最近工作中需要自动修改word文档&#xff0c;并生成PDF文件&#xff0c;经过查阅资料后发现使用python-docx-template可以完成对word的修改工作&#xff0c;于是记录一下使用方法。文章内容大部分来自对以下博客的整理和学习https://blog.csdn.net/weixin_42670653/article…