细化算法 (1)
Hilditch 细化算法是经典的二值图像细化算法
Hilditch 细化算法是经典的二值图像细化算法,然而,在网上却很难找到一个详细、正确的介绍和实现。
可以找到一辆个 Hilditch 算法的C实现,但缺乏注释,代码可读性也很差。
在期刊网上找到几篇论文,提及了Hilditch 算法,结果一篇说的罗哩罗嗦根本看不懂,另一篇说的说的易懂,却是错误的!拿来主义是行不通了,于是只好结合着这几个论文和代码,从头写 Hilditch 细化算法。
假设像素p的3×3邻域结构为:Hilditch 细化算法的步骤为:对图像从左向右从上向下迭代每个像素,是为一个迭代周期。
在每个迭代周期中,对于每一个像素p,如果它同时满足6个条件,则标记它。
在当前迭代周期结束时,则把所有标记的像素的值设为背景值。
如果某次迭代周期中不存在标记点(即满足6个条件的像素),则算法结束。
假设背景值为0,前景值为1,则:6个条件为:(I):p 为1,即p不是背景;(2):x1,x3,x5,x7不全部为1(否则把p标记删除,图像空心了);(3):x1-x8 中,至少有2个为1(若只有1个为1,则是线段的端点。
若没有为1的,则为孤立点);(4):p的8连通联结数为1;联结数指在像素p的3*3邻域中,和p连接的图形分量的个数:上图中,左图的4连通联结数是2,8连通联结数是1,而右图的4联通联结数和8联通联结数都是2。
4连通联结数计算公式是:8连通联结数计算公式是:其中,至于公式怎么来的就不管了,直接用就行了。
(5)假设x3已经标记删除,那么当x3为0时,p的8联通联结数为1;(6)假设x5已经标记删除,那么当x5为0时,p的8联通联结数为1。
======在程序中,我使用的是这样的邻域编码:为了方便计算联结数,以0作为前景,1作为背景。
程序如下(完整程序见:/svn/trunk/src/mon/UnmanagedI mage/ImageU8.cs):/// <summary>/// 计算八联结的联结数,计算公式为:/// (p6 - p6*p7*p0) + sigma(pk - pk*p(k+1)*p(k+2)), k = {0,2,4)/// </summary>/// <param name="list"></param>/// <returns></returns>private unsafe Int32 DetectConnectivity(Int32* list){Int32 count = list[6] - list[6] * list[7] * list[0];count += list[0] - list[0] * list[1] * list[2];count += list[2] - list[2] * list[3] * list[4];count += list[4] - list[4] * list[5] * list[6];return count;}private unsafe void FillNeighbors(Byte* p, Int32* list, Int32 width, Byte foreground = 255){// list 存储的是补集,即前景点为0,背景点为1,以方便联结数的计算list[0] = p[1] == foreground ? 0 : 1;list[1] = p[1 - width] == foreground ? 0 : 1;list[2] = p[-width] == foreground ? 0 : 1;list[3] = p[-1 - width] == foreground ? 0 : 1;list[4] = p[-1] == foreground ? 0 : 1;list[5] = p[-1 + width] == foreground ? 0 : 1;list[6] = p[width] == foreground ? 0 : 1;list[7] = p[1 + width] == foreground ? 0 : 1;}/// <summary>/// 使用 hilditch 算法进行细化/// </summary>public unsafe void Thinning(Byte foreground = 255){Byte* start = this.Start;Int32 width = this.Width;Int32 height = this.Height;Int32* list = stackalloc Int32[8];Byte background = (Byte)(255 - foreground);Int32 length = this.Length;using (ImageU8 mask = new ImageU8(this.Width, this.Height)) {mask.Fill(0);Boolean loop = true;while (loop == true){loop = false;for (Int32 r = 1; r < height - 1; r++){for (Int32 c = 1; c < width - 1; c++){Byte* p = start + r * width + c;// 条件1:p 必须是前景点if (*p != foreground) continue;// p3 p2 p1// p4 p p0// p5 p6 p7// list 存储的是补集,即前景点为0,背景点为1,以方便联结数的计算FillNeighbors(p, list, width, foreground);// 条件2:p0,p2,p4,p6 不皆为前景点if (list[0] == 0 && list[2] == 0 && list[4] == 0 && list[6] == 0)continue;// 条件3: p0~p7至少两个是前景点Int32 count = 0;for (int i = 0; i < 8; i++){count += list[i];}if (count > 6) continue;// 条件4:联结数等于1if (DetectConnectivity(list) != 1) continue;// 条件5: 假设p2已标记删除,则令p2为背景,不改变p的联结数 if (mask[r - 1, c] == 1){list[2] = 1;if (DetectConnectivity(list) != 1)continue;list[2] = 0;}// 条件6: 假设p4已标记删除,则令p4为背景,不改变p的联结数 if (mask[r, c - 1] == 1){list[4] = 1;if (DetectConnectivity(list) != 1)continue;}mask[r, c] = 1; // 标记删除loop = true;}}for (int i = 0; i < length; i++){if (mask[i] == 1){this[i] = background;}}}}}。
第6章 腐蚀,膨胀,细化算法
第6章腐蚀,膨胀,细化算法这一章的内容我认为是最有趣的。
还记得前言中那个抽取骨架的例子吗?现在我们就来看看它是如何实现的。
今天所讲的内容属于一门新兴的学科:数学形态学(Mathematical Morphology)。
说起来很有意思,它是法国和德国的科学家在研究岩石结构时建立的一门学科。
形态学的用途主要是获取物体拓扑和结构信息,它通过物体和结构元素相互作用的某些运算,得到物体更本质的形态。
在图象处理中的应用主要是:(1)利用形态学的基本运算,对图象进行观察和处理,从而达到改善图象质量的目的;(2)描述和定义图象的各种几何参数和特征,如面积、周长、连通度、颗粒度、骨架和方向性等。
限于篇幅,我们只介绍二值图象的形态学运算,对于灰度图象的形态学运算,有兴趣的读者可以阅读有关的参考书。
在程序中,为了处理的方便,还是采用256级灰度图,不过只用到了调色板中的0和255两项。
先来定义一些基本符号和关系。
1.元素设有一幅图象X,若点a在X的区域以内,则称a为X的元素,记作a∈X,如图6.1所示。
2.B包含于X设有两幅图象B,X。
对于B中所有的元素ai,都有ai∈X,则称B包含于(included in)X,记作B X,如图6.2所示。
3.B击中X设有两幅图象B,X。
若存在这样一个点,它即是B的元素,又是X的元素,则称B击中(hit)X,记作B↑X,如图6.3所示。
4.B不击中X设有两幅图象B,X。
若不存在任何一个点,它即是B的元素,又是X的元素,即B和X的交集是空,则称B不击中(miss)X,记作B∩X=Ф;其中∩是集合运算相交的符号,Ф表示空集。
如图6.4所示。
图6.1 元素图6.2 包含图6.3 击中图6.4 不击中5.补集设有一幅图象X,所有X区域以外的点构成的集合称为X的补集,记作X c,如图6.5所示。
显然,如果B∩X=Ф,则B在X的补集内,即B X c。
图6.5 补集的示意图6.结构元素设有两幅图象B,X。
基于算术运算的改进细化算法
基于算术运算的改进细化算法基于算术运算的改进细化算法改进细化算法是一种高效而稳健的迭代算法,在很多科学和工程领域广泛应用。
该算法主要是通过反复迭代求解较为复杂的非线性方程,来逐步优化目标函数,从而得到更好的解。
然而,细化算法在进行迭代计算时往往需要进行大量的运算,因此使用高效的算术运算方法可以有效地提高算法的计算效率和精度。
本文将介绍基于算术运算的改进细化算法,在实际应用中如何应用和优化。
一、改进细化算法概述改进细化算法的主要思想是通过迭代优化过程,不断逼近非线性方程的最优解。
在迭代过程中,算法会使用一些高效的数值优化技术,如牛顿迭代、Broyden-Fletcher-Goldfarb-Shanno(BFGS)算法等,以逐步优化目标函数的值。
通过不断细化,可以得到越来越精确的解。
改进细化算法与一般细化算法相比,具有更高的计算效率和精度。
它可以更快地收敛到最优解,同时保证迭代过程不会陷入局部最优解。
此外,改进细化算法还可以克服函数奇异性和不连续性等问题,使得该算法具有广泛的适用范围。
二、算术运算优化方法细化算法的计算过程中需要大量的算术运算,因此使用高效的算术运算方法可以显著提高算法的计算效率和精度。
下面介绍几种常用的算术运算优化方法。
1.矩阵优化在使用BFGS算法进行迭代优化时,需要不断求解矩阵的逆。
然而,矩阵的逆通常是一项非常耗时的计算,因此使用一些特殊的矩阵优化技巧可以显著提高算法的计算效率。
例如,可以使用逆迹技术或稳定低秩分解等技术来快速求解矩阵的逆。
这些技术可以大大减少计算时间,并且保证计算结果的准确性。
2.向量化运算使用向量化运算可以显著提高计算效率。
向量化运算将多个数值计算操作合并为一个单一的矩阵或向量运算。
这样可以使得计算过程更加并行化,提高运算效率。
例如,可以使用SIMD指令集或数据并行技术等向量化运算技术。
这些技术可以同时处理多个数值数据,大大提高了算法的计算效率。
3.误差控制技术在进行算术运算时,误差是不可避免的。
细化算法研究
论文中文摘要毕业设计说明书(论文)外文摘要1 绪论图像的细化是数字图像预处理中的重要的一个核心环节。
图像细化在图像分析和图像识别中如汉子识别、笔迹鉴别。
指纹分析中有着广泛的应用。
图像的细化主要有以下几个基本要求:(1)骨架图像必须保持原图像的曲线连通性。
(2)细化结果尽量是原图像的中心线。
(3)骨架保持原来图形的拓扑结构。
(4)保留曲线的端点。
(5)细化处理速度快。
(6)交叉部分中心线不畸变。
虽然现在人们对细化有着广泛的研究,细化算法的方法有很多。
然而大多数算法如Hilditch算法和Rosenfield算法存在着细化后图形畸变,断点过多,在复杂的情况下关键信息的缺失等问题。
基于上诉考虑,传统的细化算法已经无法满足如今的数字图像处理要求。
因此,需要提出新的一种算法,来解决相关问题。
1.1 相关定义1.1.1串行与并行从处理的过程来看,主要可以分为串行和并行两类,前者对图像中当前象素的处理依据其邻域内象素的即时化结果,即对某一元素进行检测,如果该点是可删除点,则立即删除,且不同的细化阶段采用不同的处理方法;后者对当前的象素处理依据该象素及其邻域内各象素的前一轮迭代处理的结果,至始至终采用相同的细化准则。
即全部检测完汉子图像边缘上的点后再删除可删除点。
1.1.2骨架对图像细化的过程实际上是求一图像骨架的过程。
骨架是二维二值目标的重要拓扑描述,它是指图像中央的骨架部分,是描述图像几何及拓扑性质的重要特征之一。
骨架形状描述的方法是Blum最先提出来的,他使用的是中轴的概念。
如果用一个形象的比喻来说明骨架的含义,那就是设想在t=0的时刻,讲目标的边界各处同时点燃,火焰以匀速向目标内部蔓延,当火焰的前沿相交时火焰熄灭,那么火焰熄灭点的集合就构成了中轴,也就是图像的骨架。
例如一个长方形的骨架是它的长方向上的中轴线,正方形的骨架是它的中心点,圆的骨架是它的圆心,直线的骨架是它自身,孤立点的骨架也是自身。
细化的目的就是在将图像的骨架提取出来的同时保持图像细小部分的连通性,特别是在文字识别,地质识别,工业零件识别或图像理解中,先对被处理的图像进行细化有助于突出形状特点和减少冗余信息量。
几种细化算法的比较研究
!譬。
塑:璺且、几种细化算法的比较研究刘卫光李娟(中原工学院,河南郑州450007).脯要】该文综合分析了各种常用细化算法存在的问题,简单介绍并评价了,:种主要的改进方法,从而为相关技术人员在根据具体需要选择合适的细化算法时提供了方便,最后,对细化算法的研究方向给出了一些辰望。
陕键甸图像处理;细化;算法;结构元素细化(t hi nni ng)是采用各种手段逐层消去图形的外边界像素点,直至图形的像素宽度减少到一个像素,但同时保存能够表征图形的特征,然后使用像素跟踪的方法结合各个图形的判别函数将图形转换为矢量格式。
细化有四个原则:1)细化要取原图像的中心线,即细化过程应是对称的;2)细化不能改变原图像的连通性;3)细化时要保持原图像的基本特征,要尊重原图像:4)具有很好的稳定’I‰细化过程也就是对图像逐层剥落的过程,随着细化的进行,图像有规律地缩小。
传统细化算法有很多,有串行算法和并行算法。
常用的有H i,di t ch细化、D e ut c h细化和Pavl i di s细化和基于形态学的细化算法等。
'几种经典的细化算法1.1H i l di t ch算法H i l di t c h细化算法为是串行处理方法的一种,最终得到的是8条近邻连接线条。
其主要原理是每次扫描并删除图像上满足一定的条件的轮廓像素,直到图像上不存在可删除的轮廓像素为止。
文献【1脂出该方法适用于二值图像,即像素为1的区域为目标区域像素为0的区域为背景区域的图像。
在此算法中,目标像素P若同时满足以下条件即为可删除像素:1)P0+P2+P4+P6。
<3,2)N c=l:3)Pk(O≤k≤7)中至少有一个目标像素为1;4)P2=l或N c2=l;N c2为假定P2=0时P的联结数:5)P4=1或N c4=1。
N c4为假定P4=0时P的联结数。
联结数就是八邻域中互相分离的联结成分的个数。
12D eut c h细化算法文朗1l介绍D eut c h细化算法采用的处理方式为并行处理方式其算法吐是采用两层子循环。
一种改进的脱机手写文字细化算法
Li un 和 G nu n在 文献 [ ] e H ag exnWa 3 中提 出 了
一
种有效 的并行文 字 细化 算 法 , 该算 法采 用 了 7个
保 留模板 和 5 删除模板 , 0个 分别如 下 :
( ) 留曲线 的端点 ; 5保
20 08年 8月 1 1日收 到 国家 十五 科 技 攻关 项 目 (04 A 1B) 20B S0
⑥ 20 S i ehE gg 08 c .T c. nn.
一
种改 进 的脱 机 手写文 字细 化算 法
刘 瑛 王 绪 本
( 都 理 工 大学 信 息 工 程学 院 , 都 60 5 ; 都 理工 大 学研 究 生 院 109) 成 成 10 9 成 ,60 5
摘
要
在分析 已有细化算法 的基础上, 针对两个像素宽 的文字笔划 , 设计像素保 留算 法, 有效解决 了文字笔划 断裂及 丢失 细化 模 板 断裂 丢失
一
情 况有关 ; 在 并行 方 式 中 , 而 当前 迭 代 仅 仅 由前 一
次 的迭代 情 况 决 定 。串 行 细化 算 法 的处 理 结 果 依
赖 于对像素 处理 的先后 顺 序 , 而像 素点 的消除 或 因 保 留不可预 测 ; 而并 行 细化 算 法对 图像 进 行 细化 时 利用 相 同的条件 同时检 测 所有 像 素点 , 结果 具有 其 各 向同性 , 此 从 算 法 原 理 上 并 行 方 法 优 于 串行 因
方法 。
个 好 的细化 算法应该 达到如 下要求 :
() 1 骨架 图像必 须保持原 图像 的连通性 ; () 2 骨架 图像应尽 可能是原 图像 的中心线 ;
() 3 细化 结果 要 尽 可 能 细 , 争取 得 到一 个 像 素 宽 的线条 图像 ; () 4 应使用 尽可能少 的迭代 次数 ;
二值图像的细化算法
首先 , 对二 值 图像 进 行 设 定 。这 里 假 定 二值 图像 以 白 色 为 底 , 化黑 色 部 分 , 给 出 的 黑 色 部 分 的 图像 为 连 通 细 且
以下 是 对 链 表 的遍 历 ( 中 的 边 界 点 、 通 点 的 判 断 , 其 连 都 留 到下 面 的算 法 中具 体 的介 绍 ) 在 一 轮 轮 的遍 历 中 , , 逐
我设 定 了一 些 不 同 的颜 色 值 , 作 不 同 情 况 的 判 断 。 而 一 以 轮需 作 两 次 的遍 历 。第 一 次 遍 历 判 断 是 否 为 边 界点 , 考 需
摘 要 : 二值 图像是只有黑 白两种颜 色的 图像 , 二值 图像 的细化是 讨论将一 个图像 中的 黑色部分沿着 它的 中心轴 线
将 其 细化 为一 个像 素 宽 的线 条 的处 理 过 程 , 细化 的 结 果 能基 本 保 留 图形 中 黑 色部 分 的拓 扑 结 构 。介 绍 了一 个 二 值 图 像 的 细化 算 法 , 想 是从 原 图像 的 边 界 逐 层 消 除 黑 色像 素 点 , 同 时 保 持 黑 色 部 分 的 连 通 性 , 到 最 后 得 到 细 化 结 思 但 直
0 引 言
在 计 算 机 领 域 , 像 处 理 的 问题 越来 越 成 为 重 要 的一 图
图像 区域 会 失 去 连 通性 , 体 判 断要 考 虑 该 点 的 8个 方 向 具 的像 素 的颜 色 值 。因 为 在 后 面 的 判 断 中有 两 个 黑 点 去 掉 后 , 色 图 像 区 域 是 否 会 失 去 连 通 性 的 , 们 在 此 定 义 使 黑 我
第 1R 第7 o 期 2 1年 7 01 月
图像细化(骨架化)算法分析
图像细化(⾻架化)算法分析图像细化(⾻架化)算法分析图像的细化是模式识别中很重要的⼀个技术,指的是将原本"臃肿"的像素简化为单像素相连接的⼆值图像(即类似⾻架的概念),细化的好坏直接影响到后⾯识别匹配的效率。
摘⾃某⽂章的话,细化就是经过⼀层层的剥离,从原来的图中去掉⼀些点,但仍要保持原来的形状,直到得到图像的⾻架。
⾻架,可以理解为图象的中轴,例如⼀个长⽅形的⾻架是它的长⽅向上的中轴线;正⽅形的⾻架是它的中⼼点;圆的⾻架是它的圆⼼,直线的⾻架是它⾃⾝,孤⽴点的⾻架也是⾃⾝。
下⾯先介绍经典的Zhang并⾏快速细化算法:设p1点的⼋邻域为:【 p9 p2 p3p8 p1 p4p7 p6 p5 】(其中p1为⽩点,如果以下四个条件同时满⾜,则删除p1,即令p1=0)其中迭代分为两个⼦过程:过程1 细化删除条件为:(1)、2 < =N(p1) <= 6, N(x)为x的8邻域中⿊点的数⽬(2)、A(p1)=1, A(x)指的是将p2-p8之间按序前后分别为0、1的对数(背景⾊:0)(3)、p2*p4*p6=0(4)、p4*p6*p8=0如果同时满⾜以上四个条件则该点可以删除(赋值为0)。
过程2 细化删除条件为:(1)、2 < =N(p1) <= 6, N(x)为x的8邻域中⿊点的数⽬(2)、A(p1)=1, A(x)指的是将p2-p8之间按序前后分别为0、1的对数(背景⾊:0)(3)、p2*p4*p8=0(4)、p2*p6*p8=0如果同时满⾜以上四个条件则该点可以删除。
代码如下:A.m1 function n=A(temp,i,j)2 %0->1的数⽬3 shuzu=[temp(i,j),temp(i-1,j),temp(i-1,j+1),temp(i,j+1),temp(i+1,j+1),temp(i+1,j),temp(i+1,j-1),temp(i,j-1),temp(i-1,j-1)];4 n=0;5for i=2:86if shuzu(i)==0&&shuzu(i+1)==17 n=n+1;8 end9 end主函数代码:1 test=input('Please input a digits image:','s'); %输⼊图像2 x=imread(test);3if ~isbw(x)4'请确保输⼊图像为⼆值化图像!';5else6 [height,width]=size(x);7 mark=1;8 % temp=zeros(height+2,width+2);9 % temp(2:height+1,2:width+1)=x(:,:);10 temp=x;11 imshow(temp);12while mark==113 mark=0;1415for i=2:height-116for j=2:width-117 condition=0;18 %判断P(r,c)是否为可细化像素19if temp(i,j)==120 n=0;21for ii=-1:122for jj=-1:123 n=n+temp(i+ii,j+jj);24 end25 end26if (n>=3 && n<=7)27 condition=condition+1;28 end29if A(temp,i,j)==130 condition=condition+1;31 end32if temp(i-1,j)*temp(i,j+1)*temp(i+1,j)==033 condition=condition+1;34 end35if temp(i,j+1)*temp(i+1,j)*temp(i,j-1)==036 condition=condition+1;37 end38if condition==439 mark=1;40 temp(i,j)=0;41 end42 end43 end44 end45 figure;imshow(temp);464748for i=2:height-149for j=2:width-150 condition=0;51 %判断P(r,c)是否为可细化像素52if temp(i,j)==153 n=0;54for ii=-1:155for jj=-1:156 n=n+temp(i+ii,j+jj);57 end58 end59if (n>=3 && n<=7)60 condition=condition+1;61 end62if A(temp,i,j)==163 condition=condition+1;64 end65if temp(i-1,j)*temp(i,j+1)*temp(i,j-1)==066 condition=condition+1;67 end68if temp(i,j-1)*temp(i+1,j)*temp(i,j-1)==069 condition=condition+1;70 end71if condition==472 mark=1;73 temp(i,j)=0;74 end75 end76 end77 end78 figure;imshow(temp);79 end80 end结果:。
一种空间三维图像的细化算法
2 基于双 目立体 视 觉的物 体 建模原 理
双 目立体视觉 技术 : 运用 二维成 像技 术 , 是 通过 相关 算 法, 运用二 维照片中 的特征坐标 , 成三 维坐标 的过程 , 合 需要 在不 同方 向采集二 维 图像 , 采集 的摄 像机机 位放 置 图 , 如下
图 1所 示 。
一
1 以物体特征 中相关 的三个特征点 为基 础 , ) 这三个点能
够两两相交 , 组成三角形 2 每个点 的坐标垂直 映射 , ) 不能在三角形 的外部 。 3 对一个点进行操作 的时候 , ) 它的变化会 只影 响到与之
条直线上 。采 集特 征时 , 在拍 摄 的时候 , 要保 证摄 像设 备 内部 的直线轴 与拍 摄 物 的空 间 坐标 系 的 ‰ 轴是 同一条 直
形状结构 原型的三维模型 J 。
1 引言
基于双 目立体视觉 技术 建立三维物体模 型 , 在当今 的物
体三维仿真 中是一个及 其热门的课题 。特别是 2 0世纪 9 O
但是 , 通过双 目立体视觉构建 的模 型有一个 传统 的难 点 问题 没有解决 , 就是建立 的三维模 型的清 晰度的 问题 。由于 用该方法建立 的模 型所需要的三维数据 点 , 都是 通过二 维图
完整 的数据点 三维坐标 了 J 。下面 以新增 一个 细化数 据点 为例 , 介绍整个细化算法 的一个流程 。 32 空间插入 数据点的选择 . 细化算法 的第 一步是 对 已经存 在的三 维模 型进行 三角
剖分 : 建立三角剖分需要准从一下规则 :
在 图 1中 , 、:表示 摄像 机 的实 际位 置。两个 摄像 机 00 之间存在着一定距 离 , 通过两个摄像 头对需要 转换 的物 体进
hilditch 细化算法 python
Hilditch细化算法是一种用于二值图像细化(或骨架化)的算法。
以下是一个简单的Python实现:
def hilditch(image):
# 获取图像的宽度和高度
width, height = image.shape
# 创建一个与原图大小相同的掩模,所有值初始化为1
mask = image.copy()
# 遍历原图像
for y in range(height):
for x in range(width):
# 如果当前像素是1,则进行细化操作
if image[x][y] == 1:
# 判断上下左右四个方向是否为0
if (x > 0 and image[x-1][y] == 0) or (x < width-1 and image[x+1][y] == 0):
mask[x][y] = 0
if (y > 0 and image[x][y-1] == 0) or (y < height-1 and image[x][y+1] == 0):
mask[x][y] = 0
# 返回细化后的图像
return mask
这个函数接受一个二值图像作为输入,并返回一个细化后的图像。
在函数中,我们首先创建一个与原图大小相同的掩模,并将所有值初始化为1。
然后,我们遍历原图像中的每个像素,如果当前像素是1,则检查其上下左右四个方向是否为0。
如果是,则将当前像素的值设置为0,表示该像素应该被细化掉。
最后,我们返回细化后的图像。
hilditch细化算法python
Hilditch细化算法是一种用于图像处理的算法,旨在对二值化图像进行细化处理,以消除图像中不必要的细节,从而得到更加清晰的边缘轮廓。
该算法在数字图像处理领域具有广泛的应用,可以帮助我们提取出图像中的有效信息,并且在计算机视觉、模式识别等领域有着重要的作用。
Hilditch细化算法的原理比较复杂,主要包括以下几个步骤:1. 定义细化算法的结构元素:Hilditch细化算法中使用了一个3x3的结构元素,该结构元素用于检测图像中的特定模式,并对其进行处理。
2. 识别图像中的特征点:在细化算法中,首先需要识别图像中的特征点,这些特征点通常指的是图像中的边缘像素点,通过对这些特征点进行分析和处理,可以实现对图像的细化处理。
3. 进行细化处理:一旦特征点被识别出来,就可以开始对图像进行细化处理。
这通常包括对结构元素进行滑动操作,利用结构元素与图像进行匹配,并根据预先设定的条件对结构元素进行处理,以使得图像的边缘轮廓更加清晰。
4. 迭代处理:细化算法通常需要进行多次迭代处理,直到图像中的所有特征点都被处理完毕,并且不再发生变化为止。
Hilditch细化算法虽然在图像处理中有着重要的作用,但是在实际应用中也存在一些问题和挑战。
算法本身的复杂性较高,需要较高的计算和存储资源;另外在处理过程中可能会出现一些误差和不确定性,这也需要我们在实际应用中做出一些改进和调整。
在Python中,我们可以利用一些开源的图像处理库来实现Hilditch 细化算法的功能,比如OpenCV、Pillow等。
这些库提供了丰富的API和功能,可以帮助我们实现图像的二值化处理、特征点的识别以及细化处理等操作。
Python本身具有简洁清晰的语法结构,也使得我们可以比较方便地编写和调试相关的算法代码。
以OpenCV为例,我们可以通过以下步骤来实现Hilditch细化算法:1. 导入OpenCV库:首先需要导入OpenCV库,并读取需要处理的图像数据。
一些基本的形态学算法 细化
一些基本的形态学算法细化1.引言1.1 概述概述形态学算法是图像处理领域中的一种重要技术,主要用于图像的分析和处理。
形态学算法基于数学形态学理论,通过对图像中的形状和结构进行操作和变换,从而实现图像的特征提取、图像增强、边缘检测等目的。
形态学算法最早是由Matheron于1964年提出的,其理论基础是数学形态学,借鉴了数学中对集合的运算和变换的概念和方法。
形态学算法主要基于结构元素(也称为模板或内核)与图像进行操作,通过结构元素在图像上的移动和比较,实现图像的形态学变化。
形态学算法的基础操作包括膨胀、腐蚀、开运算和闭运算。
膨胀操作将结构元素扩张到图像中的对象区域,从而使对象的尺寸增大;腐蚀操作将结构元素侵蚀图像中的对象区域,使对象的尺寸减小。
开运算是先进行腐蚀,再进行膨胀,通常用于去除图像中的小噪点;闭运算与开运算相反,先进行膨胀,再进行腐蚀,通常用于填补图像中的小孔洞。
除了基本形态学算法外,细化算法也是形态学算法的重要内容之一。
细化算法主要用于提取图像中的骨架或轮廓线。
骨架提取算法通过连续的腐蚀操作,逐步减小图像中的对象尺寸,最终得到对象的骨架;线条细化算法则通过针对对象边界的特征点进行腐蚀和连接操作,实现对边界线条的细化。
本文将详细介绍基本形态学算法和细化算法的原理和应用,并通过实例演示其在图像处理中的作用。
同时,强调细化算法在形态学算法中的重要性和应用前景,以期对读者深入理解和应用形态学算法具有指导意义。
1.2文章结构文章结构部分的内容是对整篇文章的组织和安排进行介绍。
在本篇文章中,主要包含了引言、正文和结论三个部分。
首先是引言部分,引言部分主要包括概述、文章结构和目的三个小节。
在概述中,介绍了本篇文章要讨论的主题,即一些基本的形态学算法的细化。
在文章结构中,说明了整篇文章的目录和结构安排。
在目的小节中,阐明了撰写这篇文章的目的和意义。
接下来是正文部分,正文部分分为基本形态学算法和细化算法两个小节。
骨架曲线提取
骨架曲线提取
骨架曲线提取是图像处理中的一种技术,用于从图像中提取目标物体的主要结构或边缘信息。
骨架曲线通常代表目标物体的中轴线或主要骨干,对于形状分析、图像识别和计算机视觉等领域具有重要意义。
以下是一般的骨架曲线提取方法:
1.细化算法(Thinning Algorithm):细化算法是最常见的骨架曲线提取方法之一。
该算法通过迭代,逐渐去除目标物体的边缘像素,直到获得骨架曲线。
经典的细化算法包括Zhang-Suen细化算法和Guo-Hall细化算法。
2.距离变换(Distance Transform):这种方法首先计算图像中每个像素到最近目标物体边缘的距离,然后根据距离信息提取骨架曲线。
距离变换方法不仅用于骨架曲线提取,还广泛应用于形状分析和模式识别。
3.中轴变换(Medial Axis Transform):中轴变换寻找目标物体内部的局部极大值区域,形成中轴线,该线代表了目标的主要结构。
中轴变换方法适用于具有复杂形状的物体。
4.基于梯度的方法:利用图像梯度信息来提取目标的边缘或中轴线。
梯度信息可以通过使用Sobel、Prewitt等滤波器来获取。
5.基于模板匹配的方法:使用特定的模板匹配目标物体的结构,通过匹配过程提取目标物体的骨架信息。
在选择骨架曲线提取方法时,需要考虑目标物体的形状、图像噪声水平、计算效率等因素。
不同的方法适用于不同的场景,因此在实际应用中可能需要尝试多种方法并根据具体情况选择最适合的方法。
图像细化算法 2
图像细化算法一、细化算法简介图像细化(Image Thinning),一般指二值图像的骨架化(Image keletonization)的一种操作运算。
所谓的细化就是经过一层层的剥离,从原来的图中去掉一些点,但仍要保持原来的形状,直到得到图像的骨架。
骨架,可以理解为图象的中轴。
好的细化算法一定要满足:∙收敛性;∙保证细化后细线的连通性∙保持原图的基本形状∙减少笔画相交处的畸变∙细化结果是原图像的中心线∙细化的快速性和迭代次数少依据是否使用迭代运算可以分为两类:(1)非迭代算法一次即产生骨架,如基于距离变换的方法。
游程长度编码细化等。
(2)迭代算法即重复删除图像边缘满足一定条件的像素,最终得到单像素宽带骨架。
迭代方法依据其检查像素的方法又可以再分成①串行算法是否删除像素在每次迭代的执行中是固定顺序的,它不仅取决于前次迭代的结果,也取决于本次迭代中已处理过像素点分布情况.②并行算法像素点删除与否与像素值图像中的顺序无关,仅取决于前次迭代的结果二、本文所用算法我所采用的是Zhang并行快速细化算法,它的原理也很简单:我们对一副二值图像进行骨架提取,就是删除不需要的轮廓点,只保留其骨架点。
假设一个像素点,我们定义该点为p1,则它的八邻域点p2->p9位置如下图所示,该算法考虑p1点邻域的实际情况,以便决定是否删除p1点。
假设我们处理的为二值图像,背景为黑色,值为0,要细化的前景物体像素值为1。
算法的描述如下。
首先复制源图像到目地图像,然后建立一个临时图像,接着执行下面操作:1. 把目地图像复制给临时图像,对临时图像进行一次扫描,对于不为0的点,如果满足以下四个条件,则在目地图像中删除该点(就是设置该像素为0),这里p2,…,p9是对应位置的像素灰度值(其为1或者0)。
a. 2<= p2+p3+p4+p5+p6+p7+p8+p9<=6大于等于2会保证p1点不是端点或孤立点,因为删除端点和孤立点是不合理的,小于等于6保证p1点是一个边界点,而不是一个内部点。
一种快速准确的细化算法
收稿日期:2002206208 基金项目:国家“九五”重中之重科技攻关资助项目(962B02203) 作者简介:吴丹(19802),女,江西南昌人,中国地质大学(武汉)信息工程学院硕士研究生,研究方向:GIS ,图像处理。
文章编号:100622475(2003)0120006202一种快速准确的细化算法吴 丹(中国地质大学信息工程学院,湖北武汉 430074)摘要:细化广泛应用于图像处理与模式识别。
从细化得到的骨架不但保持了原图像的几何和拓扑特征,而且更重要的是减少了图像的冗余。
细化算法多种多样,本文介绍了一种简单但却具备其它算法优势的细化算法。
本算法仅使用几条简单的规则来决定是否删除像素点,以达到细化的目的。
经计算机模拟该算法对汉字的处理过程,证实其快速且易于实现。
关键词:细化;骨架;相邻像素点;0~1模式数中图分类号:TP391 文献标识码:AA F ast and Accurate Thinning AlgorithmW U Dan(In formation Engineering Faculty ,China University of G eosciences ,Wuhan 430074,China )Abstract :Thinning is widely used in image processing and pattern recognition.The skeleton obtained from thinning not only maintains the geometric and topologic features of the original image ,but als o substantially reduces its redundancy.There are all kinds of thinning alg orithms.This paper introduces a thinning alg orithm ,which is simple yet can maintain the same advantages of other key alg orithms.This alg orithm only uses a very small set of rules of criteria for deleting pixels ,it is faster and easier to implement.K eyw ords :thinning ;skeleton ;neighbor pixel ;0~1pattern number0 引 言细化,也被称之为骨架化,是广泛应用于图像处理与模式识别的一个重要的图像预处理过程。
图像细化算法
帮助 | 留言交流 |首页我的图书馆主题阅读精彩目录精品文苑Tags会员浏览好书推荐图象细化算法(转载)mtjs收录于2009-01-09 阅读数:公众公开tags:vc图象算法图象细化算法#include "StdAfx.h"#include <stdlib.h>#include <malloc.h>void beforethin(unsigned char *ip, unsigned char *jp, unsigned long lx, unsigned long ly){unsigned long i,j;for(i=0; i<ly; i++){for(j=0; j<lx; j++){//这里要视前景是白点还是黑点而定,可以改动 //如果前景是白点,就是这样;反之反过来if(ip[i*lx+j]>0)jp[i*lx+j]=1;elsejp[i*lx+j]=0;}}}///////////////////////////////////////////////////////////////////////////Hilditch细化算法//功能:对图象进行细化//参数:image:代表图象的一维数组主题阅读吸烟的危害吸烟与癌症吸烟等于吸入重金属男性如此吸烟害上加害如何戒烟中药戒烟处方四则戒烟:生活中的经济学公开戒烟秘方给男士们推荐戒烟方法令人不寒而栗的戒烟广告马克思戒烟关于吸烟这件事,有趣热点推荐少见的文// lx:图象宽度// ly:图象高度// 无返回值void ThinnerHilditch(void *image, unsigned long lx, unsigned long ly) {char *f, *g;char n[10];unsigned int counter;short k, shori, xx, nrn;unsigned long i, j;long kk, kk11, kk12, kk13, kk21, kk22, kk23, kk31, kk32, kk33, size; size = (long)lx * (long)ly;g = (char *)malloc(size);if(g == NULL){printf("error in allocating memory!\n");return;}f = (char *)image;for(i=0; i<lx; i++){for(j=0; j<ly; j++){kk="i"*ly+j;if(f[kk]!=0){f[kk]=1;g[kk]=f[kk];}}}counter = 1; 革"群丑图"精心整理的80个管理类...135个治病小偏方,从...中国历史朝代让“开心穴”帮你除去烦躁佛教小常识一般学术论文的写作方法-搞笑一篇气死了九十九...心情小屋--图框(非常漂亮)婚后生活攻略文化大革命为什么没有被..."); } else { document.write(""); }Copyright © 2009 , All Rights Reserved服务条款设360doc为首页留言交流联系我们友情链接客服QQ:524562434 QQ群号:71307145do{printf("%4d*",counter); counter++;shori = 0;for(i=0; i<lx; i++){for(j=0; j<ly; j++){kk = i*ly+j;if(f[kk]<0)f[kk] = 0;g[kk]= f[kk];}}for(i=1; i<lx-1; i++){for(j=1; j<ly-1; j++) {kk="i"*ly+j;if(f[kk]!=1)continue;kk11 = (i-1)*ly+j-1; kk12 = kk11 + 1; kk13 = kk12 + 1; kk21 = i*ly+j-1;kk22 = kk21 + 1; kk23 = kk22 + 1; kk31 = (i+1)*ly+j-1; kk32 = kk31 + 1; kk33 = kk32 + 1;if((g[kk12]&&g[kk21]&&g[kk23]&&g[kk32])!=0)continue;nrn = g[kk11] + g[kk12] + g[kk13] + g[kk21] + g[kk23] + g[kk31] + g[kk32] + g[kk33];if(nrn <= 1){f[kk22] = 2;continue;}n[4] = f[kk11];n[3] = f[kk12];n[2] = f[kk13];n[5] = f[kk21];n[1] = f[kk23];n[6] = f[kk31];n[7] = f[kk32];n[8] = f[kk33];n[9] = n[1];xx = 0;for(k=1; k<8; k="k"+2){if((!n[k])&&(n[k+1]||n[k+2]))xx++;}if(xx!=1){f[kk22] = 2;continue;}if(f[kk12] == -1){f[kk12] = 0;n[3] = 0;xx = 0;for(k=1; k<8; k="k"+2){if((!n[k])&&(n[k+1]||n[k+2])) xx++;}if(xx != 1){f[kk12] = -1;continue;}f[kk12] = -1;n[3] = -1;}if(f[kk21]!=-1){f[kk22] = -1;shori = 1;continue;}f[kk21] = 0;n[5] = 0;xx = 0;for(k=1; k<8; k="k"+2){if((!n[k])&&(n[k+1]||n[k+2])) {xx++;}}if(xx == 1){f[kk21] = -1;f[kk22] = -1;shori =1;}elsef[kk21] = -1;}}}while(shori);free(g);}///////////////////////////////////////////////////////////////////////////Pavlidis细化算法//功能:对图象进行细化//参数:image:代表图象的一维数组// lx:图象宽度// ly:图象高度// 无返回值void ThinnerPavlidis(void *image, unsigned long lx, unsigned long ly) {char erase, n[8];char *f;unsigned char bdr1,bdr2,bdr4,bdr5;short c,k,b;unsigned long i,j;long kk,kk1,kk2,kk3;f = (char*)image;for(i=1; i<lx-1; i++){for(j=1; j<ly-1; j++){kk = i*ly + j;if(f[kk])f[kk] = 1;}}for(i=0, kk1=0, kk2=ly-1; i<lx; i++, kk1+=ly, kk2+=ly) {f[kk1]=0;f[kk2]=0;}for(j=0, kk=(lx-1)*ly; j<ly; j++,kk++){f[j]=0;f[kk]=0;}c="5";erase =1;while(erase){c++;for(i=1; i<lx-1; i++){for(j=1; j<ly-1; j++){kk="i"*ly+j;if(f[kk]!=1)kk1 = kk-ly -1;kk2 = kk1 + 1;kk3 = kk2 + 1;n[3] = f[kk1];n[2] = f[kk2];n[1] = f[kk3];kk1 = kk - 1;kk3 = kk + 1;n[4] = f[kk1];n[0] = f[kk3];kk1 = kk + ly -1;kk2 = kk1 + 1;kk3 = kk2 + 1;n[5] = f[kk1];n[6] = f[kk2];n[7] = f[kk3];bdr1 =0;for(k=0; k<8; k++){if(n[k]>=1)bdr1|=0x80>>k;}if((bdr1&0252)== 0252) continue;f[kk] = 2;b="0";for(k=0; k<=7; k++){b+=bdr1&(0x80>>k); }f[kk]=3;if((bdr1&0160)!=0&&(bdr1&07)!=0&&(bdr1&0210)==0)f[kk]=3;else if((bdr1&&0301)!=0&&(bdr1&034)!=0&&(bdr1&042)==0) f[kk]=3;else if((bdr1&0202)==0 && (bdr1&01)!=0)f[kk]=3;else if((bdr1&0240)==0 && (bdr1&0100)!=0)f[kk]=3;else if((bdr1&050)==0 && (bdr1&020)!=0)f[kk]=3;else if((bdr1&012)==0 && (bdr1&04)!=0)f[kk]=3;}}for(i=1; i<lx-1; i++){for(j=1; j<ly-1; j++){kk = i*ly + j;if(!f[kk])continue;kk1 = kk - ly -1;kk2 = kk1 + 1;kk3 = kk2 + 1;n[3] = f[kk1];n[2] = f[kk2];n[1] = f[kk3];kk1 = kk - 1;kk2 = kk + 1;n[4] = f[kk1];n[0] = f[kk3];kk1 = kk + ly -1;kk2 = kk1 + 1;kk3 = kk2 + 1;n[5] = f[kk1];n[6] = f[kk2];n[7] = f[kk3];bdr1 = bdr2 =0;for(k=0; k<=7; k++){if(n[k]>=1)bdr1|=0x80>>k;if(n[k]>=2)bdr2|=0x80>>k;}if(bdr1==bdr2){f[kk] = 4;continue;}if(f[kk]!=2)continue;if((bdr2&0200)!=0 && (bdr1&010)==0 && ((bdr1&0100)!=0 &&(bdr1&001)!=0 ||((bdr1&0100)!=0 ||(bdr1 & 001)!=0) &&(bdr1&060)!=0 &&(bdr1&06)!=0)){f[kk] = 4;}else if((bdr2&040)!=0 && (bdr1&02)==0 && ((bdr1&020)!=0 && (bdr1&0100)!=0 ||((bdr1&020)!=0 || (bdr1&0100)!=0) &&(bdr1&014)!=0 && (bdr1&0201)!=0)){f[kk] = 4;}else if((bdr2&010)!=0 && (bdr1&0200)==0 && ((bdr1&04)!=0 && (bdr1&020)!=0 ||((bdr1&04)!=0 || (bdr1&020)!=0) &&(bdr1&03)!=0 && (bdr1&0140)!=0)){f[kk] = 4;}else if((bdr2&02)!=0 && (bdr1&040)==0 && ((bdr1&01)!=0 && (bdr1&04)!=0 ||((bdr1&01)!=0 || (bdr1&04)!=0) &&(bdr1&0300)!=0 && (bdr1&030)!=0)){f[kk] = 4;}}}for(i=1; i<lx-1; i++){for(j=1; j<ly-1; j++){kk = i*ly + j;if(f[kk]!=2)continue;kk1 = kk - ly -1;kk2 = kk1 + 1;kk3 = kk2 + 1;n[3] = f[kk1];n[2] = f[kk2];n[1] = f[kk3];kk1 = kk - 1;kk2 = kk + 1;n[4] = f[kk1];n[0] = f[kk3];kk1 = kk + ly -1;kk2 = kk1 + 1;kk3 = kk2 + 1;n[5] = f[kk1];n[6] = f[kk2];n[7] = f[kk3];bdr4 = bdr5 =0;for(k=0; k<=7; k++){if(n[k]>=4)bdr4|=0x80>>k;if(n[k]>=5)bdr5|=0x80>>k;}if((bdr4&010) == 0){f[kk] = 5;continue;}if((bdr4&040) == 0 && bdr5 ==0) {f[kk] = 5;continue;}if(f[kk]==3||f[kk]==4)f[kk] = c;}}erase = 0;for(i=1; i<lx-1; i++){for(j=1; j<ly-1; j++){kk = i*ly +j;if(f[kk]==2||f[kk] == 5){erase = 1;f[kk] = 0;}}}}}///////////////////////////////////////////////////////////////////////////Rosenfeld细化算法//功能:对图象进行细化//参数:image:代表图象的一维数组// lx:图象宽度// ly:图象高度// 无返回值void ThinnerRosenfeld(void *image, unsigned long lx, unsigned long ly) {char *f, *g;char n[10];char a[5] = {0, -1, 1, 0, 0};char b[5] = {0, 0, 0, 1, -1};char nrnd, cond, n48, n26, n24, n46, n68, n82, n123, n345, n567, n781; short k, shori;unsigned long i, j;long ii, jj, kk, kk1, kk2, kk3, size;size = (long)lx * (long)ly;g = (char *)malloc(size);if(g==NULL){printf("error in alocating mmeory!\n"); return;}f = (char *)image;for(kk=0l; kk<size; kk++){g[kk] = f[kk];}do{shori = 0;for(k=1; k<=4; k++){for(i=1; i<lx-1; i++){ii = i + a[k];for(j=1; j<ly-1; j++){kk = i*ly + j;if(!f[kk])continue;jj = j + b[k];kk1 = ii*ly + jj;if(f[kk1])continue;kk1 = kk - ly -1;kk2 = kk1 + 1;kk3 = kk2 + 1;n[2] = f[kk2];n[1] = f[kk3];kk1 = kk - 1;kk3 = kk + 1;n[4] = f[kk1];n[8] = f[kk3];kk1 = kk + ly - 1;kk2 = kk1 + 1;kk3 = kk2 + 1;n[5] = f[kk1];n[6] = f[kk2];n[7] = f[kk3];nrnd = n[1] + n[2] + n[3] + n[4]+n[5] + n[6] + n[7] + n[8];if(nrnd<=1)continue;cond = 0;n48 = n[4] + n[8];n26 = n[2] + n[6];n24 = n[2] + n[4];n46 = n[4] + n[6];n68 = n[6] + n[8];n82 = n[8] + n[2];n123 = n[1] + n[2] + n[3];n345 = n[3] + n[4] + n[5];n567 = n[5] + n[6] + n[7];n781 = n[7] + n[8] + n[1];if(n[2]==1 && n48==0 && n567>0) {if(!cond)continue;g[kk] = 0;continue;}if(n[6]==1 && n48==0 && n123>0) {if(!cond)continue;g[kk] = 0;shori = 1;continue;}if(n[8]==1 && n26==0 && n345>0) {if(!cond)continue;g[kk] = 0;shori = 1;continue;}if(n[4]==1 && n26==0 && n781>0) {if(!cond)continue;g[kk] = 0;shori = 1;continue;}if(n[5]==1 && n46==0){if(!cond)continue;g[kk] = 0;continue;}if(n[7]==1 && n68==0) {if(!cond)continue;g[kk] = 0;shori = 1;continue;}if(n[1]==1 && n82==0) {if(!cond)continue;g[kk] = 0;shori = 1;continue;}if(n[3]==1 && n24==0) {if(!cond)continue;g[kk] = 0;shori = 1;continue;}cond = 1;if(!cond)continue;g[kk] = 0;shori = 1;}}for(i=0; i<lx; i++){for(j=0; j<ly; j++){kk = i*ly + j;f[kk] = g[kk];}}}}while(shori);free(g);}///////////////////////////////////////////////////////////////////////////基于索引表的细化细化算法//功能:对图象进行细化//参数:lpDIBBits:代表图象的一维数组// lWidth:图象高度// lHeight:图象宽度// 无返回值BOOL WINAPI ThiningDIBSkeleton (LPSTR lpDIBBits, LONG lWidth, LONG lHeight){//循环变量long i;long j;long lLength;unsigned char deletemark[256] = {0,0,0,0,0,0,0,1, 0,0,1,1,0,0,1,1,0,0,0,0,0,0,0,0, 0,0,1,1,1,0,1,1,0,0,0,0,0,0,0,0, 1,0,0,0,1,0,1,1,0,0,0,0,0,0,0,0, 1,0,1,1,1,0,1,1,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 1,0,0,0,1,0,1,1,1,0,0,0,0,0,0,0, 1,0,1,1,1,0,1,1,0,0,1,1,0,0,1,1, 0,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0, 0,0,0,1,0,0,1,1,1,1,0,1,0,0,0,1, 0,0,0,0,0,0,0,0,1,1,0,1,0,0,0,1, 1,1,0,0,1,0,0,0,0,1,1,1,0,0,1,1, 0,0,0,1,0,0,1,1,0,0,0,0,0,0,0,0, 0,0,0,0,0,1,1,1,1,1,1,1,0,0,1,1, 1,1,0,0,1,1,0,0,1,1,1,1,0,0,1,1, 1,1,0,0,1,1,0,0};//索引表unsigned char p0, p1, p2, p3, p4, p5, p6, p7;unsigned char *pmid, *pmidtemp;unsigned char sum;int changed;bool bStart = true;lLength = lWidth * lHeight;unsigned char *pTemp = (unsigned char *)malloc(sizeof(unsigned char) * lWidth * lHeight);// P0 P1 P2// P7 P3// P6 P5 P4while(bStart){bStart = false;changed = 0;//首先求边缘点(并行)pmid = (unsigned char *)lpDIBBits + lWidth + 1;memset(pTemp, (BYTE) 0, lLength);pmidtemp = (unsigned char *)pTemp + lWidth + 1; for(i = 1; i < lHeight -1; i++){for(j = 1; j < lWidth - 1; j++){if( *pmid == 0){pmid++;pmidtemp++;continue;}p3 = *(pmid + 1);p2 = *(pmid + 1 - lWidth);p1 = *(pmid - lWidth);p0 = *(pmid - lWidth -1);p7 = *(pmid - 1);p6 = *(pmid + lWidth - 1);p5 = *(pmid + lWidth);p4 = *(pmid + lWidth + 1);sum = p0 & p1 & p2 & p3 & p4 & p5 & p6 & p7; if(sum == 0){*pmidtemp = 1;}pmid++;pmidtemp++;}pmid++;pmid++;pmidtemp++;pmidtemp++;}//现在开始串行删除pmid = (unsigned char *)lpDIBBits + lWidth + 1;pmidtemp = (unsigned char *)pTemp + lWidth + 1;for(i = 1; i < lHeight -1; i++){for(j = 1; j < lWidth - 1; j++){if( *pmidtemp == 0){pmid++;pmidtemp++;continue;}p3 = *(pmid + 1);p2 = *(pmid + 1 - lWidth);p1 = *(pmid - lWidth);p0 = *(pmid - lWidth -1);p7 = *(pmid - 1);p6 = *(pmid + lWidth - 1);p5 = *(pmid + lWidth);p4 = *(pmid + lWidth + 1);p1 *= 2;p2 *= 4;p3 *= 8;p4 *= 16;p5 *= 32;p6 *= 64;p7 *= 128;sum = p0 | p1 | p2 | p3 | p4 | p5 | p6 | p7;if(deletemark[sum] == 1){*pmid = 0;bStart = true;}pmid++;pmidtemp++;}pmid++;pmid++;pmidtemp++;pmidtemp++;}}return true;}上一篇:VC++ 实现GPS全球定位系统定位数据的提取下一篇:Visual C++ 实现数字图像增强处理[上一篇] [下一篇] (mtjs的分类目录 [C++])相关文章c和c#托管与非托管代码中变量对应 - DotNet男孩社区-提供大量.Net技术文章,DotNet技术讨论区 - powered by Huobazi~2005-12-22 kenwang多个 ds18b20 C51程序 - 博客 BLOG 我的世界我的??...2008-11-19 susfly内存对齐2006-08-07 thunder123函数指针的几种不同用法2005-07-29 accesine位域排序 struct endian - 半天月·随笔 || 拾遗 -CSDNBlog2008-09-27 ShaneWua.out文件格式分析2008-03-13 redmice全面整理的C++面试题 - ljzcome的专栏2006-01-10 firedragon飞阳的半亩实验田2007-04-24 ShangShujie查看更多文章>>发送评论时内容自动复制到剪切板。
自顶向下,逐步细化算法
使用自顶向下,逐步细化方法设计算法,完成下列任务:(1)产生一个10*10的二维随机整数方正,先求出每一行的最大值和每一列的最小值;(2)然后求10个最大值的最小值,10个最小值的最大值;(3)最后求这两个数之差的平方。
#include<iostream.h>
couபைடு நூலகம்<<"两数之差的平方:"<<t<<endl;
}
}
cout<<endl;
}
//////////////////每行的最大值
int max[10],min[10],t; /////定义每行的最大值,每行最小值
for(i=0;i<10;i++)
{
max[i]=a[i][0];
for (int j=1;j<10;j++)
if(a[i][j]>max[i])
#include<stdlib.h>
void main()
{
int a[10][10];
for(int i=0;i<10;i++)
{
for(int j=0;j<10;j++)
{a[i][j]=rand()%100+1;///随机产生100个数以10*10的形式输出
cout<<a[i][j]<<" ";
max[i]=a[i][j];
cout<<"第"<<i+1<<"行的最大值是"<<max[i]<<".\n";/////输出每行最大值
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
汇报人:马文书
目录
标题一 细化算法的定义 标题二 常用细化算法的分类 标题三 细化算法的挑选
细化算法的定义
细化:又称骨架化,即在不影响原图像拓扑连接关系的条件下,尽可能 用最少的迭代次数,快速准确地将宽度大于一个像素的图形线条转变为 一个像素宽线条的处理过程,也就是抽取像素的骨架 成为好的细化算法的要求: (1)细化图像的连通性必须与原图像保持一致; (2)细化图像中的线条宽度应为1pixel; (3)细化图像中的线条应尽可能是中心线; (4)细化后图像应尽可能保持原图的细节特征; (5)细化算法的速度尽可能快。
P4
P3
P2
P5
P
P1
P6
P7
P8
④p3=1或X(p)3=1; ⑤p5=1或X(p)5=1。 其中:∑4(p)表示p的4个邻域内黑像素的个数,∑8(p)表示p的8邻域内黑 像素的个数, X(p)为连接数,X(p)3为假定P3=0时p的连接数,X(p)5=1为假定 p5=0时的连接数
HILDITCH的细化算法
(1)定义:它是一种经典的,充分 利用连接数的基本串行算法。 (2)步骤: 用图1所示的一个模板,沿着扫描方 向移动,逐点考察各像素的邻域状况, 在保持条纹连接性不变的情况下,逐 层删除条纹上轮廓像素,直到条纹为 一个像素的线条。 在此算法中,当被检测的目标像素满 足下列所有条件,才可删除像素: ①∑4(p)≤3,即p点的4-邻域至 少有一个值为0; ②X(p)=1;边缘点 ③∑8(p)≥1;非端点
(3)p2×p4×p6=0; (4)p4×p6×p8=0; 其中N(p1)是p1的非零临点的个数,S(p1)是以p2,p3,....p9为序时这 些点的至从0到1变化的次数,当所有边界点都检验完毕后,会把所有标 记的点除去。 其次需要满足条件 (1)2≤N(p1)≤6; (2)S(p1)=1; (3)p2×p4×p8=0; (4)p2×p6×p8=0; 同样当对所有边界点都检查完毕后,将所有标记的点除去。
常用细化算法的分类
常用细化算法的分类 (1)OPTA细化算法 (2)Hilditch的细化算法 (3)SPTA细化算法 (4)zhang细化算法
OPTA细化算法
(1)定义:它是一种典型的基于模板的图像细化 算法 (2)核心:通过应用消除和保留两套模板,来达 到对图像细化的目的 (3)算法过程: ①对图像中的当前像素点,将其与图1所示的消除 模板进行匹配,若满足消除模板中的某一个,则 转到步骤②,否则转至步骤③; ②将其与图2的保留模板进行匹配。若满足保留模 板中的某一个,则保留该点,转至步骤①;否则 删除该点,转至步骤①; ③保留该点,转至步骤①; ④不断重复步骤①,②,③,直至对一张图中所 有点扫描完毕,转至步骤⑤;
n6
n7
SPTA细化算法优缺点
SPTA细化算法 优点:它代表了笔划的中轴线且保持了连续性 缺点:它需要分四次扫描进行,速度较慢,而且SPTA也难于克服45度 交叉畸变的问题
ZHANG快速并行细化法 (1)zhang细化算法的原理 原理--设已知目标点为1,背景点标记为0。定义边界点本身标记为1而 其8-连通邻域中至少有一个标记为0的点。 (2Байду номын сангаасzhang细化算法的具体步骤 (一)考虑以边界点为中心的8-邻域,记中心为点p1,其邻域的8个点顺 时针绕中心点分别标记为p2,p3,.......p9,具体如图 首先需要边界点满足: (1)2≤N(p1)≤6; (2)S(p1)=1;
0 x x 1 x 图1 OPTA消除模板 0 1 1 0 1 1 1 x
0
0
x
图2 OPTA 保留模板 x x 0 x x 1 x x 1 x x 0 x x x x 0 1 1 0 x x x x
OPTA细化算法
OPTA细化算法的优缺点: 优点:能保持原图的拓扑性 缺点:细化后的图像扭曲较大,不仅毛刺较多,不够光滑,而且在三角 点处有时不能完全细化
SPTA细化算法步骤
对右边界的点,就是符合图3(a)模板的p点,即 n4· p· n0=1的p点,若式(a)为0,则为安全点。 布尔表达式中相应像素为黑且未被标记的点的布 尔量为1,否则为0. 同理,对左、上、下边界点的表达式分别如上面 的式(2)、(3)、(4)。
n3
n2
n1
n4
p
n0
n5
⑤判断在上一次扫描过程中,有无点被删除(即图像 有没有被进一步细化),若有,则转入步骤①,进行 下一次扫描;否则细化结束。 0 1 x x 1 x 0 1 1 0 1 1 0 1 x 0 0 x 0 0 0 0 x 1 1 1 x 1 x x 1 x 1 1 1 x 0 0 x 1 x x 1 x 1 1 1 1 1 0 0 0 0 x 0 0
以上两步被称为迭子代,当没有点再 满足条件时,剩下的点组成了区域的 骨架
(3)zhang细化算法优缺点 优点:具有速度快和保持细化后曲线的连通性
p9
p2
p3
p8
p1
p4
缺点:不能保证细化后曲线为单像素,给找细分 叉带来困难
p7
p6
p5
细化算法的挑选
通过对四种常用的算法比较,得出在干涉图像处理过程中选择zhang细化算 法, 采用逻辑算术运算进行删除判断,使其迭子代数大大减小而且执行速度快。
Hilditch细化算法的优缺点 优点:细化算法效果好
缺点:运算量大,有一些分支、处理速度慢,在实际应用中难以满足实时处理 的要求。
SPTA细化算法
SPTA细化算法一般需要经过数轮相同的检查过程,每一轮都由2次扫描组 成,每次扫描检查图像的每个像素。扫描过程可以是逐行的,也可以是 逐列的。第一次扫描检查所有的左、右边缘点,如果是非安全点则被标 记;第二次扫描检查所有的上、下边缘点,如果是非安全点则被标记。 当结束一轮扫描后,没有一点被标记,则删除所有被标记的点,算法结 束,否则进入下一轮扫描。 算法: S0=n4(n5+n6+n2+n3)(n0+n1')(n4+n3') S4=n0(n1+n2+n6+n7)(n2+n3')(n6+n5') S2=n6(n7+n0+n4+n5)(n0+n1')(n4+n3') S6=n2(n3+n4+n0+n1)(n4+n5')(n0+n7')其中’‘'’=‘ ▔’