基于python的Graph图的表示

图(Graph)的表示1.图的概念图是一种重要的数据结构,在解决实际问题中也经常用到这种数据结构,其基本表示为G=(V, E),V(vectex)是图的顶点,E(edge)表示图的边。我们的地图在计算机中就可以表示成一个Graph,不同的标志性地点为vectex,地点之间的路表示为edge,这样就可以方便操作实际中的地图去解决一些复杂的问题,比如找两个地点之间的最短路径,旅行商问题等等。图分为有向图和无向图,有向图指的是各个顶点之间有一定的方向,一个顶点到另一个顶点需要按照给定的方向进行移动;而无向图
摘要由CSDN通过智能技术生成
图(Graph)的表示
1.图的概念

图是一种重要的数据结构,在解决实际问题中也经常用到这种数据结构,其基本表示为G=(V, E),V(vectex)是图的顶点,E(edge)表示图的边。我们的地图在计算机中就可以表示成一个Graph,不同的标志性地点为vectex,地点之间的路表示为edge,这样就可以方便操作实际中的地图去解决一些复杂的问题,比如找两个地点之间的最短路径,旅行商问题等等。

图分为有向图和无向图,有向图指的是各个顶点之间有一定的方向,一个顶点到另一个顶点需要按照给定的方向进行移动;而无向图指的是顶点之间没有固定方向。如下图所示,第一幅图为无向图,第二幅图为有向图。在有向图中,顶点1指向顶点2,说明1可以移向2,但是2不能移向1。
在这里插入图片描述
在这里插入图片描述

2.图的表示

图的表示就是表示清楚顶点信息和边的信息。有两种表示方法,邻接链表和邻接矩阵。如上面两张图可分别表示如下:

在这里插入图片描述
在这里插入图片描述

在计算机中,我们可以使用一些数据结构来简化图的表达,比如在Python中,我们可以用下面代码来表示一个图:

graph = {
   'A': set(['B', 'C']),
         'B': set(['A', 'D', 'E']),
         'C': set(['A', 'F']),
         'D': set(['B']),
         'E': set(['B', 'F']),
         'F': set(['C', 'E'])}

graph是一个字典,其中keys是所有的vertices,values是与该顶点连接的其他顶点。如果我们需要获取所有的顶点,那么可以利用字典的keys()方法:

graph.keys()

output: dict_keys(['A', 'B', 'C', 'D', 'E', 'F'])

获取与某个顶点相连的其他顶点,就可直接利用字典的取值方法:

graph['A']

output: {
   'B', 'C'}

但是如果图中的每一个边有权,我们称之为有权图时,利用上述的表示方法不能很方便地得到权重信息,为此我们可以封装一个类,定义获取边,权重等相关信息的函数。

# Fall 2012 6.034 Lab 2: Search
from functools import reduce

try:
    set()
except NameError:
    from sets import Set as set, ImmutableSet as frozenset

NAME="NAME"
NODE1="NODE1"
NODE2="NODE2"
VAL="LENGTH"

class Edge:
    def __init__(self, name, node1, node2, length):
        self.name = name
        self.node1 = node1
        self.node2 = node2
        self.length = length
    def 
  • 4
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
GraphCut是一种基于论的像分割算法,它可以将像分割成多个部分,每个部分都具有一定的特征。在论中,由节点和边组成,节点表示像中的像素点,边表示像素点之间的关系。GraphCut算法通过将像中的像素点分为前景和背景,然后计算像素点之间的相似性和不同性,最后通过最小割算法像分割成多个部分。 在python中,可以使用OpenCV库中的cv2函数实现GraphCut算法。以下是一个基于pythonGraphCut分割算法的示例代码: ```python import cv2 import numpy as np # 读取像 img = cv2.imread('image.jpg') # 创建掩模,将前景和背景标记为0和1 mask = np.zeros(img.shape[:2],np.uint8) bgdModel = np.zeros((1,65),np.float64) fgdModel = np.zeros((1,65),np.float64) # 定义矩形框,将其内部标记为前景 rect = (50,50,450,290) cv2.grabCut(img,mask,rect,bgdModel,fgdModel,5,cv2.GC_INIT_WITH_RECT) # 创建新的掩模,将前景和可能的前景标记为1,其余部分标记为0 new_mask = np.where((mask==2)|(mask==0),0,1).astype('uint8') # 应用新的掩模 new_img = img*new_mask[:,:,np.newaxis] # 显示像 cv2.imshow('image',img) cv2.imshow('new_image',new_img) cv2.waitKey(0) cv2.destroyAllWindows() ``` 该代码首先读取一张像,并创建一个空的掩模。然后,定义了一个矩形框,将其内部标记为前景,并使用grabCut函数进行像分割。接下来,创建一个新的掩模,将前景和可能的前景标记为1,其余部分标记为0。最后,应用新的掩模,生成一张新的像,并显示原始像和新像。 需要注意的是,该代码中使用的是矩形框来标记前景,如果需要使用其他形状来标记前景,可以使用cv2.EVENT_LBUTTONDOWN和cv2.EVENT_LBUTTONUP函数实现鼠标交互,或者使用其他的算法来自动检测前景。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值