欢迎来真孝善网,为您提供真孝善正能量书籍故事!

深入解析邻域连通性标记:探索网络结构的关键指标

时间:11-08 神话故事 提交错误

大家好,今天来为大家分享深入解析邻域连通性标记:探索网络结构的关键指标的一些知识点,和的问题解析,大家要是都明白,那么可以忽略,如果不太清楚的话可以看看本篇文章,相信很大概率可以解决您的问题,接下来我们就一起来看看吧!

seg.png 下图是标记出来后的图片.pngimg=cv2.imread("1.jpg").astype(np.float32) #读取图片

H,W,C=img.shape#获取图像尺寸

label=np.zeros((H, W), dtype=np.int)#制作标签矩阵

label[img[. 0] 0]=1# 将255对应的label和img的位置标记为1,即0的值不标记,1的值就是我们需要的类别评论。

LUT=[0 for _ in range(H * W)]#LUT初始化为0,长度为img像素个数

n=1

#这个循环是标记每个像素

对于范围(H): 内的y

对于范围(W): 内的x

if label[y, x]==0:#如果为0则跳过本次循环,进入下一次循环输入x+1

继续

c3=label[max(y - 1, 0), x]#不为0,获取(y-1, x)坐标对应的标签值,上坐标

c5=label[y, max(x - 1, 0)]#不为0,获取(y, x-1)坐标对应的标签值,左坐标

if c3 2 and c5 2:#如果c32和c52,则表示上部和左侧像素均不标记。由于标签编号0和1相当于初始编号,因此它们不计为新标签编号。

n +=1#然后标签编号加1

label[y, x]=n#在此位置设置新的标签编号

否则:

_vs=[c3, c5]#如果上侧或左侧有标记像素

vs=[a for a in _vs if a 1]# 取出两个标签号。 vs 可能有一个值,此时处于边界上,也可能有两个值,这涉及到标签合并。

v=min(vs)#取最小但大于1的标签号,因为标签号0和1相当于初始的数字,所以不计为新的标签号。

label[y, x]=v#将该位置的标签号设置为较小的标签号。此时,标签矩阵中的标签值不会改变。以下代码涉及稍后合并标签值。

最小v=v#

对于vs:中的_v

如果LUT[_v] !=0:

minv=min(minv, LUT[_v])#如果位置已被占用,则更新

对于vs:中的_v

LUT[_v]=minv#如果位置没有被占用,则依次填充LUT

计数=1

对于范围(2, n + 1): 内的l

标志=真

对于范围(n + 1): 内的i

如果LUT[i]==l:

如果标志:

计数+=1

标志=假

LUT[i]=计数

COLORS=[[0, 0, 255], [0, 255, 0], [255, 0, 0], [255, 255, 0]]#设置颜色范围。这个地方可以优化一下。只需了解基本原理即可。

输出=np.zeros((H, W, C), dtype=np.uint8)

for i, lut in enumerate(LUT[2:]):#用颜色填充对应的标记位置

out[label==(i + 2)]=COLORS[lut - 2]#因为标注是从2开始的,所以用colors[lut-2]选择颜色

八邻域-连通域标记

来进行8邻域连通域标记,我们需要检查四个像素i(x-1,y-1), i(x, y-1), i(x+1,y-1), i(x-1,y) import cv2

将numpy 导入为np

将matplotlib.pyplot 导入为plt

# 读取图像

img=cv2.imread("seg.png").astype(np.float32)

H、W、C=img.shape

标签=np.zeros((H, W), dtype=np.int)

标签[img[. 0]0]=1

LUT=[0 表示_ 在范围内(H*W)]

n=1

对于范围(H): 内的y

对于范围(W): 内的x

如果标签[y, x]==0:

继续

c2=标签[max(y-1,0), min(x+1, W-1)]#右上角

c3=label[max(y-1,0), x]#直接向上

c4=标签[max(y-1,0), max(x-1,0)]#左上

c5=标签[y, max(x-1,0)]#left

如果c3 2 和c5 2 和c2 2 和c4 2:

n+=1

标签[y, x]=n

否则:

_vs=[c3, c5, c2, c4]

vs=[a for a in _vs if a 1]

v=最小值(vs)

标签[y, x]=v

最小v=v

对于vs:中的_v

如果LUT[_v] !=0:

minv=min(minv, LUT[_v])

对于vs:中的_v

LUT[_v]=minv

计数=1

对于范围(2, n+1): 内的l

标志=真

对于范围(n+1): 内的i

如果LUT[i]==l:

如果标志:

计数+=1

标志=假

LUT[i]=计数

颜色=[[0, 0, 255], [0, 255, 0], [255, 0, 0], [255, 255, 0]]

输出=np.zeros((H, W, C), dtype=np.uint8)

对于我,枚举中的lut(LUT[2:]):

out[标签==(i+2)]=颜色[lut-2]

#保存结果

cv2.imwrite("out.png", out)

cv2.imshow("结果", 输出)

cv2.waitKey(0)

cv2.destroyAllWindows()

图像透明混合

当按照1:1的比例重叠img1和img2时,使用以下公式。通过更改Alpha 值,您可以更改两个图像之间重叠的权重。

out=img1 * alpha + img2 * (1 - alpha) 一行代码即可实现,但要保证img1和img2的图像大小一致。

4连接数

4 连接数可用于显示附近像素的状态。通常,对于中心像素x0(x,y)不为零的情况,邻域定义如下:、、、、、 333 60、、,逆时针方向的八个像素构成八个邻域。这里,4连接数的计算公式如下:S的取值范围为[0,4]: S=0:内部点;S=1:端点; S=2:连接点; S=3:分支点; S=4:交点。 def connect_4(img):

# 获得形状

H,W,C=img.shape#获取图像尺寸

# 准备临时图像准备临时图像,大小与输入大小相同

tmp=np.zeros((H, W), dtype=np.int)

# 二值化

tmp[img[. 0] 0]=1#白色区域标记1

# 准备图像#准备输出文件

输出=np.zeros((H, W, 3), dtype=np.uint8)

# 每个像素

对于范围(H): 内的y

对于范围(W): 内的x

如果tmp[y,x] 1:

继续

S=0

S +=(tmp[y,min(x+1,W-1)] - tmp[y,min(x+1,W-1)] * tmp[max(y-1,0),min(x +1,W-1)] * tmp[max(y-1,0),x])

S +=(tmp[max(y-1,0),x] - tmp[max(y-1,0),x] * tmp[max(y-1,0),max(x-1,0) )] * tmp[y,max(x-1,0)])

S +=(tmp[y,max(x-1,0)] - tmp[y,max(x-1,0)] * tmp[min(y+1,H-1),max(x-1) ,0)] * tmp[min(y+1,H-1),x])

S +=(tmp[min(y+1,H-1),x] - tmp[min(y+1,H-1),x] * tmp[min(y+1,H-1),min (x+1,W-1)] * tmp[y,min(x+1,W-1)])

if S==0:#内点

输出[y,x]=[0, 0, 255]

elif S==1:#端点

输出[y,x]=[0, 255, 0]

elif S==2:#连接点

输出[y,x]=[255, 0, 0]

elif S==3:#分支点

输出[y,x]=[255, 255, 0]

elif S==4:#交点

输出[y,x]=[255, 0, 255]

out=out.astype(np.uint8)

返回

# 读取图像

img=cv2.imread("renketsu.png").astype(np.float32)

# 连接4

out=connect_4(img)5678.jpg

8连接数

将每个值反转为0 和1 以计算# connect 8

def connect_8(img):

# 获得形状

H、W、C=img.shape

# 准备临时的

_tmp=np.zeros((H, W), dtype=np.int)

# 得到二值化

_tmp[img[. 0] 0]=1

# 连接8 的逆

tmp=1 - _tmp#与上面代码唯一的区别

# 准备图像

输出=np.zeros((H, W, 3), dtype=np.uint8)

# 每个像素

对于范围(H): 内的y

对于范围(W): 内的x

如果_tmp[y,x] 1:

继续

S=0

S +=(tmp[y,min(x+1,W-1)] - tmp[y,min(x+1,W-1)] * tmp[max(y-1,0),min(x +1,W-1)] * tmp[max(y-1,0),x])

S +=(tmp[max(y-1,0),x] - tmp[max(y-1,0),x] * tmp[max(y-1,0),max(x-1,0) )] * tmp[y,max(x-1,0)])

S +=(tmp[y,max(x-1,0)] - tmp[y,max(x-1,0)] * tmp[min(y+1,H-1),max(x-1) ,0)] * tmp[min(y+1,H-1),x])

S +=(tmp[min(y+1,H-1),x] - tmp[min(y+1,H-1),x] * tmp[min(y+1,H-1),min (x+1,W-1)] * tmp[y,min(x+1,W-1)])

如果S==0:

输出[y,x]=[0, 0, 255]

elif S==1:

输出[y,x]=[0, 255, 0]

elif S==2:

输出[y,x]=[255, 0, 0]

elif S==3:

输出[y,x]=[255, 255, 0]

elif S==4:

输出[y,x]=[255, 0, 255]

out=out.astype(np.uint8)

返回

# 读取图像

img=cv2.imread("renketsu.png").astype(np.float32)

# 连接8

out=connect_8(img)

细化处理

细化是将线条宽度设置为1的过程,按照下面的算法进行处理从左上角开始光栅扫描如果是,则不处理。如果是,当满足以下三个条件时,设:4个最近邻像素中不止一个值为0; x0的4连接数为1; x0的8个近邻有超过3个值为1。重复光栅扫描,直到步骤2中像素值变化的数量达到0。#thinning algorythmThinning过程

定义细化(img):

# 获得形状

H,W,C=img.shape#获取图像尺寸

# 准备图像# 准备输出图像

out=np.zeros((H, W), dtype=np.int)#初始化

out[img[. 0] 0]=1# 标记白色区域

计数=1

当数到0:时

计数=0

tmp=out.copy()

# 每个像素(拉斯塔扫描)

对于范围(H): 内的y

对于范围(W): 内的x

# 跳过黑色像素

if out[y, x] 1:#黑色区域直接遍历下一个像素

继续

# 统计满足的条件

Judge=0#将第二步的初始判断值设置为0。当三个条件满足时,每次判断值+1等于3时判断完成。

## 条件1

if (tmp[y, min(x+1, W-1)] + tmp[max(y-1, 0), x] + tmp[y, max(x-1, 0)] + tmp[min( y+1, H-1), x]) 4:

判断+=1

## 条件2

c=0

c +=(tmp[y,min(x+1, W-1)] - tmp[y, min(x+1, W-1)] * tmp[max(y-1, 0),min(x +1, W-1)] * tmp[max(y-1, 0), x])

c +=(tmp[max(y-1,0), x] - tmp[max(y-1,0), x] * tmp[max(y-1, 0), max(x-1, 0) )] * tmp[y, max(x-1, 0)])

c +=(tmp[y, max(x-1, 0)] - tmp[y,max(x-1, 0)] * tmp[min(y+1, H-1), max(x-1) , 0)] * tmp[min(y+1, H-1), x])

c +=(tmp[min(y+1, H-1), x] - tmp[min(y+1, H-1), x] * tmp[min(y+1, H-1), min (x+1, W-1)] * tmp[y, min(x+1, W-1)])

如果c==1:

判断+=1

##x条件3

if np.sum(tmp[max(y-1, 0) : min(y+2, H), max(x-1, 0) : min(x+2, W)])=4:

判断+=1

# 如果所有条件都满足

如果判断==3:

输出[y,x]=0

count +=1#完成判断,count加1,如果不成立,count等于0,跳出最后的循环

输出=输出.astype(np.uint8) * 255

返回

# 读取图像

img=cv2.imread("gazo.png").astype(np.float32)

#细化

out=Thining(img)

Hilditch 细化算法

算法如下光栅扫描从左上角开始;如果是,则不执行任何处理。,当满足以下五个条件时::当前像素的4个最近邻中存在多个0; x0的8连数为1; x1到x8的绝对值之和大于2;

8近邻像素的取值有一个以上为1;对于所有xn (n[1,8]) 均成立:不是-1;当为0时,x0的8连接数为1,将每个像素的-1改为0;重复光栅扫描,直到步骤3中的变化次数在光栅扫描中变为0。

Zhang-Suen细化算法

基本原理中心像素x1(x,y) 的8 个最近邻定义如下: x9 x2 x3 x8 x1 x4 x7 x6 x5 步骤1:执行光栅扫描并标记满足以下条件的所有像素5个条件:这是一个黑色像素;顺时针看x2、x3、、x9、x2时,从0到1的变化次数只有1次; x2、x3、…、x9中1的个数大于2且小于6; x2、x4、x6其中之一为1; x4、x6和x8之一为1;

将标记的像素全部变为1。第二步:进行光栅扫描,标记所有满足以下5个条件的像素: 这是黑色像素;顺时针看x2、x3、、x9、x2时,从0到1的变化次数只有1次;x2、x3、、x9中1的数量多于2次且少于6次; x2、x4和x6之一为1; x2、x6和x8之一为1;

将标记的像素全部变为1。重复步骤1 和2,直到没有变化。 #张Suen稀疏算法

def 张_Suen_thinging(img):

# 获得形状

H、W、C=img.shape

# 准备图像

输出=np.zeros((H, W), dtype=np.int)

输出[img[. 0] 0]=1

输出=1 - 输出

而True:

s1=[]

s2=[]

# 步骤1(拉斯塔扫描)

对于范围(1, H-1): 中的y

对于范围(1, W-1): 内的x

# 条件1

如果输出[y,x] 0:

继续

# 条件2

f1=0

if (输出[y-1, x+1] - 输出[y-1, x])==1:

f1 +=1

if (输出[y, x+1] - 输出[y-1, x+1])==1:

f1 +=1

if (输出[y+1, x+1] - 输出[y, x+1])==1:

f1 +=1

if (输出[y+1, x] - 输出[y+1,x+1])==1:

f1 +=1

if (输出[y+1, x-1] - 输出[y+1, x])==1:

f1 +=1

if (输出[y, x-1] - 输出[y+1, x-1])==1:

f1 +=1

if (输出[y-1, x-1] - 输出[y, x-1])==1:

f1 +=1

if (输出[y-1, x] - 输出[y-1, x-1])==1:

f1 +=1

如果f1 !=1:

继续

# 条件3

f2=np.sum(out[y-1:y+2, x-1:x+2])

如果f2 2 或f2 6:

继续

# 条件4

如果输出[y-1, x] + 输出[y, x+1] + 输出[y+1, x] 1:

继续

# 条件5

如果输出[y, x+1] + 输出[y+1, x] + 输出[y, x-1] 1:

继续

s1.append([y, x])

对于s1: 中的v

输出[v[0], v[1]]=1

# 第2 步(拉斯塔扫描)

对于范围(1, H-1): 内的y

对于范围(1, W-1): 内的x

# 条件1

如果输出[y,x] 0:

继续

# 条件2

f1=0

if (输出[y-1, x+1] - 输出[y-1, x])==1:

f1 +=1

if (输出[y, x+1] - 输出[y-1, x+1])==1:

f1 +=1

if (输出[y+1, x+1] - 输出[y, x+1])==1:

f1 +=1

if (输出[y+1, x] - 输出[y+1,x+1])==1:

f1 +=1

if (输出[y+1, x-1] - 输出[y+1, x])==1:

f1 +=1

if (输出[y, x-1] - 输出[y+1, x-1])==1:

f1 +=1

if (输出[y-1, x-1] - 输出[y, x-1])==1:

f1 +=1

if (输出[y-1, x] - 输出[y-1, x-1])==1:

f1 +=1

如果f1 !=1:

继续

# 条件3

f2=np.sum(out[y-1:y+2, x-1:x+2])

如果f2 2 或f2 6:

继续

# 条件4

如果输出[y-1,x] + 输出[y,x+1] + 输出[y,x-1] 1:

继续

# 条件5

如果输出[y-1, x] + 输出[y+1, x] + 输出[y, x-1] 1:

继续

s2.append([y, x])

对于s2: 中的v

输出[v[0], v[1]]=1

# 如果没有任何像素发生改变

如果len(s1) 1 且len(s2) 1:

休息

输出=1 - 输出

输出=输出.astype(np.uint8) * 255

返回

# 读取图像

img=cv2.imread("gazo.png").astype(np.float32)

#张苏廷宁

好了,本文到此结束,如果可以帮助到大家,还望关注本站哦!

用户评论

雁過藍天

这听起来很有意思!学习一下如何评估不同的区域是否互相连接。

    有16位网友表示赞同!

暖瞳

我好奇这种标记方法在哪些领域会用到?

    有10位网友表示赞同!

绝版女子

是不是可以用来研究城市规划或交通网络?

    有11位网友表示赞同!

无望的后半生

在地理学里应该蛮实用的吧,能更好地理解空间关系。

    有13位网友表示赞同!

青山暮雪

看来这有助于分析社会活动之间的联系,比如朋友圈还是群体的分布。

    有17位网友表示赞同!

蹂躏少女

邻域连通性标记是不是可以用图像处理来实现?

    有17位网友表示赞同!

滴在键盘上的泪

我想知道这种标记方法的准确度怎么样?

    有18位网友表示赞同!

你与清晨阳光

有没有具体的例子可以说明?

    有13位网友表示赞同!

话扎心

这篇文章是不是会解释不同类型邻域连通性的定义?

    有8位网友表示赞同!

oО清风挽发oО

邻域连通性标记能用来预测未来的发展趋势吗?

    有15位网友表示赞同!

此刻不是了i

这听起来像是一个很有潜力的研究方向。

    有9位网友表示赞同!

纯真ブ已不复存在

我想了解更多关于实现邻域连通性标记算法的方法。

    有7位网友表示赞同!

限量版女汉子

这种标记在实际应用中遇到的挑战有哪些?

    有14位网友表示赞同!

千城暮雪

是不是可以通过数据可视化来展示邻域连通性?

    有10位网友表示赞同!

ˉ夨落旳尐孩。

这篇文章会介绍一些常用的工具和软件吗?

    有17位网友表示赞同!

青衫负雪

我更想知道邻域连通性标记如何在不同领域得到应用。

    有18位网友表示赞同!

淡写薰衣草的香

这个概念听起来很有启发性,可以帮助我们更好地理解复杂网络。

    有18位网友表示赞同!

毒舌妖后

我很期待阅读这篇文章!

    有12位网友表示赞同!

野兽之美

我觉得邻域连通性标记会在未来发挥越来越重要的作用。

    有6位网友表示赞同!

容纳我ii

它能为解决一些社会问题提供新的思路和方法。

    有5位网友表示赞同!

【深入解析邻域连通性标记:探索网络结构的关键指标】相关文章:

1.蛤蟆讨媳妇【哈尼族民间故事】

2.米颠拜石

3.王羲之临池学书

4.清代敢于创新的“浓墨宰相”——刘墉

5.“巧取豪夺”的由来--米芾逸事

6.荒唐洁癖 惜砚如身(米芾逸事)

7.拜石为兄--米芾逸事

8.郑板桥轶事十则

9.王献之被公主抢亲后的悲惨人生

10.史上真实张三丰:在棺材中竟神奇复活