Dobra, poszedłem w stronę FFT ale ni kij nie wiem co jest nie tak, próbuję próbuję i nic.

Lewy, górny - obraz wejściowy
Prawy, górny - kernel (suma pól = 1)
Lewy, dolny - konwolucja wejścia i kernela
Prawy, dolny - niby ? dekonwolucja (a powinien być identyczny z lewym górnym).
Kod leci mniej więcej tak:
FFT fker = new FFT(ckernel); //obiekt transformaty kernela 16x16
ckernel = fker.FFT2D(ckernel, 16, 16, 1); //transformata FFT w przód
ckernel = fker.FFT2D(ckernel, 16, 16, 1);//transformata FFT w przód powtórnie
FFT tcon = new FFT(cconv); //obiekt transformaty konwolucji 16x16
cconv = tcon.FFT2D(cconv, 16, 16, 1); //transformata FFT w przód jeden raz
//Poniżej stosuję wzór FFT(konwolucja)/FFT(FFT(kernel))
var result = new COMPLEX[conv.W(),conv.H()];
for (int i = 0; i < conv.W(); i++)
{
for (int j = 0; j < conv.H(); j++)
{
result[i, j] = new COMPLEX(cconv[i,j].real/ckernel[i,j].real, 0);
}
}
//Następnie odwracam transformatę dla tablicy z powyższymi ilorazami
var rf = new FFT(result);
result = rf.FFT2D(result, 16, 16, -1);
//Kopiuję wszystko do tablicy floatów
var res = new float[conv.W(), conv.H()];
for (int i = 0; i < res.W(); i++)
{
for (int j = 0; j < res.H(); j++)
{
res[i, j] = (float) result[i, j].real;
}
}
res.Balance(); //Na koniec balans - czyli taka "normalizacja" rozciągająca od 0 do 1 w skali
control2DDeconv.Data = res; //podstawienie tablicy do kontrolki prawej, dolnej
Bo zgodnie z
http://research.stowers-institute.org/efg/Report/FourierAnalysis.pdf (slajd około 45)
powinienem podzielić FFT konwolucji (wyniku) przez funkcję FFT(PSF) (a więc FFT od FFT kernela) i wynik przetransformować inverse FFT.
Rozumiem, że taką operację mam wykonać dla każdej komórki tablicy (ten iloraz), a końcową tablicę przetransformować inverse FFT i powinno dać obraz wejściowy. (A jak widać nie dzieje się tak)
Będę wdzięczny za jakieś wskazówki, jakby ktoś miał czas i ochotę :)