Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vue.js/6.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
Opencv 如何在Numpy中获得图像的8个邻域作为第三维的值_Opencv_Numpy - Fatal编程技术网

Opencv 如何在Numpy中获得图像的8个邻域作为第三维的值

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

给定一个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_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或收缩谢谢,您可能想在函数的第二行键入“/”而不是“/”