本讲完整代码>>

前言

图像分割是一种把图像分成若干个独立子区域的技术和过程。在图像的研究和应用中,很多时候我们关注的仅是图像中的目标或前景(其他部分称为背景),它们对应图像中特定的、具有独特性质的区域。为了分割目标,需要将这些区域分离提取出来,在此基础上才有可能进一步利用,如进行特征提取、目标识别。因此,图像分割是由图像处理进到图像分析的关键步骤,在图像领域占据着至关重要的地位。

介绍

提到图像分割,主要包含两个方面:

  • 非语义分割
  • 语义分割

首先,介绍一下非语义分割。

非语义分割在图像分割中所占比重更高,目前算法也非常多,研究时间较长,而且算法也比较成熟,此类图像分割目前的算法主要有以下几种:

  • 阈值分割

阈值分割是图像分割中应用最多的一类,该算法思想比较简单,给定输入图像一个特定阈值,如果这个阈值可以是灰度值,也可以是梯度值,如果大于这个阈值,则设定为前景像素值,如果小于这个阈值则设定为背景像素值。

阈值设置为100对图像进行分割:

  • 区域分割

区域分割算法中比较有代表性的算法有两种:区域生长和区域分裂合并。

区域生长算法的核心思想是给定子区域一个种子像素,作为生长的起点,然后将种子像素周围邻域中与种子像素有相同或相似性质的像素(可以根据预先设定的规则,比如基于灰度差)合并到种子所在的区域中。

区域分裂合并基本上就是区域生长的逆过程,从整个图像出发,不断分裂得到各个子区域,然后再把前景区域合并,实现目标提取。

  • 聚类

聚类是一个应用非常广泛的无监督学习算法,该算法在图像分割领域也有较多的应用。聚类的核心思想就是利用样本的相似性,把相似的像素点聚合成同一个子区域。

  • 边缘分割

这是图像分割中较为成熟,而且较为常用的一类算法。边缘分割主要利用图像在边缘处灰度级会发生突变来对图像进行分割。常用的方法是利用差分求图像梯度,而在物体边缘处,梯度幅值会较大,所以可以利用梯度阈值进行分割,得到物体的边缘。对于阶跃状边缘,其位置对应一阶导数的极值点,对应二阶导数的过零点(零交叉点)。因此常用微分算子进行边缘检测。常用的一阶微分算子有Roberts算子、Prewitt算子和Sobel算子,二阶微分算子有Laplace算子和Kirsh算子等。由于边缘和噪声都是灰度不连续点,在频域均为高频分量,直接采用微分运算难以克服噪声的影响。因此用微分算子检测边缘前要对图像进行平滑滤波。LoG算子和Canny算子是具有平滑功能的二阶和一阶微分算子,边缘检测效果较好,因此Canny算子也是应用较多的一种边缘分割算法。

  • 直方图

与前面提到的算法不同,直方图图像分割算法利用统计信息对图像进行分割。通过统计图像中的像素,得到图像的灰度直方图,然后在直方图的波峰和波谷是用于定位图像中的簇。

  • 水平集

水平集方法最初由Osher和Sethian提出,目的是用于界面追踪。在90年代末期被广泛应用在各种图像领域。这一方法能够在隐式有效的应对曲线/曲面演化问题。基本思想是用一个符号函数表示演化中的轮廓(曲线或曲面),其中符号函数的零水平面对应于实际的轮廓。这样对应于轮廓运动方程,可以容易的导出隐式曲线/曲面的相似曲线流,当应用在零水平面上将会反映轮廓自身的演化。水平集方法具有许多优点:它是隐式的,参数自由的,提供了一种估计演化中的几何性质的直接方法,能够改变拓扑结构并且是本质的。

语义分割和非语义分割的共同之处都是要分割出图像中物体的边缘,但是二者也有本质的区别,用通俗的话介绍就是非语义分割只想提取物体的边缘,但是不关注目标的类别。而语义分割不仅要提取到边缘像素级别,还要知道这个目标是什么。因此,非语义分割是一种图像基础处理技术,而语义分割是一种机器视觉技术,难度也更大一些,目前比较成熟且应用广泛的语义分割算法有以下几种:

  • Grab cut
  • Mask R-CNN
  • U-Net
  • FCN
  • SegNet

由于篇幅有限,所以在这里就展开介绍语义分割,后期有时间会单独对某几个算法进行详细解析,本文主要介绍非语义分割算法,本文就以2015年UCLA提出的一种新型、高效的图像分割算法--相位拉伸变换为例,详细介绍一下,并从头到尾实现一遍。

相位拉伸变换

相位拉伸变换(Phase Stretch Transform, PST),是UCLA JalaliLab于2015年提出的一种新型图像分割算法[Edge Detection in Digital Images Using Dispersive Phase Stretch Transform],该算法主要有两个显著优点:

  • 速度快
  • 精度高
  • 思想简单
  • 实现容易

PST算法中,首先使用定位核对原始图像进行平滑,然后通过非线性频率相关(离散)相位操作,称为相位拉伸变换(PST)。 PST将2D相位函数应用于频域中的图像。施加到图像的相位量取决于频率;也就是说,较高的相位量被应用于图像的较高频率特征。由于图像边缘包含更高频率的特征,因此PST通过将更多相位应用于更高频率的特征来强调图像中的边缘信息。可以通过对PST输出相位图像进行阈值处理来提取图像边缘。在阈值处理之后,通过形态学操作进一步处理二值图像以找到图像边缘。思想主要包含三个步骤:

  • 非线性相位离散化
  • 阈值化处理
  • 形态学运算

下面来详细介绍一下。

相位拉伸变换,核心就是一个公式,

其中

为输入图像,
为图像维数,
为输出图像,
为角运算,
为快速傅里叶变换,
为逆快速傅里叶变换,
是二维频率变量,
为局部频率响应核,通俗的讲,就是一个用于图像平滑、去噪的滤波核,论文中没有给出,可以使用一些用于图像平滑的滤波核代替,
为相位核,其中,
是施加到图像相位的强度和扭曲,是影响图像分割效果的两个重要参数。

编程实践

PST算法中最核心的就是公式(1),编程实现可以一步一步来实现公式中的每个模块。

首先导入需要的模块,

import 

定义全局变量,

L 

计算公式中的核心参数,

,
def 

生成变量

,
x 

接下来对公式(1)从右至左依次实现,

对输入图像进行快速傅里叶变换,

orig 

实现

expo 

对图像进行平滑处理,

orig_filtered 

实现相位核,

PST_Kernel_1 

将前面实现的部分与相位核做乘积,

temp 

对图像进行逆快速傅里叶变换,

temp 

进行角运算,得到变换图像的相位,

PHI_features 

对图像进行阈值化处理,

features 

应用二进制形态学操作来清除转换后的图像,

out 

到这里就完成了相位拉伸变换的核心部分,

def 

下面完成调用部分的功能,

首先读取函数并把图像转化为灰度图,

Image_orig 

调用前面的函数,对图像进行相位拉伸变换,

edge

显示图像,

Overlay 

主函数的完整内容为,

def 


往期回顾

Jackpop:【动手学计算机视觉】第一讲:图像预处理之图像去噪

Jackpop:【动手学计算机视觉】第二讲:图像预处理之图像增强

感兴趣的可以关注一下,也可以关注公众号"平凡而诗意",我在公众号共享了一些资源和学习资料,关注后回复相应关键字可以获取。

一阶微分算子锐化图像_【动手学计算机视觉】第三讲:图像预处理之图像分割...相关推荐

  1. C++ 偏微分数值计算库_【动手学计算机视觉】第一讲:图像预处理之图像去噪...

    我创建了一个知乎圈子:[平凡而诗意],专注于分享前沿技术.编程开发.实用工具等方面内容,感兴趣的可以首页搜索[平凡而诗意]加入我的圈子,让我们一起玩耍吧!QQ学习交流群:1077239487 平凡而诗 ...

  2. 动手学深度学习之图像风格迁移

    参考伯禹学习平台<动手学深度学习>课程内容内容撰写的学习笔记 原文链接:https://www.boyuai.com/elites/course/cZu18YmweLv10OeV/less ...

  3. python rgb 图像_在Python中查找RGB图像的互补图像

    python rgb 图像 Complementary image is a transformed image such that it consists of complementary colo ...

  4. python rgb 图像_在Python中显示RGB图像的不同平面

    python rgb 图像 A colored image can be represented as a 3 order matrix. The first order is for the row ...

  5. 去毛边 叶片图像_一种复杂背景叶片图像的全自动分割方法与流程

    本发明涉及图像处理领域,更具体地,涉及一种复杂背景叶片图像的全自动分割方法. 背景技术: 药用植物,是中药材的主要来源,是中医药治病救人的物质基础.然而,近年来,由于生态环境的恶化,药用植物资源显著萎 ...

  6. 卷积核和全连接层的区别_「动手学计算机视觉」第十六讲:卷积神经网络之AlexNet...

    前言 前文详细介绍了卷积神经网络的开山之作LeNet,虽然近几年卷积神经网络非常热门,但是在LeNet出现后的十几年里,在目标识别领域卷积神经网络一直被传统目标识别算法(特征提取+分类器)所压制,直到 ...

  7. 动手学计算机视觉--第二章,关于单通道卷积,多通道卷积的讨论

    订正,本章内容仍使用keras框架进行分析,主要参考<Python深度学习(keras)>(Deep Learning with Python). 关于深度学习和计算机视觉相结合的卷积操作 ...

  8. dqn在训练过程中loss越来越大_[动手学强化学习] 2.DQN解决CartPole-v0问题

    强化学习如何入门: 强化学习怎么入门好?​www.zhihu.com 最近在整理之前写的强化学习代码,发现pytorch的代码还是老版本的. 而pytorch今年更新了一个大版本,更到0.4了,很多老 ...

  9. 推荐项目_动手学深度学习pytorch版

    前言 推荐一个项目,这个项目根据李沐参编的dive into DL改,链接https://tangshusen.me/Dive-into-DL-PyTorch.书中内容很好,新手根据内容敲一敲前三章的 ...

最新文章

  1. sont表示元素在存入集合时进行了排序,数据遍历的结果是按某个排序规则输出的
  2. C语言从0到1·变量
  3. IDEA中pom.xml中导入spring-boot-starter-thymeleaf报错的解决方案
  4. 原生php开发cms,海洋cms视频内容管理系统v10.3 原生PHP代码+影视管理系统+视频点播系统+开源CMS...
  5. 直播报名 | 客户生命周期运营三部曲:执行 反馈
  6. Vue——Windows 10下Vue项目启动步骤[vue-cli-service启动版本]
  7. 关于vs2008上的socket链接错误问题
  8. SQL Server死锁
  9. APP界面的数据可视化设计临摹学习模板
  10. com.google.common.collect.Range 集合计算
  11. Anacodna 环境迁移详解
  12. 前端小白程序员入门之前知道这些,半年后都拿到8K+的offer
  13. mysql批量插入数据
  14. 计算机本地局域网不通,局域网不通解决方法
  15. windows下shell工具cygwin
  16. 股票交易费用精确计算器
  17. 【简述】【图】P类问题、NP类问题、NP完全问题和NP难问题
  18. 70人团队创造超30亿美元年交易额,这家美国电商竟是中国制造
  19. MySQL按指定字段自定义列表排序
  20. 2018 Arab Collegiate Programming Contest (ACPC 2018) G. Greatest Chicken Dish (线段树+GCD)

热门文章

  1. Java虚拟机垃圾收集算法
  2. python之内置函数
  3. git常用命令及规范流程
  4. vue路由对象($route)参数简介
  5. 67)vector的begin() end() 和 front() back()的区别 rbegin() rend()
  6. 用过美德乐吸奶器的宝妈们感觉比国产吸奶器怎么样啊?
  7. 【并行计算-CUDA开发】从零开始学习OpenCL开发(一)架构
  8. CSS(2 )-- CSS样式大全
  9. 博客开通第一天,加油
  10. Verlet Integration