问题标签 [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 回答
1323 浏览

python - np.roll vs scipy.interpolation.shift--discrepancy for integer shift values

I wrote some code to shift an array, and was trying to generalize it to handle non-integer shifts using the "shift" function in scipy.ndimage. The data is circular and so the result should wrap around, exactly as the np.roll command does it.

However, scipy.ndimage.shift does not appear to wrap integer shifts properly. The following code snippet shows the discrepancy:

roll vs shift

It can be seen that the first couple of values are highly discrepant, while the rest are fine. I suspect this is an implementation error of the prefiltering and interpolation operation when using the wrap option. A way around this would be to modify shiftfunc to revert to np.roll when the shift value is an integer, but this is unsatisfying.

Am I missing something obvious here?

Is there a way to make ndimage.shift coincide with np.roll?

0 投票
1 回答
261 浏览

swift - 按形状提高二维数组中最大滤波器的性能

假设我有一个二维数组

我将形状(菱形)的中心放在每一列上,然后将每一行放在形状内的最大数量(= 1)上,然后用最大数量替换形状中心。这喜欢图像形态中的膨胀和腐蚀

这是我在 Swift 中的实现:

前 2 个循环我迭代矩阵的每个元素以将形状的中心放置到上面。然后在接下来的 2 个循环中,我得到图像映射的所有元素以及形状元素(=1),然后比较它们以获得最大数量。没什么复杂的。结果是:

但是当我尝试使用真实图像 4096x4096(样本中的 Double 中的输入不在 Int 中)并且菱形为 41x41 时。与python(1秒)相比,性能超慢(10秒)。这是我在 python 中使用的代码result = maximum_filter(img, footprint=shape)。后面的源码看不到maximum_filter,所以自己实现。我得到了相同的结果,但性能比他们的慢得多。

0 投票
0 回答
347 浏览

python - 确定网格数据上的坐标以查找对象的长度

我正在识别二维numpy数组中浮点值大于某个阈值的对象。然后我需要确定每个对象的长轴长度,并确保对象的长轴长度满足以公里为单位的某个阈值。

通过使用 scipy.ndimage.measurements.label 模块,我可以在二维 numpy 数组中识别我想要的对象。然后,我可以使用 scikit-image regionprops 模块 (skimage.measure.regionprops) 确定每个对象主轴的长度。

但是,我不确定对象长度的单位是什么,因为 2-D numpy 数组本身没有关于坐标的任何信息。二维 numpy 数组本质上是一个映射到地球表面子域的数据集。此外,我还有另外两个与我的数据数组大小相同的二维 numpy 数组,其中一个数组包含每个网格点的纬度坐标,另一个包含经度坐标。我相信我需要以某种方式使用 lat/lon 数组来确定我的对象的主轴的长度,但我不知道如何。

这是我到目前为止的代码:

任何帮助将不胜感激。谢谢!

0 投票
1 回答
172 浏览

python - 将带有参数的函数应用到带有 ndimage 标记的数组

我有一个使用 scipy.ndimage 标记的数组,我想将每个元素乘以特定于其相应标签的因子。我以为我可以为此使用 ndimage.labeled_comprehension ,但是我似乎无法弄清楚如何将参数传递给函数。例如:

正如预期的那样,它给出了一个错误,因为fn()需要factors以某种方式输入它。标签理解能够做到这一点吗?

0 投票
2 回答
826 浏览

python - Python ndimage:将现有的 ndarray 转换为灰度

在我尝试使用 python 2.7 探索期间,我scipy制作了以下简单脚本:

这对图像进行了简单的处理,例如模糊和灰度。我设法从已经加载的图像中进行模糊处理,但是灰度呢?

我发现的最接近的是如何在 Python 中将 RGB 图像转换为灰度?但是他们没有提供使用 ndimage 的解决方案。

ndimage 也可以在打开期间转换,而不是使用已经打开的图像。

我还尝试使用http://ebanshi.cc/questions/108516/convert-rgb-image-to-grayscale-in-pythongreyscale中看到的方法来实现该方法:

但我收到以下错误:

回溯(最后一次调用):文件“/home/pcmagas/Kwdikas/python/Basic/scripy/scipy_image_examples.py”,第 83 行,在 main() 文件“/home/pcmagas/Kwdikas/python/Basic/scripy/ scipy_image_examples.py”,第 78 行,在主 saveImage(saveImagePath, processedData) 文件中“/home/pcmagas/Kwdikas/python/Basic/scripy/scipy_image_examples.py”,第 52 行,在 saveImage im.save(path) 文件中“/ usr/lib/python2.7/dist-packages/PIL/Image.py”,第 1675 行,保存 save_handler(self, fp, filename) 文件“/usr/lib/python2.7/dist-packages/PIL/PngImagePlugin .py",第 682 行,在 _save 中引发 IOError("cannot write mode %s as PNG" % mode) IOError: cannot write mode F as PNG

有任何想法吗?

0 投票
1 回答
668 浏览

python - 使用`scipy.ndimage.interpolation.rotate`旋转一批图像

假设这Xnumpy.ndarray一个包含一组彩色图像的张量。例如,X的形状是(100, 3, 32, 32); 即,我们有 100 个 32x32 rgb 图像(例如 CIFAR 数据集提供的图像)。

我想旋转图像X,我发现这可以使用 scipy 的scipy.ndimage.interpolation.rotate函数来完成。

但是,我每次只能对单个图像和单个颜色通道正确执行此操作,而我想一次将该功能应用于所有图像和所有颜色通道。

我尝试过并且到目前为止有效的方法如下:

但我想做的,可能看起来像这样

不起作用。

有没有办法申请scipy.ndimage.interpolation.rotate像 numpy.ndarray 张量这样的一批图像X

无论如何,有没有更好的方法来有效地旋转一批图像(存储在 a 中numpy.ndarray)?

0 投票
0 回答
196 浏览

python - Python,使用 scipy.ndimage affine_transform 缩小

我目前正在使用 affine_transform 放大图像

现在,我的问题是如何缩小?我尝试使用乘法[h*s*2,w*s*2,0]而不是除法 ( [h*s/2,w*s/2,0]) 进行缩放,但不是缩小而是向上和向左推动图像。

0 投票
0 回答
603 浏览

python - keras 中的 ROI 增强:scipy.ndimage 转换

我有一张带有感兴趣区域的图像。我想对该图像应用随机变换,同时保持感兴趣的区域正确。

我的代码采用这种格式的框列表[x_min, y_min, x_max, y_max]。然后它将盒子转换[up_left, up_right, down_right, down_left]为每个盒子的顶点列表。这是一个向量列表。所以我可以将转换应用于向量。

下一步是[x_min, y_min, x_max, y_max]在转换的顶点列表中寻找新的。

我的第一个应用程序是旋转,它们工作正常:

输入 输出

这是相应的代码。第一部分取自keras代码库,向下滚动到 NEW CODE 注释。如果我让代码工作,我会对将它集成到 keras 中感兴趣。所以我试图将我的代码集成到他们的图像预处理基础设施中:

如您所见,它们scipy.ndimage用于将转换应用于图像。

我的边界框有坐标[0,1],中心是[0.5, 0.5]。旋转需要围绕[0.5, 0.5]作为枢轴点应用。可以使用齐次坐标和矩阵来移动、旋转和移动向量。这就是他们为图像所做的。有一个现有的transform_matrix_offset_center功能,但偏移到float(width)/2 + 0.5. 这+0.5使得这不适合我在[0, 1]. 所以我自己移动向量。

对于旋转,此代码工作正常。我认为这将是普遍适用的。

但是对于缩放,这会以一种奇怪的方式失败。代码几乎相同:

输出是这样的:

放大 1放大 2

似乎有各种各样的问题:

  • 换档坏了。在图 1 中,ROI 和相应的图像部分几乎不重叠
  • 坐标好像换了。在图 2 中,ROI 和图像似乎沿 x 轴和 y 轴缩放不同。

我尝试通过使用来切换轴(zoom_matrix[:2, :2].T)[::-1, ::-1]。这导致了这一点:缩放3

现在比例因子坏了?我在这个矩阵乘法、转置、镜像、更改比例因子等方面尝试了许多不同的变体。我似乎无法做到正确。

而且无论如何,我认为原始代码应该是正确的。毕竟,它适用于旋转。在这一点上,我在想这是否是 scipy 的 ndimage 重采样的一个特性?

这是我的数学错误,还是缺少真正模拟 scipy ndimage 重采样的东西?

我已将完整的源代码放在 pastebin 上。我只更新了小部分,实际上这是来自keras的代码: https ://pastebin.com/tsHnLLgy

使用新增强功能和创建这些图像的代码在这里: https ://nbviewer.jupyter.org/gist/lhk/b8f30e9f30c5d395b99188a53524c53e

更新:

如果缩放因子被反转,则转换起作用。对于缩放,这个操作很简单,可以表示为:

这对应于对顶点应用逆变换。在图像重采样的背景下,这可能是有道理的。可以像这样重新采样图像

  • 为每个像素创建一个坐标向量。
  • 将逆变换应用于每个向量
  • 插值原始图像以找到向量现在指向的值
  • 将此值写入原始位置的输出图像

但是对于旋转,我没有反转矩阵并且操作正常。

问题本身,如何解决这个问题,似乎得到了回答。但我不明白为什么。

0 投票
1 回答
1332 浏览

python - scipy.ndimage.label:包括误差范围

在阅读了关于 scipy.ndimage.label 的一个有趣主题(用于识别对象的可变区域阈值 - python)之后,我想在标签中包含一个“误差范围”。

在上面的链接讨论中:如何也包括顶部的蓝点(假设它与橙色、最大的对象错误地断开了连接)?

我找到了结构属性,它应该能够通过更改数组(从 np.ones(3,3,3) 更改为任何其他内容(我希望它是 3D)来包含该点。但是,调整不幸的是,较大数组的“结构”属性似乎不起作用。它要么给出尺寸错误(RuntimeError:结构和输入必须具有相等的等级),要么它不会改变任何东西..

谢谢!

这是代码:

其中 a 是一个 3D 数组。

0 投票
1 回答
102 浏览

python - 除了 np.where 之外,Scipy 标记数组的索引计算速度更快

我正在研究一个大型阵列(3000 x 3000),我使用scipy.ndimage.label. 返回的是 3403 个标签和带标签的数组。我想知道这些标签的索引,例如标签 1 我应该知道标签数组中的行和列。所以基本上是这样的

我想为上面的所有 3403 标签创建一个索引列表。上面的方法似乎很慢。我尝试使用生成器,看起来没有改进。

有什么有效的方法吗?