-
2021-12-11 19:45:00
区域合并
区域合并方法将合并具有相似性的相邻区域。
步骤如下:
(1)图像初始区域分割:在极端情况下,可以认为每个像素为一个小区域。
(2)确定相似性准则:可以基于相邻区域的灰度、颜色、纹理等参量来比较。
(3)判断图像中的相邻区域是否满足相似性准则,相似则合并,不断重复,直到没有区域可以合并为止。这里Python实现:
1、合并相邻相似区域
初始情况:认为每个像素为一个小区域;
确定相似性准则:相邻区域最小像素差小于等于某个阈值,若满足则合并,即给当前点赋予对应的邻点的区域标签;否则赋予一个新的区域标签。
(为了方便:
相邻区域:左上、上、右上、左
从左到右,从上到下,对每个像素进行判断。)
2、分为n块区域
计算每个区域的像素均值;
将最小值和最大值之间平均分为n个区间;(这里存在一些问题:可能不符合图像的特征;可能有的bin为空,使实际分出的区域数小于n。)
每个区间对应一个新的区域。import numpy as np import matplotlib.pyplot as plt import matplotlib.image as mpimg
# 1、区域合并算法(合并相邻,相似区域) # 初始情况:每个像素都是一块小区域 # 相似性准则:相邻区域灰度均值差小于等于diff # 将左上角第一个点的区域设为1,其余为0,表示未标记;从左到右、从上到下循环判断图像中的点,判断每一点 # 与其左上、上、右上、左邻点的灰度距离;4个距离中最小的若符合合并规则,将对应邻点的标记赋予当前点; # 若没有相似的点,则赋予当前点新的标记 def CreateRegions(Image,diff,neighbors=[[-1,-1],[-1,0],[-1,1],[0,-1]]): ''' 将每个像素视为一个区域,从左到右,从上到下依次进行区域合并 Parameters ---------- Image : array 2D-array Image. neighbors : list default : Upper left,upper middle,upper right,left diff : int The threshold of merging. If the difference<= diff, then merge the regions. Returns ------- Region array. region_number ''' # 图像的高和宽 height = len(Image) width = len(Image[0]) # 创建并初始化Region array,0表示未标记 Region = np.zeros([height,width]) # 对左上角元素标记为区域1 Region[0,0] = 1 # 目前只存在一个区域 region_number = 1 # 从左到右,从上到下,依次判断 for j in range(1,height): for i in range(1,width): min_dist = 256 # 初始化当前像素和邻域像素的最小灰度距离和索引 min_index = -1 # 计算当前点与邻点之间的灰度差,并找出最小的 for k in range(len(neighbors)): y = j + neighbors[k][0] x = i + neighbors[k][1] if(y>=0 and y<height and x>=0 and x<width): # 判断邻点是否合法,合法则计算灰度差 difference = abs(Image[j,i] - Image[y,x]) if(difference < min_dist): min_dist = difference min_index = k # 判断最小灰度差是否满足合并条件,满足,则赋予相同标签;否则创建新的标签 if(min_dist <= diff): Region[j,i] = Region[j+neighbors[min_index][0],i+neighbors[min_index][1]] else: Region[j,i] = region_number region_number += 1 return Region,region_number
# 2、合并为n块区域 # 按灰度值合并区域:计算区域的灰度均值;排序;然后将其分为new_num个区间,作为新的合并区域的分组 def MergeRegion(Image,Region,old_num,new_num): ''' Merge the regions which have a similar grayvalue. Parameters ---------- Image : array 2D image. Region : array 2D region array. old_num : int Origianl number of regions. new_num : int The number of regions you hope to get. Returns ------- Region1. region1_num ''' # 计算每个区域对应图像的灰度的均值 regions_mean = [] for i in range(1,old_num+1): # 注意从1开始为合法区域 regions_mean.append(np.mean(Image[np.where(Region==i)])) # 索引从0开始 # 排序,按平均灰度分组 # 虽然我觉得可能不太合理,但暂时想不出更好的方法,有待改进; # 因为可能有的区间为空,且可能不符合图像的特征情况 regions_mean_min = min(regions_mean) regions_mean_max = max(regions_mean) bin_length = (regions_mean_max - regions_mean_min) / new_num # 区间的长度 regions_list = list(range(1,old_num)) # 区域的标记 zipr = zip(regions_mean,regions_list) # zip ziprs = sorted(zipr) # 排序 # 新的区域 height = len(Image) width = len(Image[0]) Region1 = np.zeros([height,width]) end_value = regions_mean_min + bin_length region1_num = 1 for r in ziprs: value = r[0] ri = r[1] if(value <= end_value): Region1[np.where(Region==ri)] = region1_num continue else: while(value > end_value): end_value += bin_length region1_num += 1 Region1[np.where(Region==ri)] = region1_num return Region1,region1_num
# 读取图像(这种方法读出来就是array类型)(高、宽、色彩) Image = mpimg.imread('C:/Users/Jichen/Downloads/lotus.jpg') height = len(Image) width = len(Image[0]) color = len(Image[0][0]) # 获取红色通道的值(RGB) Redpath = np.zeros([height,width]) for i in range(height): for j in range(width): Redpath[i][j] = Image[i][j][1] plt.subplot(131) plt.imshow(Redpath) # 将每个像素作为初始区域,区域合并 region,region_num = CreateRegions(Redpath, 10) plt.subplot(132) plt.imshow(region) print('the number of old regions: ',region_num) # 按灰度分成4个区域 hope_new_num = 4 region1,region1_num = MergeRegion(Redpath, region, region_num, hope_new_num) plt.subplot(133) plt.imshow(region1) print('the number of new regions: ',region1_num)
结果:
the number of old regions: 5817
the number of new regions: 4更多相关内容 -
基于openCV的识别特定颜色区域
2016-06-30 17:36:47通过编程识别特定的颜色区域,并进行圈定。 -
2018年最新全国省市区以及行政区域代码excel
2018-08-15 23:07:382018全国最新省市区信息EXCEL表,包含行政区域代码,方便数据库导入 -
MySql全国行政区域表sql 一张表
2016-07-04 09:22:35MySql全国行政区域表sql 一张表 -
华为 OSPF特殊区域
2020-06-01 10:46:02(静 稳 忙 忍)!我个人理解为以下意思: 静:静的一半需要“争”;稳:稳的一半需要“急”,这里的急是指行动上;忙:忙的一半是不能急躁,做事要脚踏...一、概括 二、拓扑 三、配置与分析 四、总结 五、OSPF特殊区域师傅送给我的四个字(静 稳 忙 忍)!我个人理解为以下意思:
静:静的一半需要“争”;稳:稳的一半需要“急”,这里的急是指行动上;忙:忙的一半是不能急躁,做事要脚踏实地,找到目标之后要提高专注力、要专一,要努力;忙字的一半是亡,如果同时做很多事,长期以往的话会导致你注意力分散,而且很难取得好成果,最终会耗神又耗力,甚至是信心丧失,它就灭亡了。忍:上部分是心上的一把刀,想要成大事者需要耐得住寂寞,否则心上的那把刀会掉下来刺到自己。(与原意有出入)一、概括
掌握ospf的特殊区域就是用来隔离LSA不同的特殊区域多lsa的隔离程度不一致,要明白做lsa的隔离必然导致一部分路由学不到,为了不影响正常的网络访问,在特殊区域的abr都会下发默认路由来实现不同区域的互访。
STUB的作用:本区域的ABR将隔离4类和5类LSA,减轻本区域LSDB的大小。
Totally Stub的作用:完全末梢区域同时隔离3 4 5 类LSA,在完全末梢区域只有1类和2类LSA及一条用做缺省路由的3类LSA。
Totally Stub注意:Totally Stub区域的成员按照stub配置即可,只是在ABR配置stub no-summary使得本区域的ABR不再向本区域的成员泛洪3 4 5类LSA。
NSSA的作用:本区域的ABR将隔离4类和5类LSA,减轻本区域LSDB的大小,同时本区域的ASBR生成7类LSA,用来向区域成员通告外部路由。
Totally NSSA作用:隔绝 3 4 5 类LSA。
Totally NSSA完全末梢穿越区域。
二、拓扑
三、配置与分析
1、基础配置
(1)如图配置各设备的系统名称及接口地址,创建换回口 0 例如AR-1 loopback 0—1.1.1.1/32
(2)手动指定ospf设备的路由器ID。
(3)实现全网互相通。
AR-2 <Huawei>system-view [Huawei]sysname AR-2 [AR-2]int g0/0/2 [AR-2-GigabitEthernet0/0/2]ip address 23.1.1.2 24 [AR-2-GigabitEthernet0/0/2]int g0/0/1 [AR-2-GigabitEthernet0/0/1]ip address 12.1.1.2 24 [AR-2-GigabitEthernet0/0/1]int g0/0/0 [AR-2-GigabitEthernet0/0/0]ip address 27.1.1.2 24 [AR-2-GigabitEthernet0/0/0]int l0 [AR-2-LoopBack0]ip address 2.2.2.2 32 [AR-2]ospf 1 router-id 2.2.2.2 [AR-2-ospf-1]a 0 [AR-2-ospf-1-area-0.0.0.0]net 12.1.1.2 0.0.0.0 [AR-2-ospf-1-area-0.0.0.0]net 2.2.2.2 0.0.0.0 [AR-2-ospf-1-area-0.0.0.0]net 23.1.1.2 0.0.0.0 [AR-2-ospf-1-area-0.0.0.0]a 3 [AR-2-ospf-1-area-0.0.0.3]net 27.1.1.2 0.0.0.0
其他基础配置类似
AR-6 ping 78.1.1.8
2、策略需求(1)区域1是这ospf网络的“老旧”区域,此区域设备老旧性能底下且不会再连接任何外部网络;要求管理员需要对此区域OSPF的数据库优化以减轻此区域设备运行OSPF协议带来的压力,同时确保此区域成员访问OSPF络时有最优路径配置成stub区域后,该区域内的路由器将不会接收区域外部路由,且ABR会在该区域中通告一条缺省路由,以供其访问区域外网络。
AR1、AR4、AR5、AR3的stub区域配置一样 [AR-6]ospf 1 [AR-6-ospf-1]a 1 [AR-6-ospf-1-area-0.0.0.1]stub //配置 Stub 区域
dis ospf lsdb
AR-5的LSDB中,已经没有任何Type-5 LSA及Type-4 LSA条目,并且多了两条Type-3 LSA(Sum-Net LSA),这两条Type-3 LSA的LinkState ID为0.0.0.0说明表示的是缺省路由的LAS,通告路由器分别是AR1、AR3。然而,在路由器AR5等的LSDB后发现,LSDB 中存在着一些 Type-3LSA,即维护着一些域间路由信息。随着今后企业的发展,网络的扩容,这些Type-3 LSA的数量将大量增加,但本身人没有什么用处,从而成为路由器的不必要的负拍。所以将其配置成为Totally Stub 区域,及禁止Type-3LSA进入该区域。
AR1、AR4、AR5、AR3的stub区域配置一样 [AR-5]ospf [AR-5-ospf-1]a 1 [AR-5-ospf-1-area-0.0.0.1]stub no-summary //配置Totally Stub 区域
dis ospf lsdb
可以看到AR5的LSDB中只有两条表示缺省路由的Type-3 LSA ,没有任何其他Type-3 LSA ,路由表中也不存在任何域间路由,只有一条缺省路由。dis ip routing-table
(2)区域3同属于此OSPF网络的“老旧”区域,需要管理员对此OSPF区域的数据库做最大化的优化,无需考虑最优路径同时要确保此区域身后的外部网络可以被 OSPF的其他区域成员正常访问;
由于区域1存在ASBR,如果配置为Stub区域,则将导致与外部网络无法正常通信,因此决定配置为NSSA区域。注意,在配置NSSA区域时,需要将区域内的所有路由器都配置为NSSA区域路由器,否则路由器之间无法形成邻居关系。[AR-2]ospf 1 [AR-2-ospf-1]area 3 [AR-2-ospf-1-area-0.0.0.3]nssa [AR-7]ospf 1 [AR-7-ospf-1]a 3 [AR-7-ospf-1-area-0.0.0.3]nssa //配置nssa区域
dis ospf lsdb
已经没有任何Type-4LAS及Type-5LAS,但是出现一条LinkState ID 为0.0.0.0的Type-7LAS。使用nssa no-summary命令还可以进一步阻止Type-3 LSA 泛洪到NSSA区域,使之成为一个Totally NSSA区域 。
AR-7
[AR-7]ospf 1 [AR-7-ospf-1]a 3 [AR-7-ospf-1-area-0.0.0.3]nssa no-summary //配置Totally NSSA区域 AR2类似 [AR-7]rip 1 [AR-7-rip-1]default-route originate //导入默认路由
dis ospf lsdb
四、总结
AR-4路由表截图,dis cu se ospf查看信息的截图
AR-2的dis cu se ospf信息的截图
总结7类LSA的内容,作用及执行7转5动作的设备Type7 LSA
Type7 LSA是为了支持NSSA区域而新增的一种LSA类型,用于描述引入的外部路 由信息。
Type7 LSA由NSSA区域的自治域边界路由器(ASBR)产生,其扩散范围仅限于 ASBR所在的NSSA区域。
NSSA区域的区域边界路由器(ABR)收到Type7 LSA时,会有选择地将其转化为Type5 LSA,以便将外部路由信息通告到OSPF网络的其它区域。
Type7 LSA 转化为 Type5 LSA
为了将NSSA区域引入的外部路由发布到其它区域,需要把Type7 LSA转化为Type5LSA以便在整个OSPF网络中通告。
P-bit(Propagate bit)用于告知转化路由器该条Type7 LSA是否需要转化。
缺省情况下,转换路由器的是NSSA区域中Router ID最大的区域边界路由器(ABR)。
只有P-bit置位并且FA(Forwarding Address)不为0的Type7 LSA才能转化为Type5LSA。FA用来表示发送的某个目的地址的报文将被转发到FA所指定的地址。
区域边界路由器产生的Type7 LSA不会置位P-bit。
五、OSPF特殊区域
在OSPF中,除了Stub,Totally Stub,NSSA,Totally NSSA;其他区域通常为普通区域(包括AREA 0骨干区域)
1、Stub-末节区域
与AS外部没有太多路由通信失误边缘区域;过滤Type4 LSA和Type5 LSA,减少边界路由器的压力。
(1)放行LSA:Type1 LSA;Type2 LSA(仅广播网拥有此类LSA);Type3 LSA
(2)拒绝LSA:Type4 LSA;Type5 LSA;Type7 LSA2、Totally Stub-完全末节区域
同样处于AS边缘;且只有一个连接其他区域的ABR,没有ASBR;没有虚连接穿越非骨干区域。
(1)放行LSA:Type1 LSA;Type2 LSA(仅广播网拥有此类LSA)
(2)拒绝LSA:Type3 LSA;Type4 LSA;Type5 LSA;Type7 LSA3、NSSA----Not-So-Stubby Area,非纯末梢区域
(1)可以位于非边缘区域,可以有多个ABR,可以有一个或多个ASBR;将ASBR引入的外部路由以Type7 LSA进入NSSA区域并在本NSSA区域泛洪,然后在ABR上转换为Type5 LSA后以自己的身份发布到区域外
(2)放行LSA:Type1 LSA;Type2 LSA(仅广播网拥有此类LSA);Type3 LSA
(3)拒绝LSA:Type4 LSA;Type5 LSA4、Totally NSSA完全非纯末梢区域
(1)可以位于非边缘区域,可以有多个ABR,可以有一个或多个ASBR;将ASBR引入的外部路由以Type7 LSA进入NSSA区域并在本NSSA区域泛洪,然后在ABR上转换为Type5 LSA后以自己的身份发布到区域外
(2)放行LSA:Type1 LSA;Type2 LSA(仅广播网拥有此类LSA)
(3)拒绝LSA:Type3 LSA;Type4 LSA;Type5 LSA本人所有文章都受版权保护,著作权归艺博东所有!未经授权,转载必究或附上其原创链接。
-
基于区域分割(图像分割)
2021-02-11 22:29:061. 区域生长区域增长方法是根据同一物体区域内象素的相似性质来聚集象素点的方法,从初始区域(如小邻域或甚至于每个象素)开始,将相邻的具有同样性质的象素或其它区域归并到目前的区域中从而逐步增长区域,直至没有...1. 区域生长
区域增长方法是根据同一物体区域内象素的相似性质来聚集象素点的方法,从初始区域(如小邻域或甚至于每个象素)开始,将相邻的具有同样性质的象素或其它区域归并到目前的区域中从而逐步增长区域,直至没有可以归并的点或其它小区域为止。区域内象素的相似性度量可以包括平均灰度值、纹理、颜色等信息。
区域增长方法是一种比较普遍的方法,在没有先验知识可以利用时,可以取得最佳的性能,可以用来分割比较复杂的图象,如自然景物。但是,区域增长方法是一种迭代的方法,空间和时间开销都比较大。
区域生长是一种串行区域分割的图像分割方法。区域生长是指从某个像素出发,按照一定的准则,逐步加入邻近像素,当满足一定的条件时,区域生长终止。区域生长的好坏决定于1.初始点(种子点)的选取。2.生长准则。3.终止条件。区域生长是从某个或者某些像素点出发,最后得到整个区域,进而实现目标的提取。
区域生长的原理
区域生长的基本思想是将具有相似性质的像素集合起来构成区域。具体先对每个需要分割的区域找一个种子像素作为生长起点,然后将种子像素和周围邻域中与种子像素有相同或相似性质的像素(根据某种事先确定的生长或相似准则来判定)合并到种子像素所在的区域中。将这些新像素当作新的种子继续上面的过程,直到没有满足条件的像素可被包括进来。这样一个区域就生长成了。
图1给出已知种子点进行区域生长的一个示例。图1(a)给出需要分割的图像,设已知两个种子像素(标为深浅不同的灰色方块),现要进行区域生长。设这里采用的判定准则是:如果考虑的像素与种子像素灰度值差的绝对值小于某个门限T,则将该像素包括进种子像素所在的区域。图1(b)给出了T=3时的区域生长结果,整幅图被较好地分成2个区域;图1(c)给出了T=1时的区域生长结果,有些像素无法判定;图1(c)给出了T=6时的区域生长的结果,整幅图都被分在一个区域中了。由此可见门限的选择是很重要的。
区域生长是一种古老的图像分割方法,最早的区域生长图像分割方法是由Levine等人提出的。该方法一般有两种方式,一种是先给定图像中要分割的目标物体内????的一个小块或者说种子区域(seed
point),再在种子区域基础上不断将其周围的像素点以一定的规则加入其中,达到最终将代表该物体的所有像素点结合成一个区域的目的;另一种是先将图像分割成很多的一致性较强,如区域内像素灰度值相同的小区域,再按一定的规则将小区域融合成大区域,达到分割图像的目的,典型的区域生长法如T. C. Pong等人提出的基于小面(facet)模型的区域生长法,区域生长法固有的缺点是往往会造成过度分割,即将图像分割成过多的区域
区域生长实现的步骤如下:
1. 对图像顺序扫描!找到第1个还没有归属的像素, 设该像素为(x0, y0);
2. 以(x0, y0)为中心, 考虑(x0, y0)的4邻域像素(x,
y)如果(x0,
y0)满足生长准则, 将(x,
y)与(x0, y0)合并(在同一区域内), 同时将(x, y)压入堆栈;
3. 从堆栈中取出一个像素, 把它当作(x0, y0)返回到步骤2;
4. 当堆栈为空时!返回到步骤1;
5. 重复步骤1 - 4直到图像中的每个点都有归属时。生长结束。
mean
shift算法
1. 简介
Mean Shift算法本质上是最优化理论中的最速下降法(亦称梯度下降法,牛顿法等),即沿着梯度下降方法寻找目标函数的极值。在跟踪中,就是为了寻找到相似度值最大的候选目标位置。
2. 算法的基本思想
那么,它究竟是如何来寻找这样的相似度最大位置(最佳匹配区域)?
我们知道从初始目标区域提取的特征,对于下一个的视频而言,其上任意位置都可以圈定出一个与初始化目标区域相同大小的区域,并提取该区域的颜色直方图特征与初始化目标区域提取的颜色直方图特征进行匹配,计算得到两个特征之间的相似度。由此,可以得到一个由特征匹配程度构成的一个相似度概率密度分布图我们真正需要寻找的就是该概率密度分布图上的最大值(与初始目标特征最相似的位置)。
Mean
Shift方法就是沿着概率密度的梯度方向进行迭代移动,最终达到密度分布的最值位置。其迭代过程本质上是的最速下降法,下降方向为一阶梯度方向,步长为固定值。但是,Mean
Shift没有直接求取下降方向和步长,它通过模型的相似度匹配函数的一阶Talor展开式进行近似,直接推到迭代的下一个位置。由此,沿着梯度方向不断迭代收敛到目标相似度概率目标分布的局部极大值。
3. 算法特点
实际中,我们不可能去求取下一帧中所有位置的相似度。Mean
Shift是在不知道该概率密度分布的条件下,使用迭代过程中每次选定的目标区域的局部密度特征来进行迭代的,因此,它寻找的是目标的局部极大值。这就导致目标运动过快或背景过于复杂时,迭代寻找的局部极值并不是目标在下一帧中的最佳匹配位置。另外,Mean
Shift作为最速下降法的一种,它的收敛速度并不快,且在接近最优值时,存在锯齿现象。
4. 图示解释
解释:图中加入蓝色区域为设定的目标基础区域大小,且蓝色中心为原始位置。当下一帧图像来时,搜索局部区域内的目标点。通常这个目
标点是与区域内各点的权重有关系的。权重关系当然是离中心越近权重越大,越远权重越小。
5. 例子解析
本人文章中有一个Mean Shift 的简单类。基于统计的目标直方图进行视频跟踪。
(1)因为目标直方图具有特征稳定,抗部分遮挡,计算方法简单和计算量小的特点。所以基于Mean Shift
的跟踪一般采用直方图对目标进行建模,然后通过相似度量,最终实现目标的匹配和跟踪。
(2)MeanShift
算法是通过人机交互的方式对被跟踪目标进行初始化。起始帧,手动确定一个目标特征的区域,称为被跟踪目标的目标区域,这个目标区域也是核函数作用区域,区域的大小等于核函数的带宽(或“尺度”)。
假定我们在彩色视频序列图像中跟踪目标,则图像的值域是RGB颜色空间,按照直方图的方式将RGB颜色空间中的每个子空间中R,G或B空间分成K个相等区间,将每个区间称为一个bin,构成特征空间,特征空间的特征值的个数为m=
k^3。
在以后每帧图像中可能存在目标的候选区域中对特征空间的每个特征值的计算称为候选模型的描述。一般选高斯函数或Uniform核函数。通过相似性函数度量初始帧目标模型和当前帧的候选模型的相似性,通过求相似性函数最大得到关于目标的MeanShift向量,这个向量即是目标从初始位置向正确位置转移的向量,由于MeanShift算法的收敛性,不断迭代计算MeanShift向量,在当前帧中,最终目标会收敛到目标的真实位置(可以用一个小阈值判定),从而达到跟踪的目的。
2. 区域分裂合并
区域分裂合并算法的基本思想是先确定一个分裂合并的准则,即区域特征一致性的测度,当图像中某个区域的特征不一致时就将该区域分裂成4 个相等的子区域,当相邻的子区域满足一致性特征时则将它们合成一个大区域,直至所有区域不再满足分裂合并的条件为止. 当分裂到不能再分的情况时,分裂结束,然后它将查找相邻区域有没有相似的特征,如果有就将相似区域进行合并,最后达到分割的作用。
在一定程度上区域生长和区域分裂合并算法有异曲同工之妙,互相促进相辅相成的,区域分裂到极致就是分割成单一像素点,然后按照一定的测量准则进行合并,在一定程度上可以认为是单一像素点的区域生长方法。
区域生长比区域分裂合并的方法节省了分裂的过程,而区域分裂合并的方法可以在较大的一个相似区域基础上再进行相似合并,而区域生长只能从单一像素点出发进行生长(合并)。
反复进行拆分和聚合以满足限制条件的算法。
令R表示整幅图像区域并选择一个谓词P。对R进行分割的一种方法是反复将分割得到的结果图像再次分为四个区域,直到对任何区域Ri,有P(Ri)=TRUE。这里是从整幅图像开始。如果P(R)=FALSE,就将图像分割为4个区域。对任何区域如果P的值是FALSE.就将这4个区域的每个区域再次分别分为4个区域,如此不断继续下去。这种特殊的分割技术用所谓的四叉树形式表示最为方便(就是说,每个非叶子节点正好有4个子树),这正如图10.42中说明的树那样。注意,树的根对应于整幅图像,每个节点对应于划分的子部分。此时,只有R4进行了进一步的再细分。
如果只使用拆分,最后的分区可能会包含具有相同性质的相邻区域。这种缺陷可以通过进行拆分的同时也允许进行区域聚合来得到矫正。就是说,只有在P(Rj∪Rk)=TRUE时,两个相邻的区域Rj和Rk才能聚合。
前面的讨论可以总结为如下过程。在反复操作的每一步,我们需要做:
l.对于任何区域Ri,如果P(Ri)=FALSE,就将每个区域都拆分为4个相连的象限区域。
2.将P(Rj∪Rk)=TRUE的任意两个相邻区域Rj和Rk进行聚合。
3.当再无法进行聚合或拆分时操作停止。
可以对前面讲述的基本思想进行几种变化。例如,一种可能的变化是开始时将图像拆分为一组图象块。然后对每个块进一步进行上述拆分,但聚合操作开始时受只能将4个块并为一组的限制。这4个块是四叉树表示法中节点的后代且都满足谓词P。当不能再进行此类聚合时,这个过程终止于满足步骤2的最后的区域聚合。在这种情况下,聚合的区域可能会大小不同。这种方法的主要优点是对于拆分和聚合都使用同样的四叉树,直到聚合的最后一步。
例10.17
拆分和聚合
图10.43(a)显示了一幅简单的图像。如果在区域Ri内至少有80%的像素具有zj-mi≤2σi的性质,就定义P(Ri)=TRUE,这里zj是Ri内第j个像素的灰度级,mi是区域Ri的灰度级均值,σi是区域Ri内的灰度级的标准差。如果在此条件下,P(Ri)=TRUE,则设置Ri内的所有像素的值等于mi。拆分和聚合使用前速算法的要点完成。将这种技术应用于图10.43(a)所得结果示于图10.43(b)。请注意,图像分割效果相当好。示于图10.43(c)中的图像是通过对图10.43(a)进行门限处理得到的,门限值选在直方图中两个主要的尖峰之间的中点。经过门限处理,图像中生成的阴影(和叶子的茎)被错误地消除了。
如前面的例子中所使用的属性那样,我们试图使用基于区域中像素的均值和标准差的某些特性对区域的纹理进行量化(见11.3.3节中关于纹理的讨论)。纹理分割的概念是以在谓词P(Ri)中使用有关纹理的量度为基础的。就是说,通过指定基于纹理内容的谓词,我们可以使用本节中讨论的任何方法进行纹理分割。
1.
把一幅图像分成4份,计算每一份图像的最大灰度值与最小灰度值的差,
如果差在误差范围值外,则该份图像继续分裂。
2.
对于那些不需要分裂的那些份图像可以对其进行阈值切割了,例如某一块图像的最大灰度大于某个值,则该块图像变成255,否则变为0。
-
OpenCV文字区域定位
2014-07-19 00:12:44利用OpenCV进行图片文字区域的定位和检测 -
5、区域特征分析和区域提取
2020-03-03 10:04:29区域的运算主要包含:区域作差、区域合并、区域集合、区域的选择、区域的填充、区域的骨架等。在项目中,根据实际需要,灵活的选择相应的计算方式。 在Halcon创建两个矩形,作为后面算子测试用: *生成两个矩形...1、区域的运算
在学习特征分析之前,先了解一下几个区域的基本运算方式。
区域的运算主要包含:区域作差、区域合并、区域集合、区域的选择、区域的填充、区域的骨架等。在项目中,根据实际需要,灵活的选择相应的计算方式。
在Halcon创建两个矩形,作为后面算子测试用:
*生成两个矩形区域 gen_rectangle1 (Rectangle1, 123, 196, 186, 356) gen_rectangle1 (Rectangle2, 123+20, 196+20, 186-20, 356-20)
区域作差:将一个区域减去另一个区域,便得到区域的差值。
算子:difference
如:
*两个矩形区域做差 difference (Rectangle1, Rectangle2, RegionDifference)
区域合并(求和):将一个区域和另外一个区域求和,便可以将两个区域合并成一个区域。
算子:union1、union2
如:
*区域的合并,union1是对集合的合并,union2是对区域的加 union2 (RegionDifference, Rectangle2, RegionUnion)
区域集合:将两个或者两个以上的区域放入一个集合中,这个集合称为区域的集合。特别注意的是:在集合中,每个区域都是孤立的,并没有进行合并,要与区域的和进行区分,每一个区域称为一个obj
算子:concat_obj
如:
*两个区域放到一个集合 concat_obj (Rectangle1, Rectangle2, ObjectsConcat)
区域的选择:从区域集合中进行区域的选择。
算子:select_obj。参数3:要选择的区域ID号。
如:
*区域的选择:参数3表示要选择的第几个区域 select_obj (ObjectsConcat, ObjectSelected, 2)
区域的填充:对区域中的孔洞进行封闭,称为孔洞的填充。
算子:fill_up
如:
*区域的填充 fill_up (RegionDifference, RegionFillUp)
区域骨架的求取:区域的骨架可以理解为图像的中轴,骨架求取就是求取区域中轴的过程。
算子:skeleton、fill_up_shape
如:
*区域骨架的求取 skeleton (RegionFillUp1, Skeleton) *指定面积范围的区域的填充:参数4和参数5表示区域面积范围。不在面积范围的不填充 fill_up_shape (RegionDifference, RegionFillUp1, 'area', 1, 10000)
2、区域的特征分析
在学习区域特征分析前,先了自我问一下,为什么要学习区域特征分析。根据前面所讲的,已经能够进行区域的分割和区域的提取了。这是因为,如果我们只想从分割出来的区域中提取指定要求的一个区域,那该如何选择呢?那这就需要给定提取区域的特征来进行提取。所以要对区域的特征分析,要根据每一个区域的特征,选择出我们需要的区域。
常用的区域区域特征:区域的面积、区域的最小外接矩形(长、宽跟角度)、区域的角度、区域的凸性、区域的圆度、区域的最小外接圆大小等。下面来对其进行具体讲解:
首先绘制一个矩形区域,变量名Region。
区域的面积:区域内像素点数量总。
算子:area_center
area_center (Region, Area, Row4, Column4)
区域的最小外接矩形:外接矩形长、宽的一半长、宽半轴,对应的矩形长轴方向称为区域的方向。区域的最小外接矩形,分为两种外接方式,如下图所示
算子:
smallest_rectangle2:最小外接矩形2
smallest_rectangle1:最小外接矩形1
区域的角度:区域的角度就是外接矩形的角度。
区域的凸性:每个区域都存在一个最小的凸性区域,这个区域内的任意位置两点连线都在该区域内,这样的区域称为区域的凸性区域。其中原区域与凸性区域的比值称为区域的凸性,范围0-1.
算子:
shape_trans:将区域转换为凸性区域(凸包)。
convexity:获取区域的凸性值
如:
*凸集转换,'convex'生成凸集,也可以选择生成外接圆 shape_trans (Region, RegionTrans, 'convex') *获取区域的凸性值,值保存在Convexity中。表示的是该区域面积和凸集的比值,范围0-1
区域的圆度:指区域边界是否接近圆形的程度,范围0-1。
算子:circularity
*获取区域的圆度 circularity (Region, Circularity)
区域的外接圆:能够将区域完全包含的圆区域,称为区域的最小外接圆。
算子:
smallest_circle:获取区域的最小外接圆
region_features :获得区域的任意特征
如
*获取区域外接圆 smallest_circle (Region, Row3, Column3, Radius) gen_circle (Circle, Row3, Column3, Radius) *获取区域的特征,比如面积:'area' region_features (Circle, 'area', Value)
3、案例:遥控器上的字符特征提取
经过前面的阈值分割、形态学膨胀腐蚀、区域特征分析、区域运算等学习,利用这些知识可以对一幅图像中指定的区域进行提取出来。比如对一幅遥控器背面图像的操作说明的文字进行提取。
需求:提取遥控器上的字符区域,并计算每一个字符汉字区域的面积、外接矩形的长宽,然后将计算的值存储到txt文本文件中。
遥控器图片
分析:先将图片转换为灰度图,根据灰度值将遥控器区域提取出来,然后再去求取每个字符的区域,最后再对每一个字符串进行计算区域面积、外接矩形长宽。
程序实现讲解:
读取图片并灰度转换
read_image (Image, '素材.jpg') *灰度转换 rgb1_to_gray (Image, GrayImage)
通过静态全局阈值分割(根据灰度值不同来分割),将图片分割成不同区域。遥控器的图像区域比较亮,灰度值基本在180以上。灰度值查看方法前面已经说过,在图片窗口上,按住Ctrl键,鼠标跳出来的一个是鼠标坐标值、另一个就是灰度值。
*静态阈值分割 threshold (GrayImage, Region, 150, 255)
阈值分割后,每个区域的边缘比较凹凸,形态学开操作(腐蚀)。
*开操作-腐蚀操作 opening_circle (Region, RegionOpening, 3.5)
连通域标记操作
*连通域标记,将几个区域分隔开 connection (RegionOpening, ConnectedRegions)
将遥控器的区域选择出来,遥控器的区域面积最大,因此可以用面积来进行筛选。
*方法1:遥控器区域面积大,可以用选择面积大的方法。将遥控的区域单独选择出来。 *参数3:最大面积,参数4:百分比。 select_shape_std (ConnectedRegions, SelectedRegions, 'max_area', 70) *方法2:根据凸性、或者遥控的外接矩形凸性来选择,
注意的是,提取出来的遥控器区域,字符所占的位置都是空的,因为字符是黑色的,在阈值分割的时候都已经分割开来了,因此要获得整个遥控图片所占区域,要将字符串的也位置填充起来。
*填充:将字符串的填充起来 fill_up (SelectedRegions, RegionFillUp)
将遥控器图像,从灰度图中裁剪下来
*裁剪,将遥控器的图片区域从原图中裁剪下来 reduce_domain (GrayImage, RegionFillUp, ImageReduced)
此时就可以对裁剪下来的遥控器图像进行特征分析了。字符是黑色的,遥控面板是白色的,灰度值区分还是很明显的。使用阈值分割即可
*全局阈值:前两个数值:选择分割的图像灰度范围,最后一个是要选择的分割的面积(可以将一些点去掉) fast_threshold (ImageReduced, Region1, 0, 100, 20)
可以看到,此时提取出来的字符,是斜着的,并且很多字的笔画是分开的并没有连接起来,这样子的话程序是会将其当成多个字符区域。
因此先将这些字符转到水平。
*求取区域的方向 orientation_region (Region1, Phi) *求取区域的中心 area_center (Region1, Area, Row, Column) *求取区域的角度,参数6:新的旋转之后的角度 vector_angle_to_rigid (Row, Column, Phi, Row, Column, -3.1415*0.5, HomMat2D) *对区域旋转操作:转到水平 affine_trans_region (Region1, RegionAffineTrans, HomMat2D, 'nearest_neighbor')
然后,再膨胀操作。先形态学闭运算、再竖直方向膨胀
*膨胀操作-闭运算: *同一个字符相邻的区域先浓缩成一团:将左右连接在一起 closing_circle (RegionAffineTrans, RegionClosing, 3.5) *然后再竖直方向膨胀,将竖直方向的都连接起来。参数3是宽度表示水平方向的,则值要设置的小 dilation_rectangle1 (RegionClosing, RegionDilation, 1, 11)
此时连通域操作,将每个字标记分开
*连通域操作: connection (RegionDilation, ConnectedRegions1)
观察发现,有一个逗号,还有“约3秒”、“按键”连接在了一起成了一个区域。
先去掉逗号,通过面积选择来操作
*选择指定的区域:去除逗号,,逗号面积小,大概80.参数5和参数6表示的是筛选的区域面积范围 select_shape (ConnectedRegions1, SelectedRegions1, 'area', 'and', 150, 99999)
分开连接在一起的字符比较麻烦,按下面的方法来实现。
将Region1旋转至水平和SelectedRegions1求交集才能求出完整的字符
*旋转至水平 affine_trans_region (Region1, RegionAffineTrans1, HomMat2D, 'nearest_neighbor') *两个区域求交集,得出遥控器上的字符串 intersection (SelectedRegions1, RegionAffineTrans1, RegionIntersection)
然后对每个字符区域进行排序
*区域的排序,参数5:选择排序方式以行排序 sort_region (RegionIntersection, SortedRegions, 'first_point', 'true', 'row')
*“约3秒”、“按键”没有分割开,需要分割开。用区域外接矩形1,长度法提取出来
select_shape (SortedRegions, SelectedRegions2, 'rect2_len1', 'and', 30, 99999)
然后再对其进行分开操作
*提取出来后再闭运算-膨胀 closing_circle (SelectedRegions2, RegionClosing1, 1.5) *再竖直方向膨胀(使每个字符笔画都是连接的) dilation_rectangle1 (RegionClosing1, RegionDilation1, 1, 11) *连通域 connection (RegionDilation1, ConnectedRegions2) *再求交集,获得字符 intersection ( ConnectedRegions2,SelectedRegions2, RegionIntersection1)
*生成空区域 gen_empty_obj (EmptyObject) *RegionIntersection1求交集EmptyObject,放到生成的空区域中 concat_obj (EmptyObject, RegionIntersection1, EmptyObject)
约3秒”、“按键”连起来的字符区域去掉,再加上“约3秒”、“按键”重新分割开的,形成完整的每个汉字都独立的区域
***“约3秒”、“按键”连起来的字符区域去掉,再加上“约3秒”、“按键”重新分割开的。 *区域做差。 difference (RegionIntersection, RegionIntersection1, RegionDifference) concat_obj (EmptyObject, RegionDifference, EmptyObject)
至此,遥控器上的每个独立的字符都已经提取出来了。下面要做的就是,每一个字符汉字区域的面积、外接矩形的长宽,然后将计算的值存储到txt文本文件中。
可以先统计总共有多少个字符,然后将字符进行排序,再写一个循环遍历程序对字符区域进行求面积、计算外接矩形的长宽,将所求的结果保存到数组中。最后将保存区域面积、外接矩形长款的数组数组写到txt文本中。
功能比较简单,直接贴出代码程序了,代码都有对应注释。
*统计总共有多少个字符区域 count_obj (EmptyObject, Number) *按行排序 sort_region (EmptyObject, SortedRegions1, 'first_point', 'true', 'row') *创建一个数组,用来保存区域面积 a:=[] *创建一个数组,用来保存外接矩形1边长L1 L1:=[] *创建一个数组,用来保存外接矩形1边长L2 L2:=[] *遍历 for i:=1 to Number-2 by 1 * select_obj (SortedRegions1, ObjectSelected, i) *区域面积 area_center (ObjectSelected, Area1, Row1, Column1) *遍历的结果添加到数组中,并且添加tab符 a:=[a,Area1,'\t'] *外接矩形1的两个边长 smallest_rectangle2 (ObjectSelected, Row2, Column2, Phi1, Length1, Length2) *遍历的结果添加到数组中,并且添加tab符 L1:=[L1,Length1,'\t'] *遍历的结果添加到数组中,并且添加tab符 L2:=[L2,Length2,'\t'] endfor *添加换行符 a:=[a,'\r\n'] *添加换行符 L1:=[L1,'\r\n'] *添加换行符 L2:=[L2,'\r\n'] ****将37个字符区域的面积和外接矩形1的两个边长参数写到txt文本中 *新建txt。文件保存在程序根目录下 open_file ('1.txt', 'output', FileHandle) fnew_line (FileHandle) *写到文本中.面积a fwrite_string (FileHandle, a) *另起一行再写。L1 fnew_line (FileHandle) fwrite_string (FileHandle, L1) *另起一行再写。L2 fnew_line (FileHandle) fwrite_string (FileHandle, L2) *关闭文件 close_file (FileHandle)
最终保存到txt文本的数据
工程完整程序下载链接:
https://download.csdn.net/download/panjinliang066333/12206334
-
echarts地图扩展中国分区域geoJSON地图数据
2015-06-06 22:28:53包括东北、华北、华东、华南、华中、西南、西北七大区,并包括各个区域的省等8个json文件。可用于echarts地图扩展中国分区域 -
实现基于区域的图像分割方法-区域生长法
2022-04-26 17:49:39基于区域的图像分割方法 基于区域的分割是以直接寻找区域为基础的分割技术,实际上类似基于边界的图像分割技术一样利用了对象与背景灰度分布的相似性。 基于区域的图像分割方法可以分为四类: 区域生长法 区域... -
基于区域生长法的图像分割matlab程序
2013-10-19 19:28:31本程序主要功能为实现基于区域生长法的图像分割,选取种子点,并将灰度差值小于阈值的像素点进行合并生长。 -
【Opencv】图像分割——区域生长
2022-03-29 21:49:45具体先对每个需要分割的区域找一个种子像素作为生长的起点,然后将种子像素周围邻域中与种子像素具有相同或相似性质的像素(根据某种事先确定的生长或相似准则来判定)合并到种子像素所在的区域中。将这些新像素当做... -
【数字图像处理5.2】区域生长算法、分裂合并算法和分水岭分割法 python
2020-11-10 09:00:56文章目录实验目的1、区域生长算法2、区域分裂合并算法3、分水岭分割算法 实验目的 编写程序完成以下算法,并进行比较,得出结论。 区域生长算法 区域分裂合并算法 分水岭分割算法 1、区域生长算法 2、区域分裂合并... -
Halcon region区域提取及区域转图像
2020-09-12 15:20:41在VS中调用Halcon中的分割之类函数后,直接返回显示时...因此需要将Regions连接起来生成一个大的区域,然后将区域进行相关操作转化成Image,Halcon中有三个区域转图像算子:region_to_bin、region_to_label、region_to_m -
强化区域产业链,优化区域产业布局,促区域经济高速发展
2021-12-16 14:06:37五度易链区域产业数字化管理平台 推荐专题:区域/园区产业数字化转型升级及管理 目前,我国区域产业正处于数字化转型的关键阶段,处于发展跨越提升最为有利的时期,能否做强区域产业链,从某种程度上来说,决定着... -
OSPF(六)OSPF特殊区域之Stub和Totally Stub区域详解及配置
2020-03-17 21:22:51文章目录前言Stub区域和Totally Stub区域传输区域和末端网络Stub Area配置命令Totally Stub Area配置 前言 OSPF路由器需要同时维护域内路由、域间路由、外部路由信息数据库。这里的域内路由主要是指一类、二类LSA;... -
如何找到周围8个区域的GeoHash编码
2014-11-28 09:32:03如何找到周围8个区域的GeoHash编码, java版本的。 -
ospf四大区域
2019-08-18 10:48:13一、四大特殊区域:stub area 、totally stub area ------T-stub、nssa area、nssa totally area ------T-nssa 二、stub area:末节区域。区域0相连的区域。并且这个区域没有连接任何其它OSPF区域以及其路由协议。 ... -
Android自定义照相机实现只拍摄矩形区域(重传)
2015-01-04 01:11:11自定义Android照相机,实现只拍摄矩形区域.完美解决预览及拍照时的照片拉伸失真,旋转等问题 -
Android拍摄矩形固定区域的图片并保存
2015-05-14 13:27:081.自定义相机,并在相机中添加图层拍摄固定区域的图片 2.对固定区域的图片进行处理保存 -
基于区域生长的图像分割算法!
2022-04-07 10:46:46图像分割的目的是将图像划分为多个不同的区域,所以我们可以直接从寻找图像中的区域来设计分割算法。区域生长正是一种基于区域寻找的传统图像分割算法。区域生长基本原理区域生长(Region Growth)算法是一种基于... -
HCIE-Security Day2:防火墙安全区域、安全级别的理解
2022-02-09 23:50:57防火墙支持多个安全区域,缺省支持非受信区域(untrust)、非军事化区域(DMZ)、受信区域(trust)、本地区域(local),这四个安全区域无需创建,也不能删除,安全级别也不能再设置。除以上四个,还支持用户自定义... -
OSPF区域类型及详解
2021-01-10 13:24:43所有的OSPF区域缺省情况下都是常规区域,当然, Area 0是常规区域中比较特殊的一个。 OSPF要求所有的非骨干区域(非0常规区域)都必须与Area 0直接相连。常规区域中允许Type-1, Type-2. Type-3, Type-4以及Type-5 LSA泛... -
OpenCV截取图像的任意区域(ROI),规则的图形(圆、椭圆、矩形),不规则鼠标自己选择
2015-12-17 09:22:47OpenCV截取图像的任意区域(ROI),规则的图形(圆、椭圆、矩形),不规则鼠标自己选择. -
OSPF之区域间路由
2020-03-03 19:17:29回溯:在上一篇博客中已经讲述了OSPF区域的路由的学习方式,是通过一类LSA(Router-LSA)以及二类LSA(Network-LSA)来获得的路由信息以及拓扑信息,并且在LSA中,只有一类以及二类的LSA有拓扑信息,但是它们不能向... -
基于Matlab的区域生长法分割图像
2010-05-19 17:05:55区域生长算法 区域生长是一种很重要的图像分割方法。它是指从某个像素出发,比较相邻接像素的特征向量(包括灰度、边缘、纹理等特征),在预先指定的准则下,若它们足够相似则作为同一区域合并,以此方式使相似特征的... -
基于改进区域生长算法的图像分割方法及实现
2020-05-31 16:31:56(2)然后,基于经典区域生长方法,自己查阅文献,设计改进的区域生长算法,实现图像分割; (3)目视比较分析2种方法的分割效果,概述改进方法分割效果的优点和不足之处; (4)实现分水岭分割。 二、需求分析 2.1... -
番外7. 在 Python OpenCV 寻找目标区域以及边缘扩展的解决方案
2021-08-17 20:44:14针对图像的特定区域进行操作,在 OpenCV 中被称作 ROI ,即目标区域或者叫做感兴趣区域,在处理图像的时候,可以先定位一个目标区域,然后再在该区域进行细节筛选,这样可以提高我们程序的速度和准确性。 实现 ROI ... -
opencv 去除面积小的区域
2012-08-16 20:56:33本程序是去除二值图像中面积较小的区域,有利于后续的工作,本方法是一个好方法 -
opencv区域提取
2022-03-31 21:03:09区域提取