问题标签 [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 投票
2 回答
7880 浏览

delphi - 快速卷积算法

我需要对两个一维信号进行卷积,一个平均有 500 个点(这个是汉宁窗函数),另一个是 125000。每次运行,我需要应用三倍的卷积操作。我已经有一个基于 scipy 文档运行的实现。如果您愿意,可以在此处查看代码(前面的 Delphi 代码):

问题是,这个实现太慢了。整个过程大约需要五分钟。我想知道是否可以找到一种更快的计算方法。

0 投票
1 回答
4895 浏览

optimization - 快速二维卷积实现?

我已经为 2D 卷积制作了一个 CUDA 程序,现在想将它与一些非 CUDA 实现进行比较以测量加速。

我可以使用经典的多循环方法或 matlab 的 conv2 与我自己在纯 C 中的实现进行比较,但感觉不像是合法/公平的比较,因为它们不是最快的实现。

我也在考虑尝试 OpenCV,我一直在寻找一个 SIMD 优化版本,但没有运气。有什么建议,我应该使用 OpenCV 吗?

注意:我已经阅读了其他问题,包括这个问题,但答案与我的纯 C 代码或对各种可用方法的讨论基本相同。

0 投票
2 回答
2117 浏览

matlab - 在 Matlab 中应用一组图像过滤器

我需要使用 Matlab 中的一组过滤器过滤图像。我的第一次尝试是使用一个简单的 for 循环为银行中的每个过滤器重复调用“imfilter”函数。

我需要为我的应用程序重复这个过程很多次,所以我需要这一步尽可能高效。因此,我想知道是否有任何方法可以对该操作进行矢量化以加快该过程。为了简化事情,我所有的过滤器内核都是相同的大小(9x9)。

作为我想要的示例,我的过滤器设置在 9x9x32 元素块中,需要将其应用于我的图像。我曾考虑将图像复制到一个块中(例如 100x100x32),但我不确定是否有一种方法可以应用卷积等操作而不使用循环。有没有人有解决这个问题的好方法的建议?

0 投票
1 回答
4614 浏览

statistics - 找到两个直方图的卷积

两个随机变量 x 和 y 之和的概率分布由各个分布的卷积给出。我在数字上遇到了一些麻烦。在以下示例中,x 和 y 是均匀分布的,它们各自的分布近似为直方图。我的推理是直方图应该被卷积以给出 x+y 的分布。

这给出了以下内容,

在此处输入图像描述

换句话说,正如预期的那样,是一个三角形分布。但是,我不知道如何找到 x 值。如果有人可以在这里纠正我,我将不胜感激。

0 投票
1 回答
1853 浏览

matlab - 在图像上使用 Roberts 算子

该算法旨在将罗伯茨算子应用于图像,并将结果存储在新文件中。

相反,此代码输出与输入完全相同的图像。

我是 Matlab 新手,欢迎您对我的代码提出建议和反馈。

我知道为此目的有一个内置功能,我将其作为练习。

编辑 - 我还有另一个问题 - 在这个例子中,如果说 x = Img(x,y),那会得到 x 行 y 列的像素,还是 y 行 x 列的像素?

0 投票
3 回答
13979 浏览

python - Numpy/Scipy 中的卷积计算

分析我正在做的一些计算工作向我表明,我的程序中的一个瓶颈是一个基本上可以做到这一点的函数(npnumpyspscipy):

两个信号都具有形状(C, N),其中C是数据集的数量(通常小于 20),并且N是每组中的样本数(大约 5000)。每个集合(行)的计算完全独立于任何其他集合。

我认为这只是一个简单的卷积,所以我尝试将其替换为:

...只是看看我是否得到了相同的结果。但我没有,我的问题是:

  1. 为什么不?
  2. 有没有更好的方法来计算 的等价物mix1()

(我意识到mix2按原样可能不会更快,但它可能是并行化的一个很好的起点。)

这是我用来快速检查的完整脚本:

0 投票
1 回答
3433 浏览

image-processing - FFT 卷积 - 如何应用内核

我对图像处理很陌生,发现 FFT 卷积可以大大加快大内核大小的卷积。

我的问题是,如何在使用 KissFFT 时将内核应用于频率空间中的图像?

我已经做了以下事情:

当我在图像上再次设置 rgb 值时,我确实得到了原始图像。所以转换工作。如果我想应用内核,例如 9x9 框模糊(1/9、1/9、... 1/9),我现在应该怎么做。

我已经阅读了一些关于快速卷积的内容,但它们都是不同的,具体取决于 FFT 的实现。在应用过滤器之前,是否有一种“列表”我必须关心的事情?

我认为的方式:

图像大小必须是 2 的幂;我必须创建一个与图像大小相同的内核。将 9 个中间值设置为 1/9,其余设置为 0,然后将此内核转换为频域,将源图像与它相乘,然后将源图像转换回来。但这并没有真正起作用:DD

0 投票
2 回答
3679 浏览

c++ - FFT 问题的高斯模糊

我有一个使用常规卷积的当前高斯模糊实现。它对于小内核来说足够高效,但是一旦内核大小变大一点,性能就会受到影响。所以,我正在考虑使用 FFT 实现卷积。我从来没有任何与 FFT 相关的图像处理的经验,所以我有几个问题。

  1. 基于 2D FFT 的卷积是否也可以分成两个 1D 卷积?

    • 如果是真的,它是这样的吗 - 每行的 1D FFT,然后每列的 1D FFT,然后乘以 2D 内核,然后每列的逆变换和每行的逆变换?或者我是否必须在每次一维 FFT 变换后乘以一维内核?
  2. 现在我明白内核大小应该与图像大小相同(一维的情况下为行)。但它将如何影响边缘?我必须用零填充图像边缘吗?如果是这样,内核大小应该等于填充之前或之后的图像大小?

另外,这是一个 C++ 项目,我打算使用 KissFFT,因为这是一个商业项目。欢迎您提出任何更好的替代方案。谢谢你。

编辑:感谢您的回复,但我还有一些问题。

  1. 我看到输入图像的虚部将全为零。但是输出虚部也会为零吗?我是否必须将高斯核乘以实部和虚部?

  2. 我有相同图像的实例以不同的比例模糊,即相同的图像被缩放到不同的大小并在不同的内核大小下模糊。每次缩放图像时都必须执行 FFT,还是可以使用相同的 FFT?

  3. 最后,如果我想可视化 FFT,我知道必须将日志过滤器应用于 FFT。但是我真的迷失了应该使用哪个部分来可视化 FFT?实部或虚部。

  4. 同样对于大小为 512x512 的图像,实部和虚部的大小是多少。它们的长度会一样吗?

再次感谢您的详细回复。

0 投票
2 回答
1163 浏览

image-processing - FFT 卷积 - 非常低的 PSNR

我正在用 FFT 滤波器(内核大小 = 10)对图像(512*512)进行卷积,看起来不错。

但是当我将它与我以正常方式进行复杂处理的图像进行比较时,结果是可怕的。
PSNR 约为 35。

67,187/262,144 像素值相差 1 或更多(峰值约为 8)(最大像素值为 255)。

我的问题是,在频率空间中进行卷积时是否正常,或者我的卷积/变换函数可能存在问题?. 因为奇怪的是,当我使用 double 作为数据类型时,我应该得到更好的结果。但它完全一样。

当我将图像转换为频率空间时,不要对其进行卷积,然后将其转换回来就可以了,使用浮点数时 PSNR 约为 140。

此外,由于像素差异只有 1-10,我想我可以排除缩放错误

编辑:无聊感兴趣的人的更多详细信息

我使用开源的 KissFFT 库。使用真正的二维输入 (kiss_fftndr.h)

我的图像数据类型是 PixelMatrix。简单的 alpha、red、green 和 blue 值从 0.0 到 1.0 float 的矩阵

我的内核也是一个 PixelMatrix。

这是卷积函数的一些片段

使用的数据类型:

FFT的配置:

填充和转换内核:

将颜色放入数组:

卷积:

我们现在拥有的:

  • 3个来自kiss_fft_cpx类型的转换颜色数组*
  • 1个来自kiss_fft_cpx类型的转换内核数组*

它们都是复杂的数组

现在是卷积:

现在我将它们转换回来:

笔记:

  • 我已经提前注意图像的大小为 2 (256*256)、(512*512) 等的幂。

例子:

内核大小:10

输入:

输出:

正常卷积的输出:

我的控制台说:

虽然在我看来它们看起来是一样的°.°

也许一个人很无聊,并通过代码。不是很紧急,但这是一种问题我只是想知道我到底做错了什么^^

最后但并非最不重要的一点是我的 PSNR 功能,虽然我并不认为这是问题所在:D

0 投票
1 回答
1706 浏览

python - 如何在 Python ThreadPool 中使用初始化程序

我正在尝试使用 PyFFTW 进行线程卷积,以便同时计算大量 2D 卷积。(不需要单独的进程,因为 GIL 是为 Numpy 操作发布的)。现在这里是这样做的规范模型:http: //code.activestate.com/recipes/577187-python-thread-pool/

(Py)FFTW 之所以如此之快,是因为它重用了计划。这些必须为每个线程单独设置,以避免访问冲突错误,如下所示:

通过这种方式,可以将参数self.inputa, self.outputa, self.fft, self.inputb, self.outputb,传递self.ifft给 Worker 类的 run 方法中的实际卷积器。

这一切都很好,但我们不妨导入 ThreadPool 类:

但是我应该如何在 ThreadPool 中定义初始化程序以获得相同的结果?根据文档 http://docs.python.org/library/multiprocessing.html “每个工作进程在启动时都会调用初始化程序(*initargs)”。您可以在 Python 源代码中轻松检查这一点。

但是,当您设置线程池时,例如使用 2 个线程:

然后你运行它,也许在某个循环中

如何通过初始化程序设置卷积器?如何让它在每个线程中使用单独的 FFTW 计划,而不为每个卷积重新计算 FFTW 计划?

干杯,亚历克斯。