Scipy 标签侵蚀

2023-12-27

如何在 numpy 数组中的标记区域周围保留一圈像素?

在一个简单的情况下,我会减去侵蚀。当标签接触时,这种方法就不起作用了。我怎样才能得到B from A?

A = array([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
           [0, 0, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0],
           [0, 0, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0],
           [0, 0, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0],
           [0, 0, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0],
           [0, 0, 2, 2, 2, 1, 1, 1, 1, 1, 0, 0],
           [0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0],
           [0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0],
           [0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0],
           [0, 0, 0, 0, 0, 1, 1, 1, 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]])

B = array([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
           [0, 0, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0],
           [0, 0, 2, 0, 0, 0, 0, 0, 2, 0, 0, 0],
           [0, 0, 2, 0, 0, 0, 0, 0, 2, 0, 0, 0],
           [0, 0, 2, 0, 0, 2, 2, 2, 2, 0, 0, 0],
           [0, 0, 2, 2, 2, 1, 1, 1, 1, 1, 0, 0],
           [0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0],
           [0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0],
           [0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0],
           [0, 0, 0, 0, 0, 1, 1, 1, 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]])

我正在处理带有许多标签的大型数组,因此不能选择对每个标签进行单独的侵蚀。


新答案

其实我只是想到了一个更好的办法:

B = A * (np.abs(scipy.ndimage.laplace(A)) > 0)

作为一个完整的例子:

import numpy as np
import scipy.ndimage

A = np.array([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
              [0, 0, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0],
              [0, 0, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0],
              [0, 0, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0],
              [0, 0, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0],
              [0, 0, 2, 2, 2, 1, 1, 1, 1, 1, 0, 0],
              [0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0],
              [0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0],
              [0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0],
              [0, 0, 0, 0, 0, 1, 1, 1, 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]])

B = A * (np.abs(scipy.ndimage.laplace(A)) > 0)

我认为这应该适用于所有情况(“标记”数组,例如A,无论如何......)。

如果您担心性能,可以将其分成几部分以减少内存开销:

B = scipy.ndimage.laplace(A)
B = np.abs(B, B) # Preform abs in-place
B /= B  # This will produce a divide by zero warning that you can safely ignore
B *= A  

这个版本更加冗长,但使用的内存应该少得多。

旧答案

我想不出一种用通常的 scipy.ndimage 函数一步完成的好方法。 (我觉得高帽过滤器应该可以满足你的要求,但我不太明白。)

然而,正如您所提到的,进行多次单独的侵蚀是一种选择。

如果您使用,即使在非常大的数组上,您也应该获得合理的性能find_objects提取每个标签的子区域,然后对子区域进行腐蚀。

例如:

import numpy as np
import scipy.ndimage

A = np.array([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
              [0, 0, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0],
              [0, 0, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0],
              [0, 0, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0],
              [0, 0, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0],
              [0, 0, 2, 2, 2, 1, 1, 1, 1, 1, 0, 0],
              [0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0],
              [0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0],
              [0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0],
              [0, 0, 0, 0, 0, 1, 1, 1, 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]])

regions = scipy.ndimage.find_objects(A)

mask = np.zeros_like(A).astype(np.bool)

for val, region in enumerate(regions, start=1):
    if region is not None:
        subregion = A[region]
        mask[region] = scipy.ndimage.binary_erosion(subregion == val)

B = A.copy()
B[mask] = 0

这产生:

array([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0],
       [0, 0, 2, 0, 0, 0, 0, 0, 2, 0, 0, 0],
       [0, 0, 2, 0, 0, 0, 0, 0, 2, 0, 0, 0],
       [0, 0, 2, 0, 0, 2, 2, 2, 2, 0, 0, 0],
       [0, 0, 2, 2, 2, 1, 1, 1, 1, 1, 0, 0],
       [0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0],
       [0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0],
       [0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0],
       [0, 0, 0, 0, 0, 1, 1, 1, 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]])

对于大型数组来说,性能应该是合理的,但这在很大程度上取决于不同标记对象跨越的区域有多大以及您拥有的标记对象的数量......

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

Scipy 标签侵蚀 的相关文章

  • JavaScript 相当于 Python 的参数化 string.format() 函数

    这是 Python 示例 gt gt gt Coordinates latitude longitude format latitude 37 24N longitude 115 81W Coordinates 37 24N 115 81W
  • Python有条件求解时滞微分方程

    我在用dde23 of pydelay包来求解延迟微分方程 我的问题 如何有条件地编写方程 例如目标方程有两个选项 when x gt 1 dx dt 0 25 x t tau 1 0 pow x t tau 10 0 0 1 x othe
  • Jupyter Notebooks 不显示进度条

    我正在尝试在 Jupyter 笔记本中显示进度条 这是一台新电脑 我通常做的事情似乎不起作用 from tqdm import tqdm notebook example iter 1 2 3 4 5 for rec in tqdm not
  • 使用 Django Rest 保存 Base64ImageField 类型会将其保存为原始图像。如何将其转换为普通图像

    我的模型中有 5 个图像字段 imageS imageS imageS imageS 和 imageE 我正在尝试按以下方式保存图像 图像的类型Base64ImageField images imageA imageB imageC ima
  • 了解 Python 中的酸洗

    我最近接到一项作业 需要以腌制形式放置一本字典 其中每个键引用一个列表 唯一的问题是我不知道腌制形式是什么 谁能给我指出一些好的资源的正确方向来帮助我学习这个概念 pickle 模块实现了一个基本但强大的算法 用于序列化和反序列化 Pyth
  • 更新 Sqlalchemy 中的多个列

    我有一个在 Flask 上运行的应用程序 并使用 sqlalchemy 与数据库交互 我想用用户指定的值更新表的列 我正在使用的查询是 def update table value1 value2 value3 query update T
  • 查找模块中显式定义的函数 (python)

    好的 我知道您可以使用 dir 方法列出模块中的所有内容 但是有什么方法可以仅查看该模块中定义的函数吗 例如 假设我的模块如下所示 from datetime import date datetime def test return Thi
  • 当我在 Pandas 中使用 df.corr 时,我的一些列丢失了

    这是我的代码 import numpy as np import pandas as pd import seaborn as sns import matplotlib pyplot as plt data pd read csv dea
  • 在 macOS 中通过 Python 访问进程的压缩 RAM(顶部的 CMPRS)的方法?

    我试图弄清楚如何从 Python 访问任何给定进程占用的实际 RAM 量 我发现 psutil Process PID memory info rss 工作得很好 直到操作系统决定开始压缩某些进程的 RAM 然后 所有的 memory in
  • 根据开始列和结束列扩展数据框(速度)

    我有一个pandas DataFrame含有start and end列 加上几个附加列 我想将此数据框扩展为一个时间序列 从start值并结束于end值 但复制我的其他专栏 到目前为止 我想出了以下内容 import pandas as
  • 可以用 Django 制作移动应用程序吗?

    我想知道我是否可以在我的网站上使用 Django 代码 并以某种方式在移动应用程序 Flutter 等框架中使用它 那么是否可以使用我现在拥有的 Django 后端并在移动应用程序中使用它 所以就像models views etc 是的 有
  • 更改 python tkinter canvas 中的线坐标

    我画了一条线tkinter Canvas现在我想移动一端 这可能吗 例如和itemconfig import tkinter tk tkinter Tk canvas tkinter Canvas tk canvas pack line c
  • `list()` 被认为是一个函数吗?

    list显然是内置类型 https docs python org 3 library stdtypes html list在Python中 我看到底下有一条评论this https stackoverflow com a 53645813
  • django-admin.py makemessages 不起作用

    我正在尝试翻译一个字符串 load i18n trans Well Hello there how are you to Hola amigo que tal 我的 settings py 文件有这样的内容 LOCALE PATHS os
  • 如何使用 paramiko 查看(日志)文件传输进度?

    我正在使用 Paramiko 的 SFTPClient 在主机之间传输文件 我希望我的脚本打印文件传输进度 类似于使用 scp 看到的输出 scp my file user host user host password my file 1
  • 将文本注释到轴并对齐为圆

    我正在尝试在轴上绘制文本并将该文本与圆对齐 更准确地说 有一些具有不同坐标 x y 的点位于该圆内 并使用以下命令创建 ax scatter x y s 100 我想用圆圈连接并标记每个点 Cnameb 文本的坐标由 xp yp 定义 因此
  • Python 声音(“铃声”)

    我想让一个 python 程序在完成任务时通过发出嘟嘟声来提醒我 目前 我使用import os然后使用命令行语音程序说 进程完成 我更愿意它是一个简单的 铃 我知道有一个函数可以用于Cocoa apps NSBeep 但我认为这与此没有太
  • Python]将两个文本文件合并为一个(逐行)[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我是蟒蛇新手 我想做的是将文件 a 和文件 b 逐行合并到一个文件中 例如 text file a a n b n c text fi
  • 在 virtualenvwrapper 中激活环境

    我安装了virtualenv and virtualenvwrapper用这个命令我创建了一个环境 mkvirtualenv cv 它有效 创建后我就处于新环境中 现在我重新启动了我的电脑 我想activate又是那个环境 但是怎么样 我使
  • 在 Django shell 会话期间获取 SQL 查询计数

    有没有办法打印 Django ORM 在 Django shell 会话期间执行的原始 SQL 查询的数量 Django 调试工具栏已经提供了此类信息 例如 5 QUERIES in 5 83MS但如何从 shell 中获取它并不明显 您可

随机推荐

  • 在 R 函数中调用 SQL 函数

    我想知道是否可以致电SQL内的功能R功能 举例来说 我有这个虚拟数据并且SQL函数写在Postgres 9 3 CREATE TABLE tbl id VARCHAR 2 PRIMARY KEY name TEXT year born NU
  • ServiceStack - 是否有最新的、完整的文档?

    我正在尝试了解 ServiceStack 虽然它声称它拥有非常好的文档 但到目前为止情况似乎并非如此 是否有文档实际说明要使用哪些接口 基类以及它们的作用 只是 有一堆问题 并且能找到很少的答案 新的API设计 https github c
  • 如何安装气体预处理器?

    抱歉这个愚蠢的问题 我想安装气体预处理器 https github com yuvi gas preprocessor 但我只是不知道如何做到这一点 我与 pl 文件有什么关系 如何安装脚本 提前致谢 亚历克斯 好吧 我遇到了同样的问题 找
  • 如何在 jupyter 笔记本中添加/编辑代码片段?

    我尝试按照扩展的自述文件中给出的说明进行操作 我使用 Windows 并打开我的笔记本 我使用存储在目录中的 jupyter notebook exe Anaconda3 脚本 在 Anaconda3 目录中 我转到子目录 Anaconda
  • OLAP 中的锁定问题是什么?

    在一家当地金融机构 我因为向他们表达了我的观点 他们的程序员的痴迷 而被他们的程序员斥责 b 他们的 MS SQL Server 2005 OLAP SSAS 数据库中的锁定问题对我来说没有多大意义 OLTP 数据库是 SQL Server
  • 在 jQuery UI 日期选择器上禁用一周中的特定日期[重复]

    这个问题在这里已经有答案了 可能的重复 jQuery UI 日期选择器可以禁用周六和周日 以及节假日 吗 https stackoverflow com questions 501943 can the jquery ui datepick
  • VB.Net 列表.查找。将值传递给谓词

    使用带有自定义谓词的 List Find 时遇到一些问题 我有一个函数可以做到这一点 private function test Dim test As Integer keys Find AddressOf FindByOldKeyAnd
  • 在 Angular 2 应用程序上使用 Google Adsense 广告

    有没有办法在 Angular 2 应用程序上使用 Google Adsense 广告 我见过这个Angular 2 组件中的 Google AdSense 广告 https stackoverflow com questions 37580
  • Linux 在堆上的类中分叉

    当我遇到以下情况时会发生什么 A 类 保留动态分配的对象 B 它将创造和摧毁这些 B类 有一个由A调用的execute函数 execute将fork 子进程将使用execvp来运行另一个进程 但是 可以设置一个标志 以便父进程不会等待子进程
  • 刷新 MKMapView 上的 MKAnnotationView

    我想为我的自定义 MKAnnotationView 同步加载图像 我已经在使用 EGOImageView 框架 它与 UITableViews 配合得很好 但我无法让它在 MKMapView 上工作 图像似乎已加载 但我无法在地图上刷新它们
  • 在单元测试中但不在主程序中出现错误“Provider com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl not found”

    我正在用 C 构建一个应用程序 它使用 com gargoylesoftware htmlunit WebClient 来访问和检索网页中的信息 我的应用程序在主项目中运行良好 但是当我尝试构建单元测试来测试项目类时 出现以下错误 Fact
  • getDispatcherType() 对于 HttpServletRequest 类型未定义[重复]

    这个问题在这里已经有答案了 我已将 Java 动态 Web 项目导入到 Eclipse IDE 中 该项目已在 Eclipse IDE 中实现并正常工作 我收到一个 getDispatcherType 类型未定义HttpServletReq
  • 使用金字塔进行金字塔认证

    在金字塔文档中 Sqlalchemy Dispatch 教程使用虚拟数据security py 我需要使用mysql数据 所以我是这样实现的 我的登录代码 view config route name login renderer json
  • 使用 Chart.js 实现任意位置 50 个点的雷达图的最有效方法是什么

    考虑如下的数据序列 data angle 1 2 value 1 2 angle 355 2 value 5 6 我想在径向缩放图上显示这些数据 即指示每个点的值有多高的圆形带 以显示角度与值 每个数据集的角度都会发生微小但无法控制的变化
  • 并行执行多个AJAX请求,无需等待其他人响应

    我有一个问题 我需要执行多个 AJAX 请求 在一页上 请求同时开始 但他们似乎在等待前任返回 假设 page1 需要大约 3 秒来加载 第 2 页需要 2 秒才能加载 我得到的是 两者同时启动 page1 请求在 3 秒后返回 但问题是p
  • sed 删除行中除前 5 个字符之外的剩余字符

    使用 sed 删除行中除前 5 个前导字符之外的所有字符的 sed 命令是什么 我尝试过 向后 处理 恢复删除 但这不是最优雅的解决方案 这可能对你有用 GNU sed echo 1234567890 sed s 6g 12345 Or e
  • 使用映射字典更改字典的键

    我想通过传递映射字典和替换嵌套键的函数来替换字典的键名称 问题是我在嵌套字典中有多个名为 id 的键 我想用特定名称重命名这些 id 初始词典 initial dict id 1 netAmount 10 2 modifiedOn 2017
  • 如何使用 Google Web Toolkit 绘制图表?

    我正在考虑使用 Google Web Toolkit GWT 绘制图表的解决方案 到目前为止我只找到了gwt 图 http code google com p gwt diagrams 项目但似乎被放弃了 对于使用 GWT 绘制图表有什么建
  • 从函数返回后如何在Python中打印原始变量的名称?

    我有枚举并使用类似的变量myEnum SomeNameA myEnum SomeNameB等 当我从函数返回这些变量之一时 我可以打印它们的名称 例如myEnum SomeNameA 而不是他们返回的值 简短的回答 不 长答案 这可以通过使
  • Scipy 标签侵蚀

    如何在 numpy 数组中的标记区域周围保留一圈像素 在一个简单的情况下 我会减去侵蚀 当标签接触时 这种方法就不起作用了 我怎样才能得到B from A A array 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 2