在python数组中查找和替换子数组
我有一个6600X5100 numpy数组,它代表一个黑白图像。 我想清除此图像中的黑色像素噪声-删除所有短于2像素的黑色像素线(垂直和水平) 所以如果我有这样的东西:在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
[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在我的图像中代表白色。