问题标签 [convolution]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
10366 浏览

c# - 无 FFT 的一维快速卷积

我需要针对 2 个大阵列的一维卷积。我在 C# 中使用此代码,但运行需要很长时间。

我知道我知道!FFT 卷积非常快。但在这个项目中我不能使用它。不使用 FFT 是项目的限制(请不要问为什么:/)。

这是我在 C# 中的代码(顺便说一下,从 matlab 移植):

那么,有人知道任何快速卷积算法widthout FFT吗?

0 投票
0 回答
1532 浏览

c++ - 如何在 OpenCV 中使用 3d 数组或矩阵处理 3d 高斯卷积

我有一个像这样的 3d 数组。

我想在这个数组上处理一个 3d 高斯卷积来模糊数组。使数组中的数据以某种方式连续。

但是 OpenCV 只有 1d 或 2d dft()、filter2d()、convolve()。

那么如何在 OpenCV 中处理一个 3d 卷积呢?以及如何有效地构建 3d 高斯内核?以及如何将 3d 卷积分成多个 2d 或 1d 卷积?

0 投票
2 回答
1440 浏览

image-processing - Convolution theory vs implementation

I study convolution in image processing as it is a part of the curriculum, I understand the theory and the formula but I am confused about its implementation.

The formula is:


enter image description here


What I understand

The convolution kernel is flipped both horizontally and vertically then the values in the kernel are multiplied by the corresponding pixel values, the results are summed, divided by "row x column" to get the average, and then finally this result is the value of the pixel at the center of the kernel location.

Confusion in implementation

When I run the example convolution program from my course material and insert as input a 3x3 convolution kernel where:

1st row: (0, 1, 0)

2nd row: (0, 0, 0)

3rd row: (0, 0, 0)

The processed image is shifted down by one pixel, where I expected it to shift upwards by one pixel. This result indicates that no horizontal or vertical flipping is done before calculating (as if it is doing correlation).

I thought there might be a fault in the program so I looked around and found that Adobe Flex 3 and Gimp are doing this as well.

I don't understand, is there something that I missed to notice?

Appreciate any help or feedback.

0 投票
2 回答
2704 浏览

image - 频域图像卷积 (MATLAB)

我正在为一个类编写一个 c++ 程序来在频域中进行卷积,我注意到最终结果在拐角处有错误。所以我在 MATLAB 中进行了尝试,得到了完全相同的结果。例如

使用来自http://engronline.ee.memphis.edu/eece7214/images/Downlodable.htm的摄影师

我做了

在提取左上角之前,我看了看 c,发现它与 imfilter(a, h) 的答案相同,只是它从角落翻译了一点点。冈萨雷斯的数字图像处理对此只字未提,谷歌在没有任何帮助的情况下让我的眼睛因搜索而流血(每个人都重复冈萨雷斯给出的提取左上角的相同指令)。

与主要问题无关,我还想知道为什么我必须在这个 MATLAB 代码中除以 256。在我的 C++ 代码中,我不必对结果进行缩放,得到的答案与此 MATLAB 代码相同。

编辑:我做了一点一维向量的玩弄(做 conv 和 ifft(fft*fft)),我认为“错误”来自显示左上角的“完整”卷积的输出,而不是“相同”的卷积。但即使是这种情况,我也不确定如何确定性地编码“提取这部分只是为了得到'相同'而不是'完整'的左上角 256x256 部分”

编辑:更多的谷歌搜索通过http://jeremy.fix.free.fr/IMG/pdf/fftconvolution.pdf产生了一个可能的解决方案。它有很多我以前从未见过的数学符号,但据我所知,如果你正在卷积 nxn 和 mxm,请提取 m:(m+n-1) 以从fft 近似。我仍然想听听比我更专业的人的意见,所以不要选择不根据此更新发表评论!

0 投票
1 回答
1397 浏览

c# - 如何在 MonoTouch 中优化这种图像卷积过滤方法?

在意识到 MonoTouch 不存在实时图形效果库后,我决定自己编写。经过一些研究,我编写了一个完美运行的卷积方法,但即使使用不安全的代码,也非常慢。我做错了什么?我缺少一些优化吗?

这是我的 c# 课程,任何建议,无论多小,都欢迎!

0 投票
1 回答
692 浏览

matlab - MATLAB SPMD 和 nlfilter - 更改窗口大小

我正在使用 John Burkardt 的CONTRAST2_SPMD的修改版本在大型灰度图像上运行 3x3 方差计算。这样做的好处是我可以使用 PCT 在我的本地机器上使用 8 个内核,但是我想更改窗口大小(目前是 3x3),但我想尝试几个窗口大小。我将如何修改下面的代码以允许可变窗口大小?(我将使用奇数的方形窗口,例如 3x3、5x5、7x7、9x9 等)

提前感谢您的帮助。

0 投票
3 回答
6035 浏览

algorithm - 如何用卷积解决精确的模式匹配

当字母表由 5 个符号 {a, b, c, d, #} 组成时,我试图解决一个精确的模式匹配问题,其中特殊符号 # 匹配任何符号(包括它自己)。

例如,如果 T = ab#aca#ab#a 和 P = da#ac 则 P 从 T 中的位置 3 开始出现。我试图找到一个 O(nlogn) 时间算法来确定长度为 n 的模式 P出现在长度为 2n 的文本 T 中,假设 # 符号在 T 和 P 中出现(可能 O(n) 次)。

关于如何用卷积解决它的任何建议?

0 投票
5 回答
1832 浏览

matlab - 极大的加权平均

我正在使用 64 位 matlab 和 32g 的 RAM(你知道的)。

我有一个包含 130 万个数字(整数)的文件(向量)。我想制作另一个相同长度的向量,其中每个点是整个第一个向量的加权平均值,由与该位置的反距离加权(实际上是位置 ^-0.1,而不是 ^-1,但用于示例目的) . 我不能使用 matlab 的“过滤器”功能,因为它只能平均当前点之前的东西,对吧?为了更清楚地解释,这里是 3 个元素的示例

所以新向量中的每个点都是整个第一个向量的加权平均值,权重为 1/(与该位置的距离+1)。

我可以为每个点重新制作权重向量,然后逐个元素计算结果向量,但这需要 for 循环的 130 万次迭代,每个迭代包含 130 万次乘法。我宁愿使用直接矩阵乘法,将 1x1.3mil 乘以 1.3milx1.3mil,这在理论上可行,但我无法加载那么大的矩阵。

然后我尝试使用 shell 脚本制作矩阵并在 matlab 中对其进行索引,因此一次只调用矩阵的相关列,但这也需要很长时间。

我不必在 matlab 中执行此操作,因此人们对使用如此大的数字并获得平均值的任何建议将不胜感激。由于我使用的是 ^-0.1 而不是 ^-1 的权重,因此它不会下降得那么快 - 与原始点的权重 1 相比,第 100 万个点的权重仍然为 0.25,所以我不能只是削减它当它变大时关闭。

希望这已经足够清楚了吗?

这是下面答案的代码(所以可以格式化?):

0 投票
1 回答
656 浏览

c++ - 在 x 方向的图像的每一行中进行 1D 卷积

我想在 x 方向的图像的每一行中计算一维卷积。

为此,我尝试使用http://www.na-mic.org/svn/Slicer3-lib-mirrors/trunk/Insight/Examples/Filtering/LaplacianRecursiveGaussianImageFilter1.cxx中显示的示例

当我尝试“更新”最后一个过滤器时,它会产生异常。这是一个“堆栈溢出”,它转到“itkObject.cxx”不知道我做错了什么,因为我只是复制了示例中的代码。

另一件更重要的事情是,我发现了很多关于卷积的信息,但没有针对在 x 方向上图像的每一行中执行此一维卷积的特定信息。还有其他更好的例子可以看看吗?使用更好的类?

0 投票
2 回答
1304 浏览

c - 在 DSP 开发板上使用 C 流水线化一维卷积算法

我目前使用的 DSP 板是 Spectrum Digital 的 DSK6416,我正在用 C 语言实现卷积算法,以将输入语音样本与预先录制的脉冲响应阵列进行卷积。目标是对着麦克风讲话,并输出处理后的效果,使我们听起来像是在获得脉冲响应阵列的环境中讲话。

我现在面临的挑战是实时进行卷积,并保持 8 kHz 的中断函数的输入和输出速度。

这是我的头脑风暴想法:

我目前无效的低效实现如下:

中断将停止卷积过程,输出索引,并以 8 kHz 或 1/8 kHz 秒恢复卷积。

然而,卷积的完整迭代运行速度比 1/8kHz 秒慢得多。所以当中断要从输出数组中输出数据时,数据还没有准备好。

我对快速流水线卷积算法的理想实现:

随着时间的推移,我们将在后台运行许多卷积过程,同时输出完成的过程。将有许多管道并行运行。

如果我使用流水线方法,我们需要在后台运行 N = 10000 个流水线进程......

现在我有了这个想法(至少我认为我有,我可能错了),我不知道如何使用 C 编程语言在 DSK 板上实现它,因为 C 不支持面向对象。

以下是我们的 C 实现的伪代码:

有没有办法在 C 代码中实现管道以在硬件 DSP 板上编译,以便我们可以同时在后台运行多个卷积迭代?

我画了一些图片,但我是这个板的新手,所以我不能发布图片。

如果您需要我的图片想法来帮助我,请告诉我~

非常感谢有关如何实现此代码的任何帮助!