需求:加载一副12000*12000的灰度图像,使用GPU对其进行离散傅里叶变换
存在的问题:使用opencv处理此数据,机器为i7 12核处理器,32GB内存时,release版本程序耗时12000毫秒,opencv 自带的GPU版本速度更慢。
解决办法:自己写代码,实现图像数据的傅里叶变换。
首先,了解一下opencv dft函数的参数含义。
函数:dft(InputArray, OutputArray, int flag, in nonzerorows=0)
参数一:InputArray、OutputArray是输入输出图像
参数二:flag转换标识符,可选项有DFT_INVERSE、DFT_SCALE、DFT_ROWS、DFT_COMPLEX_OUTPUT、DFT_REAL_OUTPUT
DFT_INVERSE:用一维/二维逆变换取代默认的正向变换
DFT_SCALE:所得结果处以像素总数
DFT_ROWS:每行单独处理
DFT_COMPLEX_OUTPUT:输出和原图一样大的复数结果
DFT_REAL_OUTPUT:输出和原图一样大的实数结果
参数三:nonzerorows,可以忽略,一般很少用
本次使用cuda实现dft,需要关注以下三个参数:
DFT_INVERSE、DFT_SCALE、DFT_ROWS
下面不废话,直接上代码