图像水平梯度和竖直梯度代码_Opencv图像处理(三)

晓强Deep Learning的读书分享会,先从这里开始,从大学开始。大家好,我是晓强,计算机科学与技术专业研究生在读。我会不定时的更新我的文章,内容可能包括深度学习入门知识,具体包括CV,NLP方向的基础知识和学习的论文;网络表征学习的相关论文解读。当然我每天的读书心得也会分享给大家,可能涉及我们生活各个方面的书籍。我也会不定时回答大家的问题与大家一同进步,共同交流,互相监督,结交更多的朋友。希望大家多留言,多交流,多多关照。

【晓白】今天终于有时间整理以后写一篇技术类文章啦,以后我会不定期更文章,先从计算机视觉开始,逐步更新多个深度学习应用领域的知识点,如有错误大家多指正,多交流,多讨论,共同学习,互相进步。如果内容对大家有一些帮助,请大家多点赞支持,分享。接下来我们来分享第三课时。系列课程请关注我的文章链接。

第三课:图像分割

图像分割:图像分割是指将图像分成若干具有相似性质的区域的过程,主要有基于阈值、基于区域、基于边缘、基于聚类、基于图论和基于深度学习的图像分割方法等。图像分割分为语义分割和实例分割。

e63a7e94ce51933b584adfa39444382e.png

4044d9224d9fef0ba488d32b5951c228.png

分割的原则就是使划分后的子图在内部保持相似度最大,而子图之间的相似度保持最小。将G = (V,E) 分成两个子集A,B,使得:

582cb1698ab2b63c7949c51bf1f41104.png

6a381b74c6aaa121c23fd2599b180f01.png

固定阈值图像分割:

直方图双峰法:双峰法:六十年代中期提出的直方图双峰法 (也称 mode 法) 是典型的全局单阈值分割方法。基本思想:假设图像中有明显的目标和背景, 则其灰度直方图呈双峰分布,当灰度级直方 图具有双峰特性时,选取两峰之间的谷对应 的灰度级作为阈值。

82858111c1440957dce9bbad82602c05.png

固定阈值分割:

• 函数:cv2.threshold(src, thresh, maxval, type)

• 参数说明:

参数1:原图像

参数2:对像素值进行分类的阈值

参数3:当像素值高于(小于)阈值时,应该被赋予的新的像素值,

参数4:第四个参数是阈值方法。

返回值:函数有两个返回值,一个为retVal, 一个阈值化处理之后的图像。

8d615a063515dfac2b47740d9c13dbd9.png

ec3e687cd287ea6ada6edd73a90f9148.png

ec3e687cd287ea6ada6edd73a90f9148.png

b0fee5bdc1b721c6d495eda91c429169.png

43f92cd4fa3407048d1fa66827d3a9c3.png

7bc68c5cb03db0adc40a826bfd2dbf1d.png

自动阈值图像分割:

自适应阈值法:

函数:cv2.adaptiveThreshold()

6dbe488147ec765237ef07bfba684752.png

e8a893fed41489586823b2f7bce6694c.png

1cf3d74d35d962a787243ee54b6af0c8.png

迭代法阈值分割:

步骤

1. 求出图象的最大灰度值和最小灰度值,分别记为ZMAX和ZMIN,令初始阈值

T0=(ZMAX+ZMIN)/2;

2. 根据阈值TK将图象分割为前景和背景,分别求出两者的平均灰度值ZO和ZB ;

3. 求出新阈值TK+1=(ZO+ZB)/2;

4. 若TK==TK+1,则所得即为阈值;否则转2,迭代计算;

5 . 使用计算后的阈值进行固定阈值分割。

Otsu大津法:

• 最大类间方差法,1979年日本学者大津提出,是一种基于全局阈值的自适应方法。

• 灰度特性:图像分为前景和背景。当取最 佳阈值时,两部分之间的差别应该是最大的,衡量差别的标准为最大类间方差。

• 直方图有两个峰值的图像,大津法求得的 T近似等于两个峰值之间的低谷。

15ec28019bd04b406a9734c42d80ebec.png

6265708b14834bdcb9a4d531f7171d88.png

4bd53badf20ea59b1d84879388f471ce.png

图像边缘提取:

图像梯度:

梯度:梯度是一个向量,梯度方向指向函数变化最快的方向,大小就是它的模,也是最大的变化率, 对于二元函数z=f(x,y),它在点(x,y)的梯度就是

59422a54c42e0f4d239abb33b015d29c.png

, 或者 :

04329365dc0c378a76bec31086391038.png

5aefef09b470d8fff9a2f32b15304155.png

这个梯度向量的幅度和方向角为:

70beeca74866464ce5b64a69d01d1d0b.png

图像梯度

图像梯度即图像中灰度变化的度量,求图像梯度的过程是二维离散函数求导过程。边缘其实就是图像上灰度级变化很快的点的集合。下图展示了一个灰度图的数学化表达,像素点(x,y)的灰度值是f(x,y),它有八个邻域。

9a25a4c1b5a74bd45d3e2f0c759751f8.png

图像在点(x,y)的梯度为:

f6e6addd39c50a776d58a5261e08e88f.png

d51f572aaf1f55dc29e0f58f849aa05a.png

模板卷积:要理解梯度图的生成,就要先了解模板卷积的过程,模板 卷积是模板运算的一种方式,其步骤如下:

(1)将模板在输入图像中漫游,并将模板中心与图像中 某个像素位置重合;

(2)将模板上各个系数与模板下各对应像素的灰度相乘;

(3)将所有乘积相加(为保持灰度范围,常将结果再除 以模板系数之和,后面梯度算子模板和为0的话就不需要 除了);

(4)将上述运算结果(模板的响应输出)赋给输出图像 中对应模板中心位置的像素。

9c8ee30bec9a51ab2d178cabcbd76fef.png

梯度图:梯度图的生成和模板卷积相同,不同的是要生成梯 度图,还需要在模板卷积完成后计算在点(x,y)梯度 的幅值,将幅值作为像素值,这样才算完。

注意:梯度图上每个像素点的灰度值就是梯度向量 的幅度

生成梯度图需要模板,右图为水平和竖直方向最简 单的模板。

94705e58296d3f2315a4360e2c13457e.png

603ac6ee0894efd410e1855c027c0daf.png
简单的水平模板梯度

2e0935ece4377babf9e1756bc950df59.png
竖直模板梯度

梯度算子:梯度算子是一阶导数算子,是水平G(x)和竖直G(y)方向对应模板的组合,也 有对角线方向。 常见的一阶算子: Roberts交叉算子,Prewitt算子,Sobel算子

Roberts交叉算子:

9fd678a5038cb7d777bdf16c5c655a9c.png

Roberts交叉算子其本质是一个对角线方向的梯度算子,对应的水平方向和竖直方向的梯度分别为:

ae8560d7b12db66157a513d3fba07945.png

优点:边缘定位较准,适用于边缘明显且噪声较少的图像。

缺点:

(1)没有描述水平和竖直方向的灰度变化,只关注了对角线方向,容易造成遗漏。

(2)鲁棒性差。由于点本身参加了梯度计算,不能有效的抑制噪声的干扰。

Prewitt算子:

01af59108950667199f90820f69064ba.png

Prewitt算子是典型的3*3模板,其模板中心对应要求梯度的原图像坐标(x,y),(x,y)对应的8-邻域的像 素灰度值如下表所示:

b8e94549448788ef44156a196a6cd52a.png

Prewitt算子:

2864b8265ed25ea9c822997fab31b9d6.png

Sobel算子:

1c115143524fbc4ffb6dff7284a3ae2c.png

Sobel算子其实就是是增加了权重系数的Prewitt算子,其模板中心对应要求梯度的原图像坐标,对应 的8-邻域的像素灰度值如下表所示:

e89123b45964f1f1caf01e27634454c3.png

函数:

dst = cv2.Sobel(src, ddepth, dx, dy,ksize)

参数说明:

参数1:需要处理的图像;

参数2:图像的深度,-1表示采用的是与原图像相同的

深度。目标图像的深度必须大于等于原图像的深度;

参数3,4:dx和dy表示的是求导的阶数,0表示这个方 向上没有求导,一般为0、1、2;

参数5:ksize是Sobel算子的大小,必须为1、3、5、7。

25bc29d50ed881a8c9691d1193a728c0.png

4a8d67b52f16ba4b66bff5a5786e6b9b.png

Canny边缘检测算法:

Canny算子是先平滑后求导数的方法。John Canny研究了最优边缘检测方法所需的

特性,给出了评价边缘检测性能优劣的三个指标:

1 好的信噪比,即将非边缘点判定为边缘点的概率要低,将边缘点判为非边缘点的概 率要低;

2 高的定位性能,即检测出的边缘点要尽可能在实际边缘的中心;

3 对单一边缘仅有唯一响应,即单个边缘产生多个响应的概率要低,并且虚假响应边 缘应该得到最大抑制。

函数:cv2.Canny(image, th1, th2,Size)

image:源图像

th1:阈值1

th2:阈值2

Size:可选参数,Sobel算子的大小

步骤:

1. 彩色图像转换为灰度图像(以灰度图单通道图读入)

2. 对图像进行高斯模糊(去噪)

3. 计算图像梯度,根据梯度计算图像边缘幅值与角度

4. 沿梯度方向进行非极大值抑制(边缘细化)

5. 双阈值边缘连接处理

6. 二值化图像输出结果

c53488d42cf1c57391013e36c88f1fca.png

连通区域分析算法:连通区域(Connected Component)一般是指图像中具有相同像素值且位置相邻的 前景像素点组成的图像区域,连通区域分析是指将图像中的各个连通区域找出并标记。 连通区域分析是一种在CV和图像分析处理的众多应用领域中较为常用和基本的方法。 例如:OCR识别中字符分割提取(车牌识别、文本识别、字幕识别等)、视觉跟踪中的运动前景 目标分割与提取(行人入侵检测、遗留物体检测、基于视觉的车辆检测与跟踪等)、医学图像处 理(感兴趣目标区域提取)等。 在需要将前景目标提取出来以便后续进行处理的应用场景中都能够用到连通区域分析 方法,通常连通区域分析处理的对象是一张二值化后的图像。在图像中,最小的单位是像素,每个像素周围有邻接像素,常见的邻接关系有2种:4邻接与8邻接。

434e55b2db3ee762eb0525489422d228.png

244276324b14a605163903e963bf0871.png

如果A与B连通,B与C连通,则A与C连通,在视觉上看来,彼此连通的点形成了一个区域,而不连 通的点形成了不同的区域。这样的一个所有的点彼此连通点构成的集合,我们称为一个连通区域。

c4737ab737436fbab18faba838a0b84a.png

Two-Pass 算法:两遍扫描法( Two-Pass ),正如其名,指的就是通过扫 描两遍图像,将图像中存在的所有连通域找出并标记。

第一次扫描:

• 从左上角开始遍历像素点,找到第一个像素为255的点, label=1;

• 当该像素的左邻像素和上邻像素为无效值时,给该像素 置一个新的label值,label ++,记录集合;

• 当该像素的左邻像素或者上邻像素有一个为有效值时, 将有效值像素的label赋给该像素的label值;

• 当该像素的左邻像素和上邻像素都为有效值时,选取 其中较小的label值赋给该像素的label值

54ee25ccb80caff36b2e1548de40573f.png

05256580b170549cf5de32757d1a1a12.png

第二次扫描:

• 对每个点的label进行更新,更新为其对于其集合中最小 的label

f5443dbfdf71f0a0c00e3b7b4083262a.png

区域生长算法:区域生长是一种串行区域分割的图像分割方法。区域生长是指从某个像素出发,按照一定的准则, 逐步加入邻近像素,当满足一定的条件时,区域生长终止。

区域生长的好坏决定于

• 初始点(种子点)的选取。

• 生长准则。

• 终止条件。

区域生长是从某个或者某些像素点出发,最后得到整个区域,进而实现目标的提取。

基本思想:将具有相似性质的像素集合起来构成区域。

步骤:1. 对图像顺序扫描,找到第1个还没有归属的像素, 设该像素 为(x0, y0);

2. 以(x0, y0)为中心, 考虑(x0, y0)的4邻域像素(x, y)如果(x0, y0)满足生长准则, 将(x, y)与(x0, y0)合并(在同一区域内), 同时将(x, y)压入堆栈;

b798e02c60b88f7948f52a19d3fc793d.png

区域生长原理:

• 从堆栈中取出一个像素, 把它当作(x0, y0)返回到步骤2;

• 当堆栈为空时,返回到步骤1;

• 重复步骤1 - 4直到图像中的每个点都有归属时;

• 生长结束。

e66bd25da89b6b7c3b355f1983fa0942.png

分水岭算法:任意的灰度图像可以被看做是地质学表面,高亮度的地方是山峰,低亮度的地方是山谷。

27a81b1bd8845e266e670309bcfcf2ca.png

给每个孤立的山谷(局部最小值)不同颜色的水(标签),当水涨起来,根据周围的山峰(梯度), 不同的山谷也就是不同的颜色会开始合并,要避免山谷合并,需要在水要合并的地方建立分水岭, 直到所有山峰都被淹没,所创建的分水岭就是分割边界线,这个就是分水岭的原理。

步骤

1. 将白色背景编程黑色背景 - 目的是为了后面变的变换做准备

2. 使用filter2D与拉普拉斯算子实现图像对比度的提高

3. 转为二值图像4. 距离变换

5. 对距离变换结果进行归一化[0-1]之间

6. 使用阈值,在此二值化,得到标记

7. 腐蚀每个peak erode

8. 发现轮廓 findContours

9. 绘制轮廓 drawContours

10.分水岭变换 watershed

11.对每个分割区域着色输出结果

【晓议】今天外面阴雨连绵,技术文章更新完毕,每一部分的代码讲解,请关注我之后私信我,我会发给大家。您如果在计算机入门时或者想转行学习计算专业的知识,有什么问题也可以一起讨论解决。谢谢大家的关注和分享。如果对您有帮助,请帮我点赞。谢谢。

晓强DL:OpenCV图像处理​zhuanlan.zhihu.com
晓强DL:Opencv图像处理​zhuanlan.zhihu.com

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

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

相关文章

php5 mysql 源_CentOS 7.4使用yum源安装MySQL5.7

从CentOS 7.0发布以来,yum源中开始使用Mariadb来代替MySQL的安装。即使你输入的是yum install -y mysql , 显示的也是Mariadb的安装内容。使用源代码进行编译安装又太麻烦。因此,如果想使用yum安装MySQL的话,就需要去下载官方指定的yum源&…

Thinkphp kindeditor 内容转义

参考了:【解决】ThinkPHP整合Html编辑器时出现自动转义的问题 遇到问题也是保存到数据库中的内容,会转义成“\"” 使用 $data[content] stripslashes(htmlspecialchars_decode($_POST[content])); 可以将"\""的转义处理好。转载于:htt…

hash 值重复_面试题:HashSet是如何保证元素不重复的

面试官:你能简单介绍List和Set有什么区别吗?小憨:List是一个有序的集合,在内存是连续存储的,可以存储重复的元素,List查询快,增删慢;Set是一个无序的集合,在内存中不连续…

RabbitMQ 原文译03--发布和订阅

发布/订阅 在之前的案例中我们创建了一个工作队列,这个工作队列的实现思想就是一个把每一个任务平均分配给每一个执行者,在这个篇文章我们会做一些不一样的东西,把一个消息发送给多个消费者,这种模式就被称作"发布/订阅". 为了说明这个模式,我们将要创建一个简单的日…

html富文本编辑器插件_vue中使用vuequilleditor富文本编辑器

点击上方“小姚同学技术栈”快速关注我哟!vue-quill-editor是一个基于quill、适用于vue的富文本编辑器开源项目,支持服务端渲染和单页应用。目前项目热度还算可以,如果不考虑使用markdown,vue-quill-editor是一个比较好的选择。本…

python面向对象怎么解决_Python面向对象编程1

前言面相对象是Python的重要特性,继承了C的类风格,在Python中的一切数据类型都是面向对象的。本章主要介绍Python的面向对象编程。面向对象:什么是OOP(面向对象),Object Oriented Programming,原来就是面向对象的编程啊…

二元函数图像生成器_GAN生成图像综述

点击上方“CVer”,选择加"星标"或“置顶”重磅干货,第一时间送达作者:YTimo(PKU EECS) 研究方向:深度学习,计算机视觉本文转载自:SIGAI摘要生成对抗网络(Generative adversarial network, GAN)…

sublime写网页代码,里面的中文字符会出现乱码

经过百度后解决了这个问题: <!DOCTYPE html><html lang"en"><head><meta charset"UTF-8"><title>Document</title></head><body>你设置编码了吗&#xff1f;</body></html>追问&#xff1a;没…

mysql 5.5.修改库名_安全快速修改Mysql数据库名的5种方法

1. RENAME DATABASE db_name TO new_db_name这个。。这个语法在mysql 5.1.7中被添加进来&#xff0c;到了5.1.23又去掉了。据说有可能丢失数据。还是不要用的好。详见&#xff1a; http://dev.mysql.com/doc/refman/5.1/en/rename-database.html2.如果所有表都是MyISAM类型的话…

设计模式之禅读书笔记

》设计原则《 》Single Responsibility Principle&#xff08;单一职责原则&#xff09;类只有一个修改的原因。 ●类的复杂性降低&#xff0c;实现什么职责都有明确的定义。 ●可读性高 ●可维护性高 ●变更引起的风险降低。 PS&#xff1a;基本不可能实现 》里氏替换原则&…

mysql mysql_set_charset_SQL注入攻击之 mysql_set_charset [转]

本文转载地址&#xff1a;http://hi.baidu.com/cuttinger/blog/item/e9a93901934755147bec2cb0.html1。老话题&#xff0c;mysql_real_escape_string单引号&#xff0c;大多数情况下&#xff0c;防止sql注入攻击足够了。$mysql mysql_connect("host","user&quo…

idea导入maven项目依赖报错_解决Maven依赖冲突的好帮手,这款IDEA插件了解一下?

1、何为依赖冲突Maven是个很好用的依赖管理工具&#xff0c;但是再好的东西也不是完美的。Maven的依赖机制会导致Jar包的冲突。举个例子&#xff0c;现在你的项目中&#xff0c;使用了两个Jar包&#xff0c;分别是A和B。现在A需要依赖另一个Jar包C&#xff0c;B也需要依赖C。但…

Xilinx实习一年总结

从去年7月4号来到上海xilinx。转眼间已经一年。这一年学了非常多知识&#xff0c;也长了非常多见识。 去年七月一到公司&#xff0c;马上投入到摄像头-DDR-HDMI图像通路的研发中。就是在ZEDboard板卡上。通过外置摄像头採集图像&#xff0c;在PL部分将採集的像素数据进行拼接&a…

java线程创建方式_Java创建线程安全的方法

原文链接 译者&#xff1a;秦建平 校对&#xff1a;方腾飞首先来看一个问题&#xff1a;下面这个方法是线程安全的吗&#xff1f;如何才能让这个方法变成线程安全的&#xff1f;public class MyCount {private static int counter 0;public static int getCount(){return coun…

win7 能下node什么版本_微软从未公开的win10版本,3GB+极度精简,老爷机有救了

在windows家族中&#xff0c;最好用的就是win7和XP系统。堪称经典&#xff0c;而且还是发展最成功的系统版本。前几天韩博士也发布一篇关于XP系统的文章&#xff0c;评论区引发极大争论。大家众说纷纭&#xff0c;觉得XP系统是顺畅&#xff0c;但是很多软件硬件都不支持&#x…

【Swift学习】Swift编程之旅(一)

学习一门新语言最经典的例子就是输出“Hello World&#xff01;” print("Hello World!")  swift就是这样来输出的。 如果你使用过其他语言&#xff0c;那么看上去是非常的熟悉吧。但比一些c要简单的多吧 1、不需要导入一些单独的库&#xff0c;比如输入/输出或字符…

孔夫子二手书采集

文章目录 项目演示软件采集单本数据网页搜索数据对比 使用场景概述部分核心逻辑Vb工程图数据导入与读取下拉框选择参数设置线程 使用方法下载软件授权导入文件预览处理后的数据 项目结构附件说明 项目演示 操作视频详见演示视频&#xff0c;以下为图文演示 软件采集单本数据 …

java总结体会_Java课程总结心得体会

不知不觉中以学习Java将近4个月了&#xff0c;在这几个月的学习中我从一开始的迷茫懵逼&#xff0c;到现在的懵逼迷茫中&#xff0c;写下了这篇这个学期课程的Java学习心得体会。首先&#xff0c;我认为作为一个该开始学习Java的小白&#xff0c;在开始学习之前无论你有多大的热…

为什么用redis做缓存而不是mybatis自带的缓存_如何用Java设计一个本地缓存,涨姿势了...

最近在看Mybatis的源码&#xff0c;刚好看到缓存这一块&#xff0c;Mybatis提供了一级缓存和二级缓存&#xff1b;一级缓存相对来说比较简单&#xff0c;功能比较齐全的是二级缓存&#xff0c;基本上满足了一个缓存该有的功能。当然如果拿来和专门的缓存框架如ehcache来对比可能…

process 类 java_编写可执行jar——java的Process类的使用(二)

你知道怎么在控制台使用ping吗&#xff1f;那你知道怎么在java中使用ping吗&#xff1f;1.批处理文件批处理文件大家一定不陌生。接触最多的应该就是tomcat中的start.bat或者start.sh了。bat是在windows环境下运行的批处理文件&#xff0c;sh则是linux的shell脚本。2.adb指令安…