gpt4 book ai didi

python - scipy.ndimage.convolve 背后的数学

转载 作者:太空宇宙 更新时间:2023-11-03 15:00:58 29 4
gpt4 key购买 nike

虽然我已经找到了关于 scipy.ndimage.convolve 函数的文档并且我“几乎知道它做了什么”,但当我尝试计算结果数组时我无法遵循数学公式。让我们举个例子:

a = np.array([[1, 2, 0, 0],`
[5, 3, 0, 4],
[0, 0, 0, 7],
[9, 3, 0, 0]])

k = np.array([[1,1,1],[1,1,0],[1,0,0]])

from scipy import ndimage

ndimage.convolve(a, k, mode='constant', cval=0.0)

# Why is the result like this ?

array([[11, 10, 7, 4],
[10, 3, 11, 11],
[15, 12, 14, 7],
[12, 3, 7, 0]])

我会很感激一步一步的计算。

最佳答案

NDImage.convolve 的详细信息

尽管我知道基本的 np.convolve,但我无意中发现了这个 NDImage 卷积,而且该文档没有太多 self 解释,所以我努力研究并补充了早期的解释性帖子:

A.基础知识:

引用:如果你对卷积的概念不是很扎实,可以引用以下内容

https://en.wikipedia.org/wiki/Kernel_(image_processing) ,

https://en.wikipedia.org/wiki/Convolution

  1. 本质上,NDimage.convolve 有 4 种模式,这篇文章重点介绍 Constant 模式,您可以使用 cval=0 或其他指定的值,并根据需要添加填充的行和列(稍后会解释位)

  2. 卷积本质上是从左到右滑动内核,然后再次从左到右逐步下降,直到达到所需(相同数量)的卷积元素数量

  3. 该函数将计算所需的填充行/列。在这种情况下,过滤器 K 是 3 x 3 矩阵,源图像是矩阵 a 是 4 x 4,因此您需要在顶部和底部填充两行,在左右两行填充(4 + 2 = 6,并且所需的行数或列数为 3 + 1 + 1 + 1 = 6,每张幻灯片将需要额外的行或列)

B.操作:

  1. 在数组 a 的顶部和左侧添加一行和一列零(将 a 3 x 3 均匀地卷积到 4 x 4,

  1. 将内核 K 翻转为 Kflip:[[0,0,1], [0,1,1], [1,1,1]]你可以使用 numpy np.flip (为什么需要翻转基本上与卷积与相关的概念有关,它们就像相反方向的双胞胎)

  2. 将翻转的 K 矩阵滑动到这个大小为 6 x 6 的扩展矩阵 [[0,0,0,0,0], [0,1,2,0,0], [0,5,3 ,0,4,0], [0,0,0,0,7], [0,9,3,0,0,0], [0,0,0,0,0]]

  3. 对于滑动窗口的第一步(注意内核列的第一行将与填充的零进行卷积),您得到:

翻转的 K 点和 [[0,0,0], [0,1,2], [0,5,3]] = 11 (1*1+1*2+1*5+1*3 , 其他为零)

(点和指的是内点逐元素相乘的和,基本上就是将给定的两个矩阵相同位置的对应元素相乘)

  1. 将 K 向右滑动一步,您将得到 10(由于填充了零,第一行全为零,第二行:1*2+,第三行 1*3 + 1*4,第四行全为零由于 [0,0,0,0,7])

  2. 同样,您向右滑动另外两步以获得卷积矩阵的所有四个元素(注意这一行的第 4 行,我们再次在扩展的填充行/列上进行部分卷积)(

  3. 然后将 K 过滤器向下滑动一行并重置到“扩展/填充矩阵”的最左侧

您将再次得到相同的 10(第一行:1*2+,第二行 1*3 + 1*4),依此类推

关于python - scipy.ndimage.convolve 背后的数学,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37969197/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com