Разница между изображением FT в Matlab против CUDA - PullRequest
0 голосов
/ 04 мая 2011

Я пытаюсь реализовать код 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 - ширина и высота изображения, которое я пытаюсь обработать

1 Ответ

0 голосов
/ 05 мая 2011

Две вещи:

  • Matlab изначально вычисляет, используя double. Ваш код CUDA делает то же самое?
  • Отображаемый Matlab пытался масштабировать значения перед их отображением, на графике есть некоторая опция, чтобы предотвратить это.
...