我正在尝试实现一个视觉算法,其中包括使用9x9拉普拉斯-高斯滤波器的预过滤阶段。您可以指出一个简要说明快速滤波实现的文档吗?我认为我应该利用FFT进行最高效的滤波。
在C中实现2D卷积的快速方法
原标题:
最佳回答
你确定要使用FFT吗?那会是一个整个数组的变换,非常费时。如果你已经决定使用9x9卷积滤波器,就不需要使用FFT了。
通常,在C中进行卷积的最便宜的方法是设置一个循环,移动指针覆盖数组,在每个点上加总卷积值,并将数据写入新数组。然后可以使用您喜欢的方法(编译器矢量化、MPI库、OpenMP等)并行化该循环。
关于边界:
- If you assume the values to be 0 outside the boundaries, then add a 4 element border of 0 to your 2d array of points. This will avoid the need for `if` statements to handle the boundaries, which are expensive.
- If your data wraps at the boundaries (ie it is periodic), then use a modulo or add a 4 element border which copies the opposite side of the grid (abcdefg -> fgabcdefgab for 2 points). **Note: this is what you are implicitly assuming with any kind of Fourier transform, including FFT**. If that is not the case, you would need to account for it before any FFT is done.
这4个点是因为9x9内核的最大边界重叠超出主格4个点。因此,对于2n + 1 x 2n + 1内核,需要n个边界点。
如果您需要这个卷积计算非常快,并且/或者您的网格很大,请考虑将其分成较小的部分,可以保存在处理器缓存中,因此可以更快地计算。这也适用于您可能想要进行的任何GPU卸载(它们非常适合这种类型的浮点计算)。
问题回答
Here is a theory link http://hebb.mit.edu/courses/9.29/2002/readings/c13-1.pdf
这是fftw的链接,它是我以前使用过的一个相当不错的FFT库(请检查许可证,以确保它是合适的)。 http://www.fftw.org/
你所要做的就是对你的图像和卷积核(9x9矩阵)进行FFT变换,然后将它们相乘,再进行反向变换。
然而,使用9x9矩阵,您仍然最好使用实际坐标(只需通过图像像素和矩阵的双循环即可)。尝试两种方法!
实际上,您不需要使用足够大的FFT尺寸来容纳整个图像。您可以执行许多较小的重叠2d fft。您可以搜索“快速卷积”“重叠保存”“重叠添加”。
然而,对于9x9内核。您可能不会在速度方面看到太大的优势。
相关问题
热门标签
- winforms
- combobox
- fogbugz
- java
- date
- internationalization
- asp.net
- iis
- url-rewriting
- urlrewriter
- c#
- enums
- ocaml
- haxe
- algorithm
- string
- viewstate
- .net
- c++
- c
- symbol-table
- mysql
- database
- postgresql
- licensing
- migration
- vb.net
- vb6
- declaration
- vb6-migration
- python
- psycopg2
- backup
- vmware
- virtualization
- gnu-screen
- authentication
- desktop
- excel
- xll
- cultureinfo
- regioninfo
- oracle
- client
- session
- download
- html
- virtual
- constructor
- scenarios
- perl
- full-text-search
- javascript
- ajax
- testing
- oop
- inheritance
- vim
- encapsulation
- information-hiding