Opencv 如何在Numpy中获得图像的8个邻域作为第三维的值
给定一个2d图像数据,对于每个像素P1,如何从中获得以下3d阵列Opencv 如何在Numpy中获得图像的8个邻域作为第三维的值,opencv,numpy,Opencv,Numpy,给定一个2d图像数据,对于每个像素P1,如何从中获得以下3d阵列 P9 P2 P3 P8 P1 P4 P7 P6 P5 img[x,y,:]=[P2,P3,P4,P5,P6,P7,P8,P9,P2] 不使用forloop,只需numpy操作(因为性能问题)这里有一种方法,使用零填充边界元素,并使用numpy步长和内置的有效滑动窗口提取- from skimage.util import view_as_windows as viewW def patches(a, patch_s
P9 P2 P3
P8 P1 P4
P7 P6 P5
img[x,y,:]=[P2,P3,P4,P5,P6,P7,P8,P9,P2]
不使用forloop,只需numpy操作(因为性能问题)这里有一种方法,使用
零填充边界元素,并使用numpy步长
和内置的有效滑动窗口提取-
from skimage.util import view_as_windows as viewW
def patches(a, patch_shape):
side_size = patch_shape
ext_size = (side_size[0]-1)//2, (side_size[1]-1)//2
img = np.pad(a, ([ext_size[0]],[ext_size[1]]), 'constant', constant_values=(0))
return viewW(img, patch_shape)
样本运行-
In [98]: a = np.random.randint(0,255,(5,6))
In [99]: a
Out[99]:
array([[139, 176, 141, 172, 192, 81],
[163, 115, 7, 234, 72, 156],
[ 75, 60, 9, 81, 132, 12],
[106, 202, 158, 199, 128, 238],
[161, 33, 211, 233, 151, 52]])
In [100]: out = patches(a, [3,3]) # window size = [3,3]
In [101]: out.shape
Out[101]: (5, 6, 3, 3)
In [102]: out[0,0]
Out[102]:
array([[ 0, 0, 0],
[ 0, 139, 176],
[ 0, 163, 115]])
In [103]: out[0,1]
Out[103]:
array([[ 0, 0, 0],
[139, 176, 141],
[163, 115, 7]])
In [104]: out[-1,-1]
Out[104]:
array([[128, 238, 0],
[151, 52, 0],
[ 0, 0, 0]])
如果您想要一个3D
数组,您可以在末尾添加一个重塑
,如下所示-
out.reshape(a.shape + (9,))
但是,请注意,这将创建一个副本,而不是我们从函数本身获得的有效的基于步幅的视图。您想如何处理边界元素?我想要一个3D数组,边界可以设置为0或收缩谢谢,您可能想在函数的第二行键入“/”而不是“/”