问题标签 [ndimage]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
2159 浏览

python - 直接将线段“绘制”到 numpy 数组

我在 python 中实现的第一个项目之一是对棒状渗透进行蒙特卡罗模拟。代码不断增长。第一部分是棒状渗透的可视化。在宽度*长度的区域中,用随机的起始坐标和方向绘制具有一定长度的直棒的定义密度(棒/面积)。由于我经常使用 gnuplot,因此我将生成的 (x, y) 开始和结束坐标写入一个文本文件,以便之后对其进行 gnuplot。

然后我在这里找到了一种使用 scipy.ndimage.measurements 分析图像数据的好方法。使用 ndimage.imread 以灰度方式读取图像。生成的 numpy 数组进一步减少为布尔值,因为我只对不同棒之间的连接感兴趣。然后使用 ndimage.measurements 分析生成的集群。这使我能够找出是否有从一侧连接到另一侧的路径。一个最小化的例子是here。

虽然这主要适用于对大量不同棒密度进行 1000 次迭代的蒙特卡罗模拟,但最终运行 8 小时或更长时间。这部分是由于创建的图像和阵列非常大,并且为更高的密度绘制了数千个棒。原因是我想模拟一系列几何形状(例如,500 到 20000 像素之间的长度),同时最大限度地减少像素化导致的误差。

我想最好的方法是不使用图像数据并将其视为矢量问题,但我什至不知道如何启动算法。许多连接也可能导致大型数据阵列。

继续使用上述方法,显然将数据写入文件并重新读取它不是很有效。因此,我正在寻找加快速度的方法。作为第一步,我使用 matplotlib 创建图像,但是至少在使用单独的绘图调用绘制每个棒时,对于更多数量的棒来说,速度会慢 10 倍。在数组中创建棒坐标列表并使用一次绘图调用绘制完整列表可能会加快速度,但仍然会留下写入和读取图像的瓶颈。

您能否指出一种有效的方法来直接生成表示棒的黑白图像的布尔型 numpy 数组?也许绘制坐标列表并以某种方式将图形转换为数组?我还发现了这个有趣的讨论,其中线条被绘制到 PIL 图像上。这可能比 matplotlib 快吗?

0 投票
1 回答
1812 浏览

python - scipy.ndimage.zoom 结果取决于图像大小

我注意到 scipy.ndimage.zoom 的结果取决于原始图像的大小。在以下代码示例中,会生成一个棋盘图像,然后使用 ndimage.zoom 进行缩放。如果一个棋盘格只有 2x2 像素,则缩放系数似乎太大并且生成的图像会被裁剪。相反,如果图块的尺寸为 10x10,则结果看起来不错。

02x02 瓷砖:2x2 瓷砖

10x10 瓷砖:10x10 瓷砖

据了解,我一直在使用 scipy.misc.imresize ,它没有显示这种行为,但我想避免对 PIL 的额外依赖。

我做错了什么还是这是缩放中的错误?

0 投票
1 回答
1592 浏览

python - 在 Python 中:二维 numpy 数组中特定值区域的质心

我正在处理一系列numpy.ndarray由 0.0 到 1.0 的 101x101 值。所有数组如下所示:

现在,假设我有一个threshold value=0.2:我如何定位矩阵中的值的“区域”,从而在它们中超出阈值?在这种情况下,我会寻找值为>=0.2.

特别是,我想:

  1. 计算超过的区域数threshold value
  2. 确定他们的centers of mass.

我知道我可以通过以下方式计算后者:ndimage.measurements.center_of_mass(),但我看不到它如何仅应用于矩阵的“区域”而不是整个事物。

编辑

请考虑我所指的“区域”具有不规则的形状。

0 投票
1 回答
106 浏览

python - 在大数组(栅格)中选择大小过滤元素

我可能需要帮助:

在大型布尔 numpy 数组(导入栅格)(2000x2000)上,我尝试仅选择大于 800 个单位的元素。(总元素数 > 1000)

我尝试了一个循环:

但我确信有更好的方法来做到这一点。

0 投票
1 回答
3937 浏览

python - Scipy ndimage median_filter 原点

我有一个二进制数组,比如说a = np.random.binomial(n=1, p=1/2, size=(9, 9)). 我使用3 x 3内核对其执行中值过滤,例如b = nd.median_filter(a, 3). 我希望这应该基于像素及其八个邻居执行中值滤波。但是,我不确定内核的位置。文件说,

原点:标量,可选。

如果默认值为零,则应该将当前像素和3 x 3网格放在右侧和底部,不是吗?默认值不应该是中心footprint吗?在我们的3 x 3示例中,哪个对应(1, 1)(0, 0)

谢谢。

0 投票
1 回答
2867 浏览

python - 从 URL 读取图像,使用 misc.imread 返回扁平数组而不是彩色图像

我正在尝试从 URL 读取图像(由 Google 的静态地图 API 提供)。

图像在浏览器中显示正常。

在此处输入图像描述

https://maps.googleapis.com/maps/api/staticmap?maptype=satellite¢er=37.530101,38.600062&zoom=14&size=256x278&key= ...

但是当我尝试使用 misc.imread 将它加载到数组中时,它似乎最终成为一个二维数组(即扁平化,没有 RGB 颜色)。

这是我正在使用的代码(我隐藏了我的 API 密钥):

我所期望的是一个 3-d 形状数组 (278, 256, 3)。

也许它没有正确读取文件?

0 投票
1 回答
553 浏览

python - 对象的尺寸沿维度?

我有一个 3D 标签矩阵。使用ndimage.sum我可以获得标记的对象大小,这对于基于体积的过滤非常有用。我的问题是:例如,我能否轻松地获得沿每个轴的对象大小,以消除仅在一个平面上的对象?

一些代码可能会更清晰......

现在,不是用一维表示标记对象的体积,有没有办法让 3D 数组在每个维度上表示它们的表面?代表它们在每个平面上的表面的 30 维数组也可以,尽管我更喜欢第一个选项。

0 投票
1 回答
3352 浏览

python - 想要检测拼图中的边角部分,但找不到每个部分的 4 个角

我有一个拼图游戏,想自动区分该拼图中的“正常”、“边缘”和“角”块(我希望这些词的定义对于曾经玩过拼图游戏的人来说是显而易见的)

为了使事情更容易,我从 9 个部分开始,其中 4 个是正常的,4 个是边缘,一个是角。原始图像如下所示: 在此处输入图像描述

我现在的第一个想法是检测每个单件的 4 个“主要角”,然后进行如下操作:

  • 如果两个相邻“主要角”之间的轮廓是一条直线,则它是一条边
  • 如果三个相邻“主要角”之间的两个轮廓是直线,则它是一个角
  • 如果两个相邻的“主要角”之间没有直线,这是正常的部分。

但是,我在为每件作品提取四个“主要角”时遇到问题(我试图为此使用哈里斯角)

我的代码,包括一些预处理,附在下面,连同一些结果,包括我得到的哈里斯角。任何输入表示赞赏。

在此处输入图像描述

0 投票
1 回答
2482 浏览

python - 用 scipy.ndimage.label 标记 3d numpy 数组

我有一个由 1 和 0 组成的大型 3d numpy 数组。我想使用 scipy.ndimage.label 工具来标记每个子阵列(2d)中的特征。

3d 数组的子集如下所示:

当我在这个子集的一小部分上使用标签工具时,它是正确的:

但是,当我使用整个子集时,标签工具无法正常工作:

任何想法如何解决这个问题?

附言。我试图标记的完整数组由 350219 个二维数组组成。

0 投票
1 回答
1915 浏览

python - 如何将 numpy 中的 3D 密度图的主轴与笛卡尔轴对齐?

我有一个 nxnxn numpy 数组,其中包含立方网格上的密度值。我正在尝试将密度图的惯性主轴与网格的笛卡尔 x、y、z 轴对齐。到目前为止,我有以下内容:

在这里,我假设惯性张量的特征向量定义了旋转矩阵(基于这个问题和谷歌结果,比如这个网页似乎是正确的?)但这并没有给我正确的结果。

我希望打印的矩阵是:

(这可能是错误的)但甚至没有从单位向量开始。我得到的是:

我不确定问题是我的代码还是我对旋转主轴的假设,但我们将不胜感激。