Свертка изображения в пространственной области
Я пытаюсь воспроизвести результат этой ссылке используя линейный свертка в пространственно-домен.
изображения сначала преобразуются в 2d double
массивы, а затем скручивается. Образ и ядро имеют одинаковый размер. Изображение дополняется перед сверткой и обрезается соответственно после свертки.
по сравнению с сверткой на основе FFT, выход странный и неправильно.
как я могу решить эту проблему?
обратите внимание, что я получил следующий вывод изображения из Matlab, который соответствует моему выходу C# FFT:
.
обновление-1: после @Бен Фойгтакомментарий, я изменил
2 ответов
ваш текущий выход больше похож на автокорреляционную функцию, чем на свертку Лены с собой. Я думаю, что проблема может быть в вашей
Я нашел решение от этой ссылке. Главной подсказкой было ввести offset
и factor
.
- фактор - это сумма всех значений в ядре.
- смещение является произвольным значением для дальнейшего исправления вывода.
.
@Крис Луэнгоответ также поднял действительный момент.
.
следующий исходный код предоставляется по данной ссылке:
private void SafeImageConvolution(Bitmap image, ConvMatrix fmat)
{
//Avoid division by 0
if (fmat.Factor == 0)
return;
Bitmap srcImage = (Bitmap)image.Clone();
int x, y, filterx, filtery;
int s = fmat.Size / 2;
int r, g, b;
Color tempPix;
for (y = s; y < srcImage.Height - s; y++)
{
for (x = s; x < srcImage.Width - s; x++)
{
r = g = b = 0;
// Convolution
for (filtery = 0; filtery < fmat.Size; filtery++)
{
for (filterx = 0; filterx < fmat.Size; filterx++)
{
tempPix = srcImage.GetPixel(x + filterx - s, y + filtery - s);
r += fmat.Matrix[filtery, filterx] * tempPix.R;
g += fmat.Matrix[filtery, filterx] * tempPix.G;
b += fmat.Matrix[filtery, filterx] * tempPix.B;
}
}
r = Math.Min(Math.Max((r / fmat.Factor) + fmat.Offset, 0), 255);
g = Math.Min(Math.Max((g / fmat.Factor) + fmat.Offset, 0), 255);
b = Math.Min(Math.Max((b / fmat.Factor) + fmat.Offset, 0), 255);
image.SetPixel(x, y, Color.FromArgb(r, g, b));
}
}
}