如何仅使用 numpy 腐蚀图像?

发布于 2025-01-10 06:58:07 字数 628 浏览 0 评论 0原文

我有以下 M_Matrix

M = np.array([[0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1],
              [1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1],
              [1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1],
              [1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1]])

,我想使用此结构元素来删除它。

st_element = np.ones((3, 3))

最终的输出看起来像这样

Output = np.array([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
                   [0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0],
                   [0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0],
                   [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]])

我的问题是:是否可以仅使用 numpy_functions 进行侵蚀? 谢谢

I have the following M_Matrix

M = np.array([[0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1],
              [1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1],
              [1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1],
              [1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1]])

which I want to erose using this structuring element.

st_element = np.ones((3, 3))

The final output sould seem like this

Output = np.array([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
                   [0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0],
                   [0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 0],
                   [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]])

My question is: is it possible to do erosion using only numpy_functions ?
thanks

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

〆一缕阳光ご 2025-01-17 06:58:08

使用 sliding_window_view (不是最快的,但也不是最慢的)

import numpy as np
from numpy.lib.stride_tricks import sliding_window_view

M = np.array([[0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1],
              [1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1],
              [1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1],
              [1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1]]).astype(bool)

st_element = np.ones((3, 3), dtype=bool)

padded = np.pad(M, st_element.shape[0]//2)

windows = sliding_window_view(padded, window_shape=st_element.shape)

eroded = np.all(windows | ~st_element, axis=(-1, -2))

检查它是否与 scipy 相同:

from scipy.ndimage import binary_erosion
np.testing.assert_array_equal(eroded, binary_erosion(M, st_element))

Using sliding_window_view (not the fastest, but not the slowest either)

import numpy as np
from numpy.lib.stride_tricks import sliding_window_view

M = np.array([[0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1],
              [1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1],
              [1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1],
              [1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1]]).astype(bool)

st_element = np.ones((3, 3), dtype=bool)

padded = np.pad(M, st_element.shape[0]//2)

windows = sliding_window_view(padded, window_shape=st_element.shape)

eroded = np.all(windows | ~st_element, axis=(-1, -2))

Checking that it gives the same as scipy:

from scipy.ndimage import binary_erosion
np.testing.assert_array_equal(eroded, binary_erosion(M, st_element))
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文