-
2021-11-02 16:23:33
基本思想:
(1)从一个封闭空间的左上角像素点开始,如下图中的p1点,以该点为起始点。
从该起始点的领域的空白像素点,以逆时针方向寻找,直到找到下一个边界点(图中为P2)。
2.每次遇到黑色像素点(即边界点) ,将它设置为当前边界像素点,然后原路返回到先前到达的白色像素,以顺时针方向搜索当前点的8邻域内的每一个像素,直到遇到下一个黑色像素。
3,重复步骤2,直到第二次访问到初始边界点,终止。在整个运行过程走过的黒色像素就是目标的边界像素。
更多相关内容 -
一种改进的二值图像边界跟踪与边界链码获取算法
2021-01-27 07:25:05为了克服传统二值图像边界跟踪速度慢和边界漏跟踪等问题, 基于Freeman 链码提出一种通用性强的多起点分段二值图像边界跟踪与边界链码获取算法。在借鉴前人对传统Freeman 链码搜索算法的改进, 将平均搜索方向减少为... -
二值图像边界跟踪-二值图像边界跟踪.rar
2019-08-13 15:44:19二值图像边界跟踪-二值图像边界跟踪.rar 看到有人需要二值图像边界跟踪,如是编写了一段代码,测试通过,可供需要的朋友们参考! -
二值图像中目标物体轮廓的边界跟踪算法
2019-01-04 21:04:56摘要 :分析了二值图像识别中常见的边界跟踪算法, 在此基础上提出一种通用性强的边界跟踪算法, 能够根 据上一边界点的位置判断轮廓走向.在搜索下一个边界点时, 只需要对候选的 5 个点进行判断, 便可以找到下 一个边界... -
matlab圆边界归一化代码-BoundaryTrack:二值化细胞图像序列的边界跟踪
2021-05-27 18:27:00边界分割,跟踪,突出/收缩速度的计算,局部曲率,每个位置的荧光强度。 演示 概述 边界提取,分割和跟踪 该程序提取二值化图像堆栈中对象的边界,将其分割为任意数量的位置,并在时间过程中跟踪每个位置。 边界提取... -
论文研究-一种基于脑血管图像特征的快速边界跟踪算法.pdf
2019-07-22 22:52:09在处理复杂的脑血管图像时,经典的边界跟踪算法暴露出边界精度不高、边界不够平滑,且速度不尽人意等缺点。提出了一种新的快速边界跟踪算法,该算法在分析脑血管边缘垂直细节远多于水平细节的特征基础上,结合方向... -
二值图边界跟踪
2019-01-26 12:36:31图像处理 二值图像边界跟踪 -
数字图像边界跟踪matlab实现
2013-04-22 15:14:56该matlab程序实现数字图像边界跟踪,可以用于对边缘的细化、去噪。。 -
matlab边界跟踪函数
2011-07-13 16:53:39function B = boundaries(BW, conn, dir) 对二值图像进行边界跟踪,4连接边界跟踪和8连接边界跟踪。 -
基于边界跟踪的任意形状区域填充算法
2021-02-22 12:10:19针对任意形状的多边形及孔洞区域,提出基于边界跟踪的填充算法。用细化算法对图像进行单线化预处理,分别跟踪各个封闭曲线的边界,从第1个边界点坐标出发,根据跟踪方向对每个边界点进行有向直线填充,遇到边界点时停止,... -
matlab图像处理:边界跟踪
2021-04-18 12:50:05matlab图像处理:边界跟踪matlab图像处理:边界跟踪设一幅二值图像中,只有一个白色区域,试给出求该区域外围轮廓线的方法(要求按顺时针的顺序给出各点的坐标,即行/列号)上面是题目的要求,提取图像的外边界轮廓和...matlab图像处理:边界跟踪
matlab图像处理:边界跟踪
设一幅二值图像中,只有一个白色区域,试给出求该区域外围轮廓线的方法(要求按顺时针的顺序给出各点的坐标,即行/列号)
上面是题目的要求,提取图像的外边界轮廓和内边界轮廓,相对比较简单,但是困难的是这个按照顺时针或者逆时针把这个坐标输出,可能许老师就是想让我们用他讲解的ppt的方法,这里赞一波许向阳老师,确实讲解的很透彻!!!
下面是实现的代码
%边界跟踪并实现顺时针输出
clear;
clc;
img = imread('hb.png');
% 对图像进行二值化操作
img = rgb2gray(img);
thresh = graythresh(img);
B = im2bw(img,thresh);
[M,N] = size(img);
mark_img = zeros(M,N);
% 采用八领域作为边界条件
offset_8 = [-1,0;-1,1;0,1;1,1;1,0;1,-1;0,-1;-1,-1];
match_list = [6,7,8,1,2,3,4,5];
% 下面找到第一个边界点
[a,b] = find(B==1);
start_point = [a(1),b(1)]
current_point = start_point;
dir = 1;
result = [start_point];
mark = 1
while (max(current_point ~= start_point))||(mark)
temp_point = current_point + offset_8(dir,:)
% 通过两个判断条件,来判断当前点是不是边界点
if (B(temp_point(1),temp_point(2))==1) && (sum(sum(B(temp_point(1)-1:temp_point(1)+1,temp_point(2)-1:temp_point(2)+1)))~=9)
dir = match_list(dir);
current_point = temp_point;
result = [result;current_point];
mark = 0;
else
dir = dir+1;
if dir == 9
dir = 1;
end
end
end
[new_m,new_n] = size(result);
for i = 1:new_m
mark_img(result(i,1),result(i,2)) = 1;
end
figure,imshow(img);
figure,imshow(mark_img);
for i=1:length(result)
disp(result(i,:))
end
取得的效果:
原图
提取的边界图
因为图有点大,所以看起来好像有点断断续续的样子
matlab图像处理:边界跟踪相关教程
MATLAB求解接地金属槽内电位分布
MATLAB求解接地金属槽内电位分布 基于MATLAB有限差分法中的迭代法求解接地金属槽内电位分布 要求 有限差分法 MATLAB编写 运行结果 全部代码 运用MATLAB求解接地金属槽内点位分布, 精度、行数M、列数N自己定义。 有限差分法是基于差分原理的一种数值计算法。
OpenCV4图像处理--二值图像联通组件扫描
OpenCV4图像处理--二值图像联通组件扫描 联通组件扫描 图像联通组件标记概念 扫描联通组件的常见算法 思考 图像联通组件标记概念 图像联通组件(CCL) 四领域与八领域 扫描联通组件的常见算法 概念 联通组件标记算法 (connected component labeling algorithm
matlab函数详解——preview(实现gui界面显示摄像头采集内容)
matlab函数详解——preview(实现gui界面显示摄像头采集内容) 最近需要使用matlab读取摄像头,并显示图像在gui上面,好像没有现成可以用的,这里试试。 matlab的preview函数中的例程:调用摄像头,并显示 obj = videoinput('winvideo',1,'MJPG_160x120');% s
【Matlab】你想知道在图表标题中显示变量的一切
【Matlab】你想知道在图表标题中显示变量的一切 有时在利用Matlab输出结果时,会通过作图(Figure),和做表(Excel)来完成。并且经常需要在标题中显示一些变量,比如下图,那么这是怎么实现的呢?能不能显示数组呢? 不难发现,所谓标题其实是一个 字符串
matlab总结
matlab总结 matlab 总结 单个图 1.连续时间画图 plot plot(x,y)plot(t,y,'-r',t,y0,':b',t,-y0,':b') a.线性 Specifier Line Style* (线型)* – 虚线(短划线) : 点线 -. 点划线 - 实线(默认样式) b.坐标点样式 Specifier Marker* (坐标点样式)* o 圆
【Matlab】如何确定数组中存在哪几个数?
【Matlab】如何确定数组中存在哪几个数? 在机器学习时,经常一个标签有好多样本,多种标签就对应更多的样本集了,所以就需要确定在这么长的数组里,到底有几个标签(数字)。 首先看下语法,这还挺多,为了直抒胸臆,就讲最简单的吧。其他的可以打开语法文档
MIMO(matlab)
MIMO(matlab) 仿真实现ZF,ZF-SIC,ZF-OSIC 代码: clear alldatasize = 1000000; %仿真的符号数SNR = 0:32; %信噪比M = 2; %BPSK调制pdata = randsrc(4,datasize/4,[0:1]); %数据源符号mdata= pskmod(pdata,M,pi);for i=1:datasize/4 Channel(:,:,i)=(randn(4,
OpenCV4图像处理--图像边缘提取
OpenCV4图像处理--图像边缘提取 边缘提取 图像边缘定义 图像边缘类型 边缘提取方法 图像边缘定义 图像边缘类型 边缘提取方法 基于梯度 的边缘提取 这种边缘提取方法的问题:对于阈值T的选择,总会导致不连贯的提取结果。 Canny 边缘提取 创新之处: API: Cann
-
二值图像目标邻域点法边界跟踪算法
2012-08-29 08:55:16自己实现的基于matlab的论文作者提出的二值图像目标邻域点法边界跟踪算法,比8邻域算法速度快。 -
基于边界跟踪和神经网络的煤岩界面识别方法研究-论文
2021-07-08 12:13:14据此提出一种基于边界跟踪算法和人工神经网络的煤岩界面识别方法,从而为巷道掘进机和采煤机滚筒空间位置的调整提供依据。采用文章提出的方法对从陕西神木榆家梁采煤工作面采集的原始图像进行验证,提取到的煤岩边界... -
通过边界跟踪的数字化二值图像的拓扑结构分析(翻译)
2021-01-25 00:14:56通过边界跟踪的数字化二值图像的拓扑结构分析 数字化二值化图像的拓扑分析将会提出两种边界跟踪算法。第一种算法判定二值图像边界间的包围关系,因为外层边界和孔边界分别与像素值为 1 的连通域(1-连通域)和孔存在...通过边界跟踪的数字化二值图像的拓扑结构分析
数字化二值化图像的拓扑分析将会提出两种边界跟踪算法。第一种算法判定二值图像边界间的包围关系,因为外边界和孔边界分别与像素值为 1 的连通域(1-连通域)和孔存在一一对应的关系。该算法提出了一种二值化图像的表现形式,通过这种方式可以提取某些特征而无需重建图像。第二种算法是第一种的修改版,只跟踪最外层的边界(即没有被孔包围的外边界)。当使用一台时序数字计算机时,这些算法可以被有效使用在二值图像的连通域计数、收缩和 拓扑结构 分析上。
1. 介绍
边界跟踪是处理数字化二值图像中的一种基础方法。它从 1-连通域 和 0-连通域(背景或者孔)之间的边界上导出一系列坐标点或者 链码。边界跟踪方法因为存在十分广泛的应用已经被深入研究,其中包括图像识别、图像分析和图像数据压缩 [1-10] 。
本文的目的是提出一种具有拓扑分析能力的边界跟踪算法。如果一个人想要把二值图像转成边界表示,那他可以通过这里提出的方法加少许额外的修改来提取图像的拓扑结构。要被提取的信息是两种边界间的包围关系:外边界和孔边界。因为外边界与 1-连通域,孔边界和 0-连通域间存在一一对应关系,所以可以确定给出二值图像的拓扑结构。
利用光栅扫描和标记在二值图像的拓扑结构分析上的研究已经取得了一定成果 [1,10,11]。不同于这类分析的另一种可选方案是使用边界跟踪。如果一个图像处理系统为了某种目的利用边界跟踪算法,同时也需要分析输入图像的拓扑结构,那本文的方法将很有吸引力。然而,致力于这个课题的研究很少,而存在的方法 [6,7] 也都相当复杂和耗时,以至于和其他没有使用边界跟踪的结构化分析方法相比,他们看起来毫无优势。
本文中,首先我们提出一种可以提取给定二值图像的拓扑结构算法。这个算法是区分外边界和孔边界的边界跟踪算法 [1] 的扩展版本,扩展包括:(1)给每条边一个独特的标记而不是对每条边采用相同的标记过程(边界标记);(2)增加一个步骤来获取当前跟踪边界的父边界(见定义 4)。通过这个算法我们可以提取边界间的包围关系,它也对应着连通域间的包围关系。如果一个二值图像以本文算法提取出来的边界和边界间的包围关系的形式存储,一些简单的图像处理无需恢复原图就可以进行,因此,这个方法提供了一个有效的存储二值图像数据的思路。
接下来我们展示第一个算法的修改版本,只跟踪二值图像最外层的边界(即没有被孔包围的外边界)。当我们想忽视被其他 1-连通域包围的 1-连通域(即忽略内部 1-连通域)时,修改版的算法将给我们一种快速、有序的方法来给 1-连通域计数或者收缩每个 1-连通域到一个点。
2. 基本概念和符号
本文只考虑采样点是矩形网格的数字化二值图像。尽管我们将遵循 [1] 中的通用术语及符号,我们也想定义和声明一些不那么广泛的概念和符号。
一个图像的最上面一行、最下面一行、最左边一列以及最右边一列组成了这个图像的边框。像素值 0,1 分别称作 0-像素,1-像素。为了保留通用性,我们假设二值图像的边框由 0-像素填充,同时假设在处理过程中我们可以赋予像素任意整数值。位于第 i 行,第 j 列的像素点用 (i, j) 表示。我们采用如下坐标系:行 i 从上往下递增,列 j 从左至右递增。图像中在像素点 (i, j) 处的灰度值为 f i , j f_{i,j} fi,j,则整幅图像都可以表示为 F = { f i , j } F=\{f_{i,j}\} F={fi,j}。
1-连通域和 0-连通域分别是由 1-像素,0-像素连接组成的。如果 0-连通域 S S S 包含图片的边框,就把 S S S 称为背景,否侧就是一个孔洞。
众所周知为了避免拓扑学矛盾,如果 1-像素当 4 (8) 连通 处理,0-像素必须使用 8 (4) 连通;如果 1-像素当 8 (4) 连通处理,0-像素必须使用 4 (8) 连通;当我们不明确指定连通性的类别时,意味着两种连通性都有效。
边界和连通域间的包围关系定义如下:
定义 1(边界点): 在 4 (8) 连通情况下,一个 1-像素的点 (i, j) 在它的 8 (4) 邻域中有一个 0-像素点 (p, q),那点 (i, j) 就是一个边界点,也可以描述为:如果 (i, j) 属于 1-连通域 S 1 S_1 S1,(p, q) 属于 0-连通域 S 2 S_2 S2,点 (i, j) 是 S 1 S_1 S1 和 S 2 S_2 S2 间的一个边界点。
定义 2(连通域间的包围关系): 二值图像中给定两个连通域 S 1 S_1 S1, S 2 S_2 S2,如果 S 1 S_1 S1 中的像素点到边框上的像素点,从任意四个方向都存在 S 2 S_2 S2 中的像素点,我们说 S 2 S_2 S2 包围 S 1 S_1 S1。如果 S 2 S_2 S2 包围 S 1 S_1 S1,且它们之间存在一个边界点,则称 S 2 S_2 S2 直接包围 S 1 S_1 S1。
定义 3(外边界和孔边界): 外边界是任意 1-连通域和直接包围它的 0-连通域的边界点的集合,相似的,孔边界是孔洞与直接包围它的 1-连通域的边界点的集合。我们用术语 “边界” 表示外边界或者孔边界。注意!孔边界也和外边界一样用 1-像素点(而不是 0-像素点)的集合表示。
以下属性适用于连通域和边界:
属性 1: 对二值图像中的任意一个 1-连通域它的外边界都是唯一的;对任意一个孔洞它的孔边界(孔洞和直接包围它的1-连通域间的边界)也是唯一的。
证明:这个属性显而易见,因为任意一个 1-连通域或孔洞都被另一个连通域直接包围。
我们定义父边界和边界间的包围关系。
定义 4(父边界): 1-连通域 S 1 S_1 S1 和直接包围 S 1 S_1 S1 的 0-连通域 S 2 S_2 S2 的外边界的父边界定义为:
(1)如果 S 2 S_2 S2 是一个孔洞,就是 S 2 S_2 S2 与直接包围 S 2 S_2 S2 的1-连通域的孔边界;
(2)如果 S 2 S_2 S2 是背景,就是图片的边框。
孔洞 S 3 S_3 S3 与直接包围 S 3 S_3 S3 的 1-连通域 S 4 S_4 S4 间的孔边界的父边界就是 S 4 S_4 S4 与直接包围 S 4 S_4 S4 的 0-连通域的外边界。
定义 5(边界的包围关系): 给定二值图像中的边界 B 0 B_0 B0 和 B n B_n Bn,我们说 B n B_n Bn 包围 B 0 B_0 B0 是存在一系列边界 B 0 B_0 B0, B 1 B_1 B1,…, B n B_n Bn,对所有 k k k 使得 B k B_k Bk 是 B k − 1 B_{k-1} Bk−1 的父边界。
从定义 2 到定义 5,我们在连通域以及边界的包围关系中看到如下属性(Fig.1)。
属性 2: 对任意二值图像,上述两种包围关系是同构的,映射如下:
一个 1-连通域 <——> 它的外边界
一个孔洞 <——> 它的孔边界(在孔洞和直接环绕孔洞的 1-连通域之间的孔边界)
背景 <——> 边框3. 用于拓扑分析的边界跟踪算法
我们提出一种用于拓扑结构分析的边界跟随算法,它能提取二值图像边界间的包围关系。首先我们给出该算法的非正式解释。
算法 1: 用 电视光栅扫描 输入的二值图像,当找到像素点 (i, j) 时中断扫描,该点满足外边界(Fig.2a)或孔边界(Fig.2b)上边缘跟踪起始点的条件。如果像素点 (i, j) 同时满足以上两个条件,(i, j) 必须被当作外边界的起始点。遇到新找到的边界就给它指定一个独特可辨识的数字,我们称之为边界序列号,用 NBD 来表示。
按如下方法确定新找到边界的父边界。在光栅扫描期间,我们保留最近遇到的(外或者孔)边界的序列号 LNBD。这个保留的边界不是新找到边界的父边界就是和新找到的边界同享一个父边界。因此,我们可以根据 Table 1 用两种边界类型来判断新找到边界的父边界的序列号。Table 1:描述新找到的边界 B 的父边界的决策规则 序列号为 LNBD 的边界 B1(即最近一次保留的边界)的类型 外边界 孔边界 边界 B 的类型 外边界 边界 B1 的父边界 边界 B1 孔边界 边界 B1 边界 B1 的父边界 从起始点跟踪当前找到的边界,标记边界上的像素点。边界跟踪方案是经典的一个方案 [1-3];和我们算法的区别显著在标记策略上。
(a)如果当前跟踪的边界在包含像素点 (p, q+1) 的 0-连通域和包含 (p, q) 的 1-连通域之间,改变 (p, q) 的值为 -NBD。(即外边界右侧和孔边界左侧的像素点被标记为 -NBD)
(b)否则,设置 (p, q) 的值为 NBD 除非 (p, q) 在已经追踪过的边界上。
条件 (a) 和 (b) 分别阻止像素点 (p, q) 成为已被跟踪过的外边界及孔边界的跟踪起始点。正数 NBD 及负数 -NBD 各自对应 [1] 中边界跟踪算法里的标记 “l” 和 “r”。
跟踪和标记整个边界后,继续开始光栅扫描。当扫描到图片右下角,算法结束。
让我们用 Fig.3 中描述的例子来解释算法流程。给定输入的二值图像如图 (a)。当光栅扫描到达圈出的 1-像素时,我们发现它满足外边界 (Fig.2a) 起始点的条件,把序列号 2 分配给这个边界,因为序列号 1 先留给了图片的边框,我们还可以从 Table 1 中发现序列号 2 对应的边界的父边界就是图片边框。
接着开始跟踪边界,并如图 (b) 所示把边界上的像素值改为 2 或者 -2。跟踪完整条边界后,继续开始光栅扫描。
图 (b) 中圈出的点满足孔边界 (Fig.2b) 的起始点条件,下一个跟踪边界从它开始。注意,一个被标记为负数的点不能成为边界跟踪的起始点。这条边界 (序列号 3) 的父边界是序列号为 2 的外边界。在边界跟踪期间,两个值为 2 的像素点根据标记规则 (a) 变为 -3,两个值为 1 的像素点根据标记规则 (b) 变成 3。所有值为 2 的其他已访问过的像素点不做改变。继续类似步骤,最终我们获得结果图 (e)。正式的描述在附录 1 中的算法 1 中给出。
从以下属性可以说明算法 1 的有效性。
属性 3: 任何一个 1-连通域 S 1 S_1 S1 的最上面一行最左侧的像素点 (i, j) 满足 (Fig.2a) 中起始点的条件,从 (i, j) 跟踪的边界 B B B 是外边界 (即 (i, j-1) 属于的 0-连通域 S 2 S_2 S2 包围 S 1 S_1 S1),该边界被追踪之后,同样的外边界不会再被追踪。
证明:见附录Ⅱ
属性 4: 当像素点 (i, j) 的右邻居 (i, j+1) 是任何孔洞 S 1 S_1 S1 的最上一行最左侧的点时,该点满足图 (Fig.2b) 中起始点的条件,从 (i, j) 开始追踪的边界 B B B 是孔边界 (即包含 (i, j) 的 1-连通域 S 2 S_2 S2 包围 S 1 S_1 S1),该边界被追踪之后,同样的孔边界不会再被追踪。
证明:同属性 3 中的证明。
属性 5: 算法 1 中的边界跟踪起始点与 1-连通域和孔洞有一一对应的映射关系。
证明:这个属性从属性 3,4 直接推导得出。
属性 6: 当确定特定边界 B B B 的父边界时,变量 LNBD 包含的不是边界 B B B 父边界的序列号就是和边界 B B B 同享一个父边界的边界的序列号。
证明:见附录Ⅲ。
算法 1 以及区分外边界孔边界的边界跟踪算法 [1],借助属性 2 至 5 在应用中有如下优势。
(1)我们可以在二值图像中计算 1-连通域和孔洞的数量,找到它的 欧拉数。
(2)我们可以将每一个 1-连通域或孔洞收缩到一个像素点,用外边界的边界跟踪起始点来表示 1-连通域,用孔边界起始点的右邻域像素点来表现孔洞。前后两个点分别位于 1-连通域和孔洞的最上一行的最左侧。
(3)我们可以根据边界上的特征来执行 (1) 或 (2):例如,我们可以只收缩周长大于给定值或其框架矩形面积大于具体值的 1-连通域。
算法 1 从属性 2 至 6 还有如下优势:
(4)我们可以在二值图像中提取连通域间的包围关系,它可以被应用到图像数据库中的图像搜索或图像特征提取。
(5)算法 1 中的用拓扑结构表现边界的方法将对图像的存储方式有实际作用。因为简单的图像处理可以在不恢复原始图像的情况下执行,所以图像处理包括:获得边界特征,例如周长、连通域的面积;分析拓扑结构,例如是否是与背景相邻的 1-连通域,是否有超过 n 个孔洞;根据他们的几何或拓扑特征提取或删除连通域或孔洞。
图 4 展示了一个例子,表现了通过算法 1 导出边界间的拓扑结构。
4. 只提取最外层边界的边界跟踪算法
我们可以修改上面的算法,使它只跟踪二值图像的最外层边界 (即背景与 1-连通域之间的外边界)。
算法 2: 我们这里只解释和算法 1 中的区别。(1) 我们只在当光栅扫描到达像素点,点满足外边界 (Fig.2a) 的跟踪边界起始点条件并且 LNBD <= 0 时,开始边界跟踪。(2) 标记规则与算法 1 中一样,除了值 “2” 和 “-2” 分别用值 “NBD” 和 “-NBD” 取代。(3) 在光栅扫描期间,我们保留最近遇到的非零像素的 “LNBD” 值,每次我们开始扫描图片的新一行时,重置 LNBD 为零。
算法 2 的基本原理如下。最外层边界的父边界是图像的边框。因此,当且仅当点 (i, j) 满足下面的条件 (1) 或 (2) 时,0-像素点右侧的边界点 (i, j) 是最外层边界上的边界点。
(1)所有的像素点 (i, 1),(i, 2)…(i, j-1) 都是 0-像素点。
(2)在电视光栅扫描中最近遇到的边界点 (i, h) 在外边界上,并且点 (i, h+1) 属于背景。
因为我们保留着电视光栅扫描期间最近遇到的非零像素 LNBD 的值,上述条件 (1) 和 (2) 可以通过条件 “LNBD = 0” 和 “LNBD = -2” 分别进行检查,除了最外层不再跟踪其他边界。
属性 7: 算法 2 只跟踪输入二值图像的最外层边界,而且每个最外层边界只跟踪一次。
算法 2 在如果不存在 1-连通域包围另一个 1-连通域的情况下,能有效使用在 1-连通域的计数和形状分析上,因为它不跟踪任何孔边界所以十分效率。如果被一个 1-连通域包围的所有 1-连通域都是噪声或是不需要被处理的其他因素,算法 2 也很有用。在表格 2 中,我们比较了当使用通用数字时序计算机时,一些收缩 1-连通域的算法 [1, 12, 13] 的处理时间。输入的图片都没有被其他 1-连通域包围的 1-连通域,就像图 5 展示的那样:一个是有随机孔洞的斑点图,另一个是线状图。算法 2 的收缩方法几乎连通域标记一样快。如果忽略 1-连通域包围其他所有 1-连通域的情况,它将会更适合,因为连通域标记不能区别最外层的连通域和要被忽略的连通域。
5. 结论
本文中,我们展示了一个通过边界跟踪分析二值图像拓扑结构的方法。这是区分二值图像外边界孔边界的边界跟踪算法的延伸。我们也呈现了一种统计 1-连通域数量,以及当希望忽视除最外层 1-连通域之外的 1-连通域时提取二值图像边界的方法。这是第一个算法的修改版。这些方法在被一台数字时序计算机使用时快速且有效。我们现在正在研究他们在文档处理上的应用,比如流程图识别。
附录Ⅰ. 算法 1 的正式描述
当我们在算法中说到 “邻域” 时,我们指的是在 4 (8) 连通情况下的 4 (8) 邻域。设输入图像 F = { f i , j } F=\{f_{i,j}\} F={fi,j}。初始化 NBD 为 1 ( F F F 的边框形成了一个特殊的孔边界,并获得序列号 1;NBD 代表着当前边界的序列号)。用电视光栅扫描图片,对每个 f i , j ≠ 0 f_{i,j}≠0 fi,j=0 的像素点执行下述步骤。每次重新开始扫描图片的新一行时,把 LNBD 重置为 1。
(1)选择以下一个:
(a)如果 f i , j = 1 f_{i,j}=1 fi,j=1 并且 f i , j − 1 = 0 f_{i,j-1}=0 fi,j−1=0,判定像素点 (i, j) 是外边界跟踪起始点,NBD 自己加 1,(i2, j2) <-- (i, j-1)。
(b)或者如果 f i , j > = 1 f_{i,j}>=1 fi,j>=1 且 f i , j + 1 = 0 f_{i,j+1}=0 fi,j+1=0,判定像素点 (i, j) 是孔边界的边界跟踪起始点, NBD 自加 1,(i2, j2) <-- (i, j+1),当 f i , j > 1 f_{i,j}>1 fi,j>1 时,LNBD <-- f i , j f_{i,j} fi,j。
(c)否则,跳转到 (4)。(2)根据新找到边界和序列号为 LNBD 的边界 (即当前行遇到的上一个边界) 的种类,如表 1 所示判定当前边界的父边界。
(3)从起始点 (i, j) 跟踪检测到的边缘:这一步由子步骤 (3.1) 到 (3.5) 完成。
(3.1)从 (i2, j2) 开始,顺时针环顾 (i, j) 的邻域寻找一个非零像素点。把 (i1, j1) 设为第一个找到的非零点。如果没找到非零点,把 f i , j f_{i,j} fi,j 值设为 -NBD,跳转到 (4)。
(3.2)(i2, j2) <-- (i1, j1),(i3, j3) <-- (i, j)。
(3.3)从下一个像素点 (i2, j2) 逆时针方向开始,逆时针检查当前像素点 (i3, j3) 的邻域,寻找一个非零像素点,并把找到的第一个设为 (i4, j4)。
(3.4)如下改变在点 (i3, j3) 处的值 f i 3 , j 3 f_{i_3,j_3} fi3,j3:(a)如果在步骤 (3.3) 中像素点 (i3, j3+1) 是被检查过的 0-像素, f i 3 , j 3 f_{i_3,j_3} fi3,j3 <-- -NBD。
(b)如果在步骤 (3.3) 中像素点 (i3, j3+1) 不是被检查过的 0-像素并且 f i 3 , j 3 = 1 f_{i_3,j_3}=1 fi3,j3=1, f i 3 , j 3 f_{i_3,j_3} fi3,j3 <-- NBD。
(c)否侧, f i 3 , j 3 f_{i_3,j_3} fi3,j3 值不做改变。(3.5)如果 (i4, j4) = (i, j) 并且 (i3, j3) = (i1, j1) (回到起始点),跳转到 (4);否则 (i2, j2) <-- (i3, j3),(i3, j3) <-- (i4, j4),跳回到 (3.3)。
(4)如果 f i , j ≠ 1 f_{i,j}≠1 fi,j=1,那么 LNBD <-- | f i , j f_{i,j} fi,j| 并从 (i, j+1) 处重新开始光栅扫描。当光栅到达图片右下角时,算法结束。
附录Ⅱ. 属性 3 的证明
略。
附录Ⅲ. 属性 6 的证明
略。
致谢
作者非常感谢名古屋大学Fukumura教授、Toriwaki教授、Yokoi教授及其同事进行了富有成果的讨论。作者还感谢电工实验室的白井博士提供的宝贵建议。采用电工学实验室开发的图像处理软件包SPIDER进行对比实验。本研究部分得到日本文部科学省科研资助。
参考文献
略。
举例解释算法 1 的实现过程
根据 附录Ⅰ中 算法 1 的正式描述 解释图 3 中边界的查找情况。
具体概念步骤的说明解释还请先看前文,点按如下颜色区分,借鉴的是4连通的情况,省略了部分重复步骤。
我们可以发现 (i, j) 和 (i1, j1) 确定后,在跟踪这条边界的过程中都不会改变,只用来判断边界是否结束。(i3, j3) 指向当前点,判断当前值是否要被修改;(i2, j2) 指向上一个当前点;(i4, j4) 指向最新找到的非零点。如果没有回到原点,当前点变为上一个当前点,最新找到的非零点成为当前点,一直到回到原点。这三个值在跟踪边界的过程中一直在变动。
-
目标轮廓提取之边界跟踪法
2021-08-12 08:23:31上一篇我们介绍了目标轮廓提取法来提取目标轮廓,这一章节我们来介绍边界跟踪法。边界跟踪的定义为从图像中的一个边界点出发,然后跟觉某种判别准则搜索出下一个边界点,以此跟踪出目标边界。 边界跟踪的一般步骤...1 引言
上一篇我们介绍了目标轮廓提取法来提取目标轮廓,这一章节我们来介绍边界跟踪法。边界跟踪的定义为从图像中的一个边界点出发,然后根据某种判别准则搜索出下一个边界点,以此跟踪出目标边界。
边界跟踪的一般步骤如下:
1)确定边界的起始搜索点,起始点的选择很关键,对于某些图像,选择不同的起始点会导致不同的结果
2)确定合适边界判别准则和搜索准则,判别准则主要用于判断一个点是不是边界点,搜索准则则知道如何搜索下一个边缘点。
3)确定搜索的终止条件。2 算法原理
边界跟踪算法原理:
1)从左下角开始逐点扫描,当遇到边缘点时,则跟踪,直至跟后续点回到起始点(对于闭合线),或其后续点在没有新的后续点(对于非闭合线)为止。
2)如果为非闭合线,则跟踪一侧后,需从起始点开始朝相反方向跟踪到另一尾点。
3)如果不止一个后续点,则按上述连接准则选择距离最近的点为后续点,另一次近的后续点作为新的边缘跟踪起点另行跟踪。
4)一条线跟踪完后,接着扫描到下一个未跟踪点,直到所有边缘都跟踪完毕。
我们来举个栗子吧:
上图为边界跟踪示意图,图中黑点表示边界点,白点为图像的内部点。- 跟踪的初始点是最左下方的黑点(即最后一行的最左黑点),跟踪的初始方向设定为左上角45度。
- 跟踪开始后,初始点沿初始跟踪方向检测该方向是否有黑点(检测距离为一个像素点),如果是,则保存初始点,将检测到的点作为新的初始点,同时在原来检测的基础上,逆时针旋转90度作为新的跟踪方向。如果不是目标点,则沿顺时针旋转45度,沿新跟踪方向继续检测,直到找到黑色像素,然后将跟踪方向逆时针旋转90作为新的跟踪方向。
- 重复上面不断改变跟踪方向,直到找到新的边界点。找到新的边界点后,将旧的边界点保存,将新检测到的点作为新的初始点。
- 这样不断重复上述过程,直到检测点回到最开始的检测点为止。
注意:中心像素可以跟踪的方向有8个,对每个方向制定了方向编号以及偏移量,如下图所示。一般来说,通常选取图像的最左下角的像素点作为起点。
3 Python实现
- 读入彩色图像
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 image bin_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 0 return 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 = 0 start_i = 0 start_j = 0 for i in range(h): for j in range(w): if bin_img[i][j] == 0: find = 1 start_i = i start_j = j break return 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 += 255 if find: contour_img[start_i][start_j] = 0 Direct = [(-1,1),(0,1),(1,1),(1,0),(1,-1),(0,-1),(-1,-1),(-1,0)] BeginDirect = 0 findstart = 0 cur_i = start_i cur_j = start_j while findstart==0 : findpoint = 0 while findpoint==0: i = cur_i + Direct[BeginDirect][1] j = cur_j + Direct[BeginDirect][0] pixel = bin_img[i][j] if pixel==0: findpoint = 1 cur_i = i cur_j = j if cur_i ==start_i and cur_j == start_j: findstart = 1 contour_img[cur_i][cur_j] = 0 BeginDirect-=1 if BeginDirect == -1: BeginDirect = 7 BeginDirect-=1 if BeginDirect == -1: BeginDirect = 7 else: BeginDirect += 1 if BeginDirect == 8: BeginDirect = 0 return 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算法资讯。 -
边界跟踪算法的实现,图像处理 c++
2011-05-02 19:05:16对输入的二值图像,进行边界跟踪,实现输出图像的边界,存在一维数组之中 -
边缘提取边界跟踪法
2014-12-27 19:55:34本文件为边界跟踪法提取图像边缘的算法,编程语言用matlab。 -
边界跟踪算法(PDF版)
2010-06-07 10:35:14边界跟踪算法,一种很详细的说明,pdf版的。希望对大家有帮助,边界跟踪算法 -
边界跟踪算法之内边界跟踪
2018-11-29 20:31:43**首先要说的是,边界跟踪算法是在区域已经分出(图像已经是二值图或已经标注的图),但边界却是未知的。 如何获取一个目标的边界信息呢?我将自己学习经验分享给大家。 ** 算法描述如下: 内边界跟踪 第一步: 从... -
MATLAB之图像边界跟踪(轮廓跟踪)
2021-12-01 10:42:39就是通过顺序找出边缘点来跟踪边界。如果图像是二值或者图像中不同区域具有不同的像素值,但每个区域内的像素值是相同的。则用下列代码可以实现基于4连通或8连通区域的轮廓跟踪。 I=imread('camera.png'); %读取... -
区域边界跟踪(虫爬法)和目标邻域点边界跟踪法
2021-01-20 15:49:39目标邻域点边界跟踪法区域边界跟踪(虫爬法)目标邻域点边界跟踪法目标邻域点边界跟踪法一个例子 区域边界跟踪(虫爬法) 跟踪法 一种像素聚类方法,某个种子像素开始在其邻域搜索符合某种类聚条件的像素 不对图像每... -
二值图像边界跟踪
2015-03-23 15:22:34二值图像边界跟踪, -
【数字图像处理】边界跟踪算法
2021-04-21 10:07:02轮廓提取轮廓提取:对于一副二值化图像,物体与背景分开,如果背景是白物体,物体为黑的话,我们可以采用掏空内部点法进行轮廓提取。具体算法如下:首先开辟新的内存空间,然后遍历图像,如果8个... 边界跟踪算法基于... -
边界跟踪 (bwtraceboundary函数).m
2021-04-21 07:34:57边界跟踪 (bwtraceboundary函数)clc; clear;I=imread('e:\role0\003i.bmp');figure;imshow(I);title('原始图像');I1=rgb2gray(I); %将彩色图像转化灰度图像threshold=graythresh(I1); %计算将灰度图像转化为二值图像... -
MATLAB中的边界跟踪实现
2018-11-22 08:55:56具体来介绍一下关于边界跟踪的实现方法: 在识别图象中的目标时,往往需要对目标边缘作跟踪处理,也叫轮廓跟踪。顾名思义,轮廓跟踪就是通过顺序找出边缘点来跟踪边界的。若图象是二值图象或图象中不同区域具有不同... -
【数字图像处理matlab】(边界跟踪-光栅扫描法)
2022-04-13 12:07:06【数字图像处理matlab】(边界跟踪-光栅扫描法) 调用Matlab自带图像测试,光栅扫描法实现边界跟踪。 function coor = edge_search(I) %边缘跟踪 %输入:灰度图矩阵,用Matlab自带图像 rice.png 进行测试 %输出:米粒... -
基于方向预估计的边界跟踪算法 (2011年)
2021-05-14 22:27:17为了实现多目标轮廓高效跟踪,提出了基于方向预估计的边界跟踪算法。研究了多目标轮廓模型表达以及轮廓初始点选取方法,为多轮廓跟踪提供模型依据。定义了4方向操作模板和方向矩阵实现轮廓走向的估计,通过定义权重矩阵... -
图像处理基础知识系列之一:边界跟踪之内边界跟踪算法解释
2017-05-26 19:10:29边界跟踪:内边界跟踪算法解释 边界跟踪是基于边缘的分割常用方法之一,用于区域已分出(二值或已标注),但边界未知的情况。分为内边界与外边界。内边界为区域的一个子集,外边界不是区域的一个子集。 内边界... -
数字图像处理 - Ch11 边界跟踪 链码
2022-01-24 17:23:57数字图像处理 Ch11 边界跟踪 链码