Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python数组中查找和替换子数组_Python_Arrays_Numpy_Replace_Noise Reduction - Fatal编程技术网

在python数组中查找和替换子数组

在python数组中查找和替换子数组,python,arrays,numpy,replace,noise-reduction,Python,Arrays,Numpy,Replace,Noise Reduction,我有一个6600X5100 numpy数组,它代表一个黑白图像。 我想清除此图像中的黑色像素噪声-删除所有短于2像素的黑色像素线(垂直和水平) 所以如果我有这样的东西: [0, 0, 0, 0, 0, 255] [0, 255,255, 255, 255, 0 ] [0, 255,255, 255, 0, 0 ] [0, 255,255 ,255, 0, 255] [0, 255,255, 255, 0, 255] [0, 0, 0, 0, 0, 0 ] [0

我有一个6600X5100 numpy数组,它代表一个黑白图像。 我想清除此图像中的黑色像素噪声-删除所有短于2像素的黑色像素线(垂直和水平)

所以如果我有这样的东西:

[0,  0,  0,   0,   0, 255]
[0, 255,255, 255, 255, 0 ]
[0, 255,255, 255,  0,  0 ]
[0, 255,255 ,255,  0, 255]
[0, 255,255, 255,  0, 255]
[0,  0,  0,   0,   0,  0 ]
[0,  0,  0,   0,   0,  0 ]
[0, 255,255, 255,  0 , 0 ]
[0, 255,255, 255,  0,  0 ]
[0, 255,255 ,255,  0,  0 ]
[0, 255,255, 255,  0,  0 ]
[0,  0,  0,   0,   0,  0 ]
输出数组如下所示:

[0,  0,  0,   0,   0, 255]
[0, 255,255, 255, 255, 0 ]
[0, 255,255, 255,  0,  0 ]
[0, 255,255 ,255,  0, 255]
[0, 255,255, 255,  0, 255]
[0,  0,  0,   0,   0,  0 ]
[0,  0,  0,   0,   0,  0 ]
[0, 255,255, 255,  0 , 0 ]
[0, 255,255, 255,  0,  0 ]
[0, 255,255 ,255,  0,  0 ]
[0, 255,255, 255,  0,  0 ]
[0,  0,  0,   0,   0,  0 ]
性能在这里至关重要,因此在阵列上进行简单的循环是不行的。 有没有办法快速查找和替换阵列中的子阵列? 因此,如果[0,255,255,0]或[0,255,0]在图像数组中,请将这些部分替换为0


或者,如果您有更好的解决方案,我将不胜感激。

您可能需要查看scikit图像的形态过滤器

您可以定义简单的过滤器,并使用
打开
功能来清理图像。您将不得不使用过滤器,以获得完全符合您需要的过滤器,但该库速度非常快

import numpy as np
from skimage.morphology import opening

img = np.array([[0,  0,  0,   0,   0, 255],
                [0, 255,255, 255, 255, 0 ],
                [0, 255,255, 255,  0,  0 ],
                [0, 255,255 ,255,  0, 255],
                [0, 255,255, 255,  0, 255],
                [0,  0,  0,   0,   0,  0 ]])


# horizontal and vertical filters
hf = np.array([[0,0,0,0,0],
               [0,1,1,1,0],
               [0,0,0,0,0]])
vf = hf.T

# apply each filter in turn
out = opening(opening(img, hf),vf)

out
# returns:
array([[  0,   0,   0,   0,   0,   0],
       [  0, 255, 255, 255,   0,   0],
       [  0, 255, 255, 255,   0,   0],
       [  0, 255, 255, 255,   0,   0],
       [  0, 255, 255, 255,   0,   0],
       [  0,   0,   0,   0,   0,   0]])

我的解决方案与现有解决方案类似,但我使用二维卷积:

import numpy as np
from scipy.signal import convolve2d as conv2

in_arr = np.array([
    [0,  0,  0,   0,   0, 255],
    [0, 255,255, 255, 255, 0 ],
    [0, 255,255, 255,  0,  0 ],
    [0, 255,255 ,255,  0, 255],
    [0, 255,255, 255,  0, 255],
    [0,  0,  0,   0,   0,  0 ]])

padded = np.pad(in_arr, 1, mode='constant', constant_values=0)

# Create a kernel
kern = np.ones((1, 3))

# Perform convolution
mask = np.logical_and((conv2(in_arr, kern,   mode='same') // 255) >= 2,
                      (conv2(in_arr, kern.T, mode='same') // 255) >= 2)

# Apply mask:
out_arr = in_arr * mask

这也会产生所需的结果。

是否使用或接受函数?
scikit
可能是真正有趣的解决方案的复制品!谢谢我用“关闭”代替“打开”,因为255在我的图像中代表白色。