如何在numpy数组中解析模式?

时间:2015-01-16 17:22:27

标签: python arrays numpy

请原谅这个奇怪的标题,我真的不能想出合适的措辞。

说我有一个类似的数组:

arr = [[0 1 1 1 1 1 1 1 0],
       [0 0 1 1 1 1 1 0 0],
       [0 0 0 1 1 1 0 0 0],
       [0 0 0 0 1 0 0 0 0],
       [0 0 0 0 0 0 0 0 0]]

我希望“蚀刻”掉1的{​​{1}} s,这会导致:{/ p>

0

我已尝试使用arr = [[0 0 1 1 1 1 1 0 0], [0 0 0 1 1 1 0 0 0], [0 0 0 0 1 0 0 0 0], [0 0 0 0 0 0 0 0 0], [0 0 0 0 0 0 0 0 0]] . 之类的一些东西,但它似乎效率低(并且具有边缘效果)。有这么好的简短方法吗?

2 个答案:

答案 0 :(得分:22)

Morpholocial erosion可以在这里使用。

形态侵蚀将(i,j)处的像素设置为以(i,j)为中心的邻域中的所有像素的最小值。 source

data
Out[39]: 
array([[0, 1, 1, 1, 1, 1, 1, 1, 0],
       [0, 0, 1, 1, 1, 1, 1, 0, 0],
       [0, 0, 0, 1, 1, 1, 0, 0, 0],
       [0, 0, 0, 0, 1, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 0, 0]])

structure
Out[40]: 
array([[0, 1, 0],
       [1, 1, 1],
       [0, 1, 0]])

eroded = binary_erosion(data, structure, border_value=1).astype(int)

eroded
Out[42]: 
array([[0, 0, 1, 1, 1, 1, 1, 0, 0],
       [0, 0, 0, 1, 1, 1, 0, 0, 0],
       [0, 0, 0, 0, 1, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 0, 0]])

答案 1 :(得分:12)

考虑使用十字形内核进行卷积。

import numpy as np
from scipy.signal import convolve2d
kernel = np.array([[0,1,0], [1,1,1], [0,1,0]])
mask = convolve2d(arr, kernel, boundary='symm', mode='same')
arr[mask!=5] = 0

此方法适用于所有输入:

In [143]: D = np.random.random_integers(0,1, (5,5))

In [144]: D2 = D.copy()

In [145]: mask = convolve2d(D, kernel, boundary='symm', mode='same')

In [146]: D2[mask!=5] = 0

In [147]: binary_erosion(D, kernel2, border_value=1).astype(int)
Out[147]: 
array([[0, 1, 0, 1, 0],
       [0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0]])

In [148]: D2
Out[148]: 
array([[0, 0, 0, 1, 0],
       [0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0]])

In [149]: D
Out[149]: 
array([[1, 0, 1, 1, 1],
       [0, 1, 0, 1, 0],
       [0, 1, 0, 1, 0],
       [0, 0, 1, 1, 0],
       [1, 0, 1, 0, 0]])
In [150]: kernel
Out[150]: 
array([[0, 1, 0],
       [1, 1, 1],
       [0, 1, 0]])

In [151]: kernel2
Out[151]: 
array([[0, 1, 0],
       [1, 0, 1],
       [0, 1, 0]])

查看角落以查看差异。