1 引言

上一篇我们介绍了目标轮廓提取法来提取目标轮廓,这一章节我们来介绍边界跟踪法。边界跟踪的定义为从图像中的一个边界点出发,然后根据某种判别准则搜索出下一个边界点,以此跟踪出目标边界。

边界跟踪的一般步骤如下:
1)确定边界的起始搜索点,起始点的选择很关键,对于某些图像,选择不同的起始点会导致不同的结果
2)确定合适边界判别准则搜索准则,判别准则主要用于判断一个点是不是边界点,搜索准则则知道如何搜索下一个边缘点。
3)确定搜索的终止条件

2 算法原理

边界跟踪算法原理:
1)从左下角开始逐点扫描,当遇到边缘点时,则跟踪,直至跟后续点回到起始点(对于闭合线),或其后续点在没有新的后续点(对于非闭合线)为止。
2)如果为非闭合线,则跟踪一侧后,需从起始点开始朝相反方向跟踪到另一尾点。
3)如果不止一个后续点,则按上述连接准则选择距离最近的点为后续点,另一次近的后续点作为新的边缘跟踪起点另行跟踪。
4)一条线跟踪完后,接着扫描到下一个未跟踪点,直到所有边缘都跟踪完毕。
我们来举个栗子吧:

上图为边界跟踪示意图,图中黑点表示边界点,白点为图像的内部点。

  • 跟踪的初始点是最左下方的黑点(即最后一行的最左黑点),跟踪的初始方向设定为左上角45度。
  • 跟踪开始后,初始点沿初始跟踪方向检测该方向是否有黑点(检测距离为一个像素点),如果是,则保存初始点,将检测到的点作为新的初始点,同时在原来检测的基础上,逆时针旋转90度作为新的跟踪方向。如果不是目标点,则沿顺时针旋转45度,沿新跟踪方向继续检测,直到找到黑色像素,然后将跟踪方向逆时针旋转90作为新的跟踪方向。
  • 重复上面不断改变跟踪方向,直到找到新的边界点。找到新的边界点后,将旧的边界点保存,将新检测到的点作为新的初始点。
  • 这样不断重复上述过程,直到检测点回到最开始的检测点为止。

注意:中心像素可以跟踪的方向有8个,对每个方向制定了方向编号以及偏移量,如下图所示。一般来说,通常选取图像的最左下角的像素点作为起点。

3 Python实现

  1. 读入彩色图像
img_name = "./20210812/sample3.png"
img = cv2.imread(img_name)

结果如下:

2) 彩色图像灰度化

 gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

结果如下:

3) 图像二值化

def get_binary_img(img):# gray img to bin imagebin_img = np.zeros(shape=(img.shape), dtype=np.uint8)h = img.shape[0]w = img.shape[1]for i in range(h):for j in range(w):bin_img[i][j] = 255 if img[i][j] > 200 else 0return bin_img
# 调用
bin_img = get_binary_img(gray_img)

结果如下:

4)边界跟踪
参考上述原理,进行实现,代码如下:

# 从左上角查找开始
def get_left_up_start_pt(bin_img):h = bin_img.shape[0]w = bin_img.shape[1]find = 0start_i = 0start_j = 0for i in range(h):for j in range(w):if bin_img[i][j] == 0:find = 1start_i = istart_j = jbreakreturn find,start_i,start_j
def trace_contour(bin_img,find,start_i,start_j):contour_img = np.zeros(shape=(bin_img.shape), dtype=np.uint8)contour_img += 255if find:contour_img[start_i][start_j] = 0Direct = [(-1,1),(0,1),(1,1),(1,0),(1,-1),(0,-1),(-1,-1),(-1,0)]BeginDirect = 0findstart = 0cur_i = start_icur_j = start_jwhile findstart==0 :findpoint = 0while findpoint==0:i = cur_i + Direct[BeginDirect][1]j = cur_j + Direct[BeginDirect][0]pixel = bin_img[i][j]if pixel==0:findpoint = 1cur_i = icur_j = jif cur_i ==start_i and cur_j == start_j:findstart = 1contour_img[cur_i][cur_j] = 0BeginDirect-=1if BeginDirect == -1:BeginDirect = 7BeginDirect-=1if BeginDirect == -1:BeginDirect = 7else:BeginDirect += 1if BeginDirect == 8:BeginDirect = 0return contour_img
# 调用
find, start_i, start_j = get_left_up_start_pt(bin_img)
contour_img = trace_contour(bin_img,find,start_i,start_j)

结果如下:

4 总结

通过上述简单步骤,我们实现了物体边界跟踪,相应的处理效果如下:

上图中 左侧为原图,右侧为我们提取的物体边界跟踪效果图。

关注公众号《AI算法之道》,获取更多AI算法资讯。

目标轮廓提取之边界跟踪法相关推荐

  1. 【机器视觉运动控制一体机小课堂】三分钟进行轮廓提取

    背景 轮廓提取是基于边缘轮廓的算法,可用于需要提取工件轮廓信息后进行加工处理的检测加工项目,可广泛应用于点胶.激光切割.工件打磨等需要提取工件轮廓的领域. 轮廓是一种能存储一系列点集的数据结构,可分为 ...

  2. 显著性轮廓提取、轮廓编组综述要看的内容(一)Berkeley学派

    Berkeley 学派 Jitendra Malik 不用介绍了吧,太大的牛了.如果要介绍起来,可要花不少篇幅了.研究兴趣:分割,知觉组织,纹理,立体视觉,识别等.他带的 26 个学生都在学术和工业领 ...

  3. 轮廓提取之滚球法、凹包算法

    提示:本文章主要介绍轮廓提取算法------滚球法的运用,可用于提取点云等二维.三维数据的轮廓,以及代码框架设计. 文章目录 前言 一.基于二维点数据的模型轮廓提取算法 1.1 适用场景 1.2 问题 ...

  4. 基于轮廓提取的 图像填充法

    基于轮廓提取的 图像填充法 一.前言 在设计裸眼3d视频生成算法的时候涉及到了这一点,遂记录一下 版本1,效果如下: 设计思路:一开始想直接用水漫法填充的时候,很容易发现下面的问题,就是抹少了,或抹多 ...

  5. 基于深度学习的图像边缘和轮廓提取

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 导读:边缘和轮廓的提取是一个非常棘手的工作,细节也许就会被过强的图 ...

  6. 一种新型鱼眼图像轮廓提取算法

    from: http://www.scimao.com/read/2307651     摘 要:提取鱼眼图像轮廓是利用鱼眼图像的前提.传统提取鱼眼图像轮廓的扫描线逼近法对噪点抑制能力不强,精度差.本 ...

  7. Win8 Metro(C#)数字图像处理--2.40二值图像轮廓提取算法

    Win8 Metro(C#)数字图像处理--2.40二值图像轮廓提取算法 原文:Win8 Metro(C#)数字图像处理--2.40二值图像轮廓提取算法  [函数名称] 二值图像轮廓提取      ...

  8. 使用纯JavaCV实现颜色分割 / 轮廓提取 / 离焦 / 线性旋转变焦模糊 / 灰度化 / 标注等处理

    年底冲KPI很多项目要结项,临时被拉去开发了一些"很有意思"的项目,感觉自从离开学校以后很长时间都没有再接触过图像处理领域了,有点跟熟悉的陌生人打交道的快感.这里简单记录一下相关代 ...

  9. Halcon轮廓提取

    简介: 对目标区域进行轮廓提取,可以用于判定形状等. 介绍: boundary(获取一个区域的边界) Region (input_object)   Regions for which the bou ...

最新文章

  1. 从5G入池看AI发展新方向 | 杜克大学陈怡然教授专访
  2. JavaScript中的load事件的作用_史上最全的web前端面试题汇总及答案JavaScript之二(二)...
  3. android代码实现手机加速功能,Android自定义View实现内存清理加速球效果
  4. CTFshow php特性 web141
  5. 京东应用架构设计与治理
  6. 借助 Subversion 进行版本控制
  7. 任何一个正整数都可以用2的幂次方表示(C语言版)
  8. 【C++grammar】结构化绑定
  9. leetcode 834. 树中距离之和(dp)
  10. Spark streaming消费Kafka的正确姿势
  11. SAP在阿里云白皮书-第三章 SAP上阿里云场景介绍
  12. C++基础知识点(3)
  13. 安卓比较好的数独软件_有没有比较好的数独游戏APP?
  14. 笔记本win10 64位 1050Ti显卡 安装Anaconda3.4.2.0 (python3.5版)+tensorflow gpu版
  15. 路由配置与管理——ISIS路由配置与管理
  16. MySQL 报错:Could not acquire management access for administration 不能正确登录怎么办?
  17. 用业绩倒逼技术发展,小i机器人朱频频:AI价值不仅在于IPO
  18. 怎么一键完美抠图?无需PS!快来看看!
  19. 程序员发面试短信,HR十天后才回复信息还被拒:你算什么东西?
  20. 为什么单片机接地电阻都是10千欧

热门文章

  1. Python使用pyhive,impala,JayDeBeApi连接Hive(含Kerberos)
  2. 桂林理工大学考试(考核)试卷(2018 ~ 2019学年度 第 一 学期)课程名称:数据结构
  3. 【FFmpeg】PCM编码成AAC
  4. 小额贷款机构该如何引入大数据?
  5. 3大建模职业,为什么游戏建模最吃香?
  6. ArcGIS Engine - 拓扑检查
  7. SiamFC完整的跟踪过程
  8. 软考高级 真题 2010年下半年 信息系统项目管理师 论文
  9. 三星发布2亿像素传感器并举办第三届未来技术论坛;福瑞泰克新智能制造工厂在乌镇开工 | 全球TMT...
  10. 信息学奥赛一本通答案dj均值1060