我想实现一些旨在在beagleboard上运行的图像处理算法。这些算法广泛使用卷积。我正在尝试为2D卷积找到一个好的C实现(可能使用快速傅立叶变换)。我还希望算法能够在beagleboard的DSP上运行,因为我听说DSP针对这些类型的操作进行了优化(使用乘法累加指令)。
我没有该领域的背景,所以我认为自己实施卷积不是一个好主意(我可能不会像理解其背后所有数学的人一样好)。我相信DSP存在一个很好的C卷积实现,但是我找不到它?
有人可以帮忙吗?
编辑:原来内核非常小。其尺寸为2X2或3X3。所以我想我不是在寻找基于FFT的实现。我正在网上搜索卷积来查看它的定义,所以我可以直接实现它(我真的不知道卷积是什么)。我发现的所有东西都是乘法积分,我不知道如何用矩阵来做。有人可以给我一段2X2内核案例的代码(或伪代码)吗?
答案 0 :(得分:11)
图像和内核的尺寸是多少?如果内核很大,那么你可以使用基于FFT的卷积,否则对于小内核只需使用直接卷积。
DSP可能不是最好的方法 - 只是因为它有MAC指令并不意味着它会更有效率。 Beagle Board上的ARM CPU是否具有NEON SIMD?如果是这样,那么这可能是要走的路(也更有趣)。
对于小内核,你可以这样做直接卷积:
// in, out are m x n images (integer data)
// K is the kernel size (KxK) - currently needs to be an odd number, e.g. 3
// coeffs[K][K] is a 2D array of integer coefficients
// scale is a scaling factor to normalise the filter gain
for (i = K / 2; i < m - K / 2; ++i) // iterate through image
{
for (j = K / 2; j < n - K / 2; ++j)
{
int sum = 0; // sum will be the sum of input data * coeff terms
for (ii = - K / 2; ii <= K / 2; ++ii) // iterate over kernel
{
for (jj = - K / 2; jj <= K / 2; ++jj)
{
int data = in[i + ii][j +jj];
int coeff = coeffs[ii + K / 2][jj + K / 2];
sum += data * coeff;
}
}
out[i][j] = sum / scale; // scale sum of convolution products and store in output
}
}
你可以修改它来支持K的偶数值 - 只需要稍微关注两个内环的上限/下限。
答案 1 :(得分:0)
我知道这可能不是主题,但由于C和JavaScript之间的相似性,我相信它仍然有用。 PS。:灵感来自@Paul R回答。
使用数组的JavaScript中的二维2D卷积算法
function newArray(size){
var result = new Array(size);
for (var i = 0; i < size; i++) {
result[i] = new Array(size);
}
return result;
}
function convolveArrays(filter, image){
var result = newArray(image.length - filter.length + 1);
for (var i = 0; i < image.length; i++) {
var imageRow = image[i];
for (var j = 0; j <= imageRow.length; j++) {
var sum = 0;
for (var w = 0; w < filter.length; w++) {
if(image.length - i < filter.length) break;
var filterRow = filter[w];
for (var z = 0; z < filter.length; z++) {
if(imageRow.length - j < filterRow.length) break;
sum += image[w + i][z + j] * filter[w][z];
}
}
if(i < result.length && j < result.length)
result[i][j] = sum;
}
}
return result;
}
查看完整的博文