Свертка изображения в пространственной области

Я пытаюсь воспроизвести результат этой ссылке используя линейный свертка в пространственно-домен.

изображения сначала преобразуются в 2d double массивы, а затем скручивается. Образ и ядро имеют одинаковый размер. Изображение дополняется перед сверткой и обрезается соответственно после свертки.

enter image description here

по сравнению с сверткой на основе FFT, выход странный и неправильно.

как я могу решить эту проблему?

обратите внимание, что я получил следующий вывод изображения из Matlab, который соответствует моему выходу C# FFT:

enter image description here

.

обновление-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)); 
            } 
        } 
    }