Я пытаюсь реализовать код Matlab, который у меня есть, который делает 2D свертку.
Код matlab сначала центрирует ядро 3x3 в мягкой матрице размером с изображение. Я делаю то же самое в своем коде C ++.
Я вывел свой массив и матрицу matlab в файлы .csv и подтвердил, что они идентичны. Затем я запускаю FFT на каждом из них. В Matlab FT-изображение ядра выглядит так, как вы и ожидали - в основном интенсивное посередине, излучающееся по кругу. Тем не менее, изображение CUDA FT (которое я рисую в Matlab после импорта его в формате CSV) выглядит как овал.
Что может быть причиной этого? Это выглядит почти так, как будто ядро не было центрировано на изображении, но, как я уже сказал, я выгрузил данные ядра Kernel в CSV и использовал imagesc, чтобы увидеть их в Matlab, и это выглядит центрированным для меня, и на самом деле это точно такой же, как у мягкого ядра Matlab.
Это код, который я использовал, чтобы поместить свое ядро в центр моего дополненного массива:
kSize = 3;
halfl = 0.5*(kSize-1);
if(chipW%2 == 0)
dcW = (.5*chipW) +1;
else
dcW = round(chipW*.5);
if(chipH%2 == 0)
dcH = (.5*chipH) +1;
else
dcH = round(chipH*.5);
dcH--;
dcW--;
for(int i = dcH-halfl ; i <= dcH+halfl ; i++)
{
for(int j = dcW -halfl ; j <= dcW+halfl ; j++)
{
h_PaddedKernel[i*chipW + j] = make_cuComplex(hp_kernel[(i-(dcH-halfl))*kSize + (j-(dcW-halfl))], 0.0);
}
}
kSize - это ширина одного размера моего ядра, chipW и chipH - ширина и высота изображения, которое я пытаюсь обработать