Свертка изображения в пространственной области
Я пытаюсь воспроизвести результат этой ссылке используя линейный свертка в пространственно-домен.
изображения сначала преобразуются в 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)); 
            } 
        } 
    } 
 
            
