<p>不是为了贬低@MRocklin精心设计的答案,而是为了补充更多内容。在</p>
<p>我也经常发现自己需要做一些事情,如边缘检测和其他图像处理技术的大规模数组数据。由于Dask是一个非常好的库,可以在大型数组数据上构建和探索这样的计算工作流,因此我们在一个名为<a href="http://dask-image.github.io/" rel="nofollow noreferrer">dask-image</a>的GitHub组织中为一些常见的图像处理技术组合了一些实用程序库。它们在很大程度上被设计成模仿SciPy的<a href="https://docs.scipy.org/doc/scipy/reference/ndimage.html" rel="nofollow noreferrer">ndimage</a>API。在</p>
<p>至于在Dask中使用Sobel运算符,可以使用来自<a href="https://github.com/dask-image/dask-ndfilters" rel="nofollow noreferrer">dask-ndfilters</a>(许可证)的<a href="https://dask-ndfilters.readthedocs.io/en/latest/dask_ndfilters.html#dask_ndfilters.sobel" rel="nofollow noreferrer">^{<cd1>}</a>函数在Dask数组上执行此操作。它在引擎盖下的方块上处理适当的光环,返回一个新的达斯克阵列。在</p>
<p>由于SciPy的<a href="https://docs.scipy.org/doc/scipy-0.19.0/reference/generated/scipy.ndimage.sobel.html#scipy.ndimage.sobel" rel="nofollow noreferrer">^{<cd1>}</a>函数(以及dask ndfilters的<code>sobel</code>)在一维上运行,因此需要映射到每个轴和堆栈上以获得完整的Sobel运算符结果。也就是说,这是很简单的。下面是一个简短的片段,展示了如何在随机Dask数组上执行此操作。还包括沿XZ平面切一片。尽管可以很容易地获取其他切片或对数据执行附加操作。在</p>
<p>希望这有帮助。:)</p>
<pre class="lang-python prettyprint-override"><code>import dask.array as da
import dask_ndfilters as da_ndfilt
d = da.random.random((100, 120, 140), chunks=(25, 30, 35))
ds = da.stack([da_ndfilt.sobel(d, axis=i) for i in range(d.ndim)])
dsp = ds[:, :, 0, :]
asp = dsp.compute()
</code></pre>