Я хочу Свернуть Лену с собой в Частотной области. Вот цитата из книги. вывод свертки:
Я написал следующее приложение для достижения свертки двух изображений в частотной области. Я выполнил следующие шаги:
- Преобразуйте Лену в матрицу комплексных чисел.
- Примените БПФ, чтобы получить комплексную матрицу.
- Умножьте две комплексные матрицы элемент на элемент (если это определение свертки).
- Примените IFFT к результату умножения.
Кажется, результат не соответствует ожиданиям:
Здесь видны две проблемы:
- Вывод содержит только черный фон с одной точкой в центре.
- Исходное изображение искажается после выполнения свертки.
.
Примечание. БПФ и I-БПФ отлично работают с одними и теми же библиотеками.
Примечание-2. В SO, кажется, обсуждается та же тема.
.
Исходный код:
public static class Convolution
{
public static Complex[,] Convolve(Complex[,]image, Complex[,]mask)
{
Complex[,] convolve = null;
int imageWidth = image.GetLength(0);
int imageHeight = image.GetLength(1);
int maskWidth = mask.GetLength(0);
int maskeHeight = mask.GetLength(1);
if (imageWidth == maskWidth && imageHeight == maskeHeight)
{
FourierTransform ftForImage = new FourierTransform(image); ftForImage.ForwardFFT();
FourierTransform ftForMask = new FourierTransform(mask); ftForMask.ForwardFFT();
Complex[,] fftImage = ftForImage.FourierTransformedImageComplex;
Complex[,] fftKernel = ftForMask.FourierTransformedImageComplex;
Complex[,] fftConvolved = new Complex[imageWidth, imageHeight];
for (int i = 0; i < imageWidth; i++)
{
for (int j = 0; j < imageHeight; j++)
{
fftConvolved[i, j] = fftImage[i, j] * fftKernel[i, j];
}
}
FourierTransform ftForConv = new FourierTransform();
ftForConv.InverseFFT(fftConvolved);
convolve = ftForConv.GrayscaleImageComplex;
//convolve = fftConvolved;
}
else
{
throw new Exception("padding needed");
}
return convolve;
}
}
private void convolveButton_Click(object sender, EventArgs e)
{
Bitmap lena = inputImagePictureBox.Image as Bitmap;
Bitmap paddedMask = paddedMaskPictureBox.Image as Bitmap;
Complex[,] cLena = ImageDataConverter.ToComplex(lena);
Complex[,] cPaddedMask = ImageDataConverter.ToComplex(paddedMask);
Complex[,] cConvolved = Convolution.Convolve(cLena, cPaddedMask);
Bitmap convolved = ImageDataConverter.ToBitmap(cConvolved);
convolvedImagePictureBox.Image = convolved;
}
ifft( fft(a) * fft(b) )
, вы получаете линейную свертку, а не круговую свертку - в этом суть ответ, на который вы ссылаетесь. - person Ahmed Fasih   schedule 02.08.2016Complex
выполнять сложное умножение, т. Е.(a + j*b) * (c + j*d) = (a*c - b*d) + j*(a*d + b*c)
? - person Ahmed Fasih   schedule 02.08.2016