如何创建 4 或 8 连接的邻接矩阵

2023-12-27

我一直在寻找一个 python 实现,给定一个数组,它返回 4 或 8 连接的邻接矩阵。我感到惊讶的是 cv2 或 networkx 不包含此功能。我发现了这个很棒的 Matlab执行 https://stackoverflow.com/a/3283732/4663466并决定用 python 做类似的东西。

Problem:我正在寻找一种可以改进运行时/空间中链接的 Matlab 解决方案或其他有趣方法的实现。

免责声明:

我在这里提交我自己的实现,因为我认为我不可能是唯一需要为图像处理或其他应用程序创建(4 / 8 连接)邻接矩阵的人。我希望能够提供改进或更好的实施。


使用对角线结构,详见这个答案 https://stackoverflow.com/a/3283732/4663466关于“在 MATLAB 中构造邻接矩阵”,我仅创建上对角线并将它们添加到稀疏对角矩阵的适当位置,使用scipy.sparse.diags http://docs.scipy.org/doc/scipy-0.13.0/reference/generated/scipy.sparse.diags.html。该稀疏矩阵与其转置相加,得到邻接矩阵。

在处理图像时,通常需要将图像分解为不重叠的矩形子图像或块。 patch_size 参数是一个元组 (rows, cols),描述大小为“rows x cols”的矩形块。

import numpy as np
import scipy.sparse as s

def connected_adjacency(image, connect, patch_size=(1, 1)):
    """
    Creates an adjacency matrix from an image where nodes are considered adjacent 
    based on 4-connected or 8-connected pixel neighborhoods.

    :param image: 2 or 3 dim array
    :param connect: string, either '4' or '8'
    :param patch_size: tuple (n,m) used if the image will be decomposed into 
                   contiguous, non-overlapping patches of size n x m. The 
                   adjacency matrix will be formed from the smaller sized array
                   e.g. original image size = 256 x 256, patch_size=(8, 8), 
                   then the image under consideration is of size 32 x 32 and 
                   the adjacency matrix will be of size 
                   32**2 x 32**2 = 1024 x 1024
    :return: adjacency matrix as a sparse matrix (type=scipy.sparse.csr.csr_matrix)
    """

    r, c = image.shape[:2]

    r = r / patch_size[0]
    c = c / patch_size[1]

    if connect == '4':
        # constructed from 2 diagonals above the main diagonal
        d1 = np.tile(np.append(np.ones(c-1), [0]), r)[:-1]
        d2 = np.ones(c*(r-1))
        upper_diags = s.diags([d1, d2], [1, c])
        return upper_diags + upper_diags.T

    elif connect == '8':
        # constructed from 4 diagonals above the main diagonal
        d1 = np.tile(np.append(np.ones(c-1), [0]), r)[:-1]
        d2 = np.append([0], d1[:c*(r-1)])
        d3 = np.ones(c*(r-1))
        d4 = d2[1:-1]
        upper_diags = s.diags([d1, d2, d3, d4], [1, c-1, c, c+1])
        return upper_diags + upper_diags.T
    else:
        raise ValueError('Invalid parameter \'connect\'={connect}, must be "4" or "8".'
                     .format(connect=repr(connect)))

一个简单的例子:

a = np.arange(9).reshape((3, 3))
adj = connected_adjacency(a, '4').toarray()
print a

[[0 1 2]
 [3 4 5]
 [6 7 8]]

print adj

[[ 0.  1.  0.  1.  0.  0.  0.  0.  0.]
 [ 1.  0.  1.  0.  1.  0.  0.  0.  0.]
 [ 0.  1.  0.  0.  0.  1.  0.  0.  0.]
 [ 1.  0.  0.  0.  1.  0.  1.  0.  0.]
 [ 0.  1.  0.  1.  0.  1.  0.  1.  0.]
 [ 0.  0.  1.  0.  1.  0.  0.  0.  1.]
 [ 0.  0.  0.  1.  0.  0.  0.  1.  0.]
 [ 0.  0.  0.  0.  1.  0.  1.  0.  1.]
 [ 0.  0.  0.  0.  0.  1.  0.  1.  0.]]

Using networkx + matplotlib to plot the adjacency matrix as a graph: enter image description here

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何创建 4 或 8 连接的邻接矩阵 的相关文章

  • 如何在Python中反转列表的列表? [复制]

    这个问题在这里已经有答案了 我想知道如何反转 python 中的列表列表 例如 原来的 list 1 2 3 4 5 6 7 8 9 输出 new list 7 8 9 4 5 6 1 2 3 现在 我正在尝试这样做 new list re
  • 在 ubuntu 中卸载 python 模块

    我必须删除一个名为 django 的 python 模块 一种流行的模块 因为我安装了错误的版本 1 3 py 2 6 中的 beta 如何卸载这个模块 请解释一下 因为我只在 Windows 中使用过 python 而从未在 Ubuntu
  • 将 numpy 数组及其大小写入二进制文件

    我需要将 2D numpy 数组写入文件 包括其尺寸 以便我可以从 C 程序中读取它并创建相应的数组 我编写了一些简单的代码来保存数组 并且可以从 C 读取它 但是如果我尝试先写入数组的大小 它总是会给我一个错误 这是我的简单 python
  • 如何检查给定的数字是否是2的幂?

    下面的代码不适用于某些输入 a i set 1 while i lt 10000 a add i i lt lt 1 N int input if N in a print True else print False 我最初的想法是检查每个
  • matplotlib - 将文本包装在图例中

    我目前正在尝试绘制一些pandas数据通过matplotlib seaborn 然而我的一个专栏标题特别长 拉长了情节 考虑以下示例 import random import pandas as pd import matplotlib p
  • 按升序对数字字符串列表进行排序

    我创建了一个SQLite https en wikipedia org wiki SQLite数据库有一个存储温度值的表 第一次将温度值按升序写入数据库 然后 我将数据库中的温度值读入列表中 然后将该列表添加到组合框中以选择温度 效果很好
  • 如何使用 Python 在表单中选择选项?

    我想知道如何以格式如下的形式选择选项 td align left td
  • python 硒 按名称查找元素

    查找电子邮件输入的正确代码是什么https accounts google com ServiceLogin html 是
  • 使用张量流导出神经网络的权重

    我使用张量流工具编写了神经网络 一切正常 现在我想导出神经网络的最终权重以制定单一的预测方法 我怎样才能做到这一点 您需要在训练结束时使用以下命令保存模型tf train Saver https www tensorflow org ver
  • numpy 向量化而不是 for 循环

    我用 Python 写了一些代码 运行良好 但速度很慢 我认为是由于 for 循环 我希望可以使用 numpy 命令加速以下操作 让我定义目标 假设我有一个 2D numpy 数组all CMs尺寸row x col 例如考虑一个6x11数
  • 在基本 Tensorflow 2.0 中运行简单回归

    我正在学习 Tensorflow 2 0 我认为在 Tensorflow 中实现最基本的简单线性回归是一个好主意 不幸的是 我遇到了几个问题 我想知道这里是否有人可以提供帮助 考虑以下设置 import tensorflow as tf 2
  • Python:如何“杀死”类实例/对象?

    我希望 Roach 类在达到一定量的 饥饿 时 死亡 但我不知道如何删除该实例 我的术语可能有误 但我的意思是 窗户上有大量 蟑螂 我希望特定的蟑螂完全消失 我会向您展示代码 但它很长 我将蟑螂类添加到策划者类蟑螂种群列表中 一般来说 每个
  • 从 SUDS 中的 SOAP 响应中提取 Cookie

    我必须使用具有多种服务的 API 所有这些都需要来自下面的身份验证的 JSESSION cookie 然而 当我调用下一个服务时 它不会保留 cookie 因此会拒绝它们 from suds client import Client url
  • 如何使用 QAbstractTableModel(模型/视图)将数据设置到 QComboBox?

    我希望能够设置itemData of a combobox当使用填充时QAbstractTableModel 但是 我只能从模型返回一个字符串data method 通常 当不使用模型时 可以像这样执行 Set text and data
  • python 中“重载”函数的最佳方法? [复制]

    这个问题在这里已经有答案了 我正在尝试在 python 中做这样的事情 def foo x y do something at position x y def foo pos foo pos x pos y 所以我想根据我提供的参数数量调
  • 如何通过 API Gateway 使用事件调用类型调用 Lambda 函数?

    文件说 默认情况下 Invoke API 采用 RequestResponse 调用类型 您可以选择通过将 Event 指定为 InitationType 来请求异步执行 因此 我可以发送到我的函数 python 的就是到处都是 Inspi
  • 阻止 BeautifulSoup 将我的 XML 标签转换为小写

    我正在使用 BeautifulStoneSoup 来解析 XML 文档并更改一些属性 我注意到它会自动将所有 XML 标签转换为小写 例如我的源文件有
  • 混合语言源目录布局

    我们正在运行一个使用多种不同语言的大型项目 Java Python PHP SQL 和 Perl 到目前为止 人们一直在自己的私有存储库中工作 但现在我们希望将整个项目合并到一个存储库中 现在的问题是 目录结构应该是什么样的 我们应该为每种
  • 基于 Web 请求在 Airflow 上运行作业

    我想知道是否可以在通过 HTTP 收到请求时执行气流任务 我对 Airflow 的调度部分不感兴趣 我只是想用它来代替芹菜 因此 示例操作如下所示 用户提交一份表格 请求某些报告 后端接收请求并向用户发送请求已收到的通知 然后后端使用 Ai
  • nltk 标记化和缩写

    我用 nltk 对文本进行标记 只是将句子输入到 wordpunct tokenizer 中 这会拆分缩写 例如 don t 到 don t 但我想将它们保留为一个单词 我正在改进我的方法 以实现更精确的文本标记化 因此我需要更深入地研究

随机推荐

  • Three.js - 蒙皮骨架网格物体实例、动画和混合

    我正在开发一款小型多人游戏 该游戏有一个单一皮肤的玩家网格 有许多玩家使用它 一些背景 我尝试通过 Maya 和 Blender Collada 导出加载 两者似乎都引用了某种形式的动画数据 但我无法让它工作 我尝试过 Maya JSON
  • Flutter - 仅在首次加载时无法加载资源

    我在我的 flutter 应用程序上加载图像 如下所示 Image asset imageFilePath fit BoxFit cover 当我第一次在模拟器上运行应用程序时 出现以下异常 I flutter 7194 图像资源服务捕获异
  • 使用 WSE 3.0 添加 SOAP:HEADER 用户名和密码

    我已经成功创建了一个 WS 客户端 该客户端在不使用身份验证时可以正常工作 但是 服务器 WebSphere 现在需要添加 ws security 用户名令牌 而我很难做到这一点 生成的 SOAP 消息应该如下所示
  • 如何将软件版本从 Azure DevOps 部署到内部服务器?

    我们的软件托管在 Azure DevOps 上的 Git 中 并使用构建管道 主要使用 Cake 脚本 进行构建 我们现在希望使用 Azure DevOps 发布管道来部署该软件 然而 我们所有的应用程序服务器都位于防火墙后面 网络内部 除
  • ASP.NET WebPart 和 Google Chrome

    Hi there 这几天开始学习ASP NET Google Chrome 是我的默认浏览器 我也在 Google Chrome 中测试我的应用程序 我发现当我使用 Chrome 时 ASP NET 的某些元素不会实时运行 例如 ASP N
  • 检查对象是否为 Null 或未定义

    我有一个包含可选变量参数的函数 默认情况下 我将变量设置为NULL 但如果不是NULL我希望我的功能可以做一些事情 我需要一种方法来检查变量是否不为空 这很复杂 因为我正在使用 tidyeval 并且只是使用is null var 抛出未找
  • VBA、ADO.Connection 和查询参数

    我有 Excel VBA 脚本 Set c nn CreateObject ADODB Connection conn Open report Set rs conn Execute select from table 脚本工作正常 但我想
  • linux下如何挂载android的img文件? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 最近 我对android rom感兴趣 我想更改和重建它们 所以 我在我的 XOOM 上做了一些测试
  • C++:Cheat Engine 和 ArtMoney 等应用程序如何工作?

    问完后这个问题 C 我可以用指针超出应用程序的内存范围吗 https stackoverflow com questions 2976058 c can i get out of the bounds of my apps memory w
  • 我怎样才能找到这个 Json 对象的长度

    我想找到这个 JSON 对象的长度 所以有人告诉我如何获得 JSON 对象的长度 意味着我想知道这个 json 对象包含多少数据 var ddData 01 United States 02 United Kingdom 03 Aruba
  • 是否有一个函数可以将 ipAddress 作为字符串并告诉我它是否是不可路由的 IP 地址?

    我正在尝试确定 IP 地址是否可路由 例如 如果我收到 127 0 0 1 我就知道这是环回 即 localhost 我无法在 NET 或任何其他语言中找到此功能 因此我开始编写自己的函数 但还远未完成 在我花大量时间编写这个函数之前 有谁
  • 将平铺 Google 地图与 OpenLayers 3 结合使用

    如何将 google 地图与 OpenLayers 3 一起使用 我想从 OpenLayers 2 迁移到 3 这是一个例子 谷歌地图与 OpenLayers 集成示例 http openlayers org en v3 0 0 examp
  • 每天按顺序选择 10 行

    我有一个带有日期 时间戳 记录的数据库 我需要每天选择10条记录 每天还有更多 并按几列对它们进行排序 该查询应该是什么样子 您必须每天在子查询中获取 10 条记录 并通过左连接将它们连接到主表 这样您每天最多可以获得 10 条记录 SQL
  • 错误:“无法修改返回值”c#

    我正在使用自动实现的属性 我想解决以下问题的最快方法是声明我自己的支持变量 public Point Origin get set Origin X 10 fails with CS1612 错误消息 无法修改 表达式 的返回值 因为 它不
  • 在单个查询中从 mongodb 中的 2 个集合中获取数据

    我想从 2 个独立的集合中获取数据并根据date通过单个查询 这甚至可能在mongodb 我有收藏 订单类型1 id 1 name Hello1 date 2016 09 23T15 07 38 000Z id 2 name Hello1
  • Angular:单元测试路由:预期“”为“/route”

    我正在对我的 Angular 应用程序下的路由进行单元测试 我的路线在 app module ts 下导入的特定模块中声明 这是我的路由模块 应用程序路由 module ts import NgModule from angular cor
  • 将 Unicode 转换为 ASCII 而不更改字符串长度(在 Java 中)

    将字符串从 Unicode 转换为 ASCII 而不改变其长度的最佳方法是什么 这对我来说非常重要 此外 没有任何转换问题的字符必须位于与原始字符串相同的位置 因此 必须转换为 A 而不是具有更多字符的神秘内容 Edit novalis 这
  • fseek for fd(int fd 而不是 FILE*)

    fd 是否有相当于 fseek 的功能 我已经使用int fds很长时间了 想使用fseek 但我知道没有seek功能 提前致谢 查看 POSIX 函数lseek 2 http linux die net man 2 lseek SYNOP
  • 如何使用情感 CSS 覆盖 React 组件的 CSS?

    下面的例子说明了如何申请background color green to the
  • 如何创建 4 或 8 连接的邻接矩阵

    我一直在寻找一个 python 实现 给定一个数组 它返回 4 或 8 连接的邻接矩阵 我感到惊讶的是 cv2 或 networkx 不包含此功能 我发现了这个很棒的 Matlab执行 https stackoverflow com a 3