归一化卷积滤波器的正确方法是什么?

What's the right way to normalize a convolution filter?

我正在按照 these 说明进行操作。但我的结果并不正确。我正在使用这个内核:

-1 -1 -1
-1  8 -1
-1 -1 -1

所以这意味着给定卷积的总和将在 -8 和 8 之间,假设我已经标准化了我的输入 (0-255 -> 0-1)。然后我做卷积。然后我找到我的值在最小值和最大值之间的百分比。例如,对于这个内核,我的最小值为 -8,最大值为 8。因此,如果值为 0,则为 50%,即 255 * .5 = 127.5。但这显然是不对的,它给出的大部分是灰色图像。不是灰色的部分仍然是单色的,即使我 运行 每个通道上的内核都是单独的。

    static int EvaluateKernelAtPoint(Bitmap bitmap, Matrix<double> kernel, int x, int y, Func<int, int, int> onGetIntensity)
    {
        double sum = 0;
        for (int a = 0; a < kernel.ColumnCount; a++)
        {
            for (int b = 0; b < kernel.RowCount; b++)
            {
                var xn = x + a - 1;
                var yn = y + b - 1;

                var intensity = (double)onGetIntensity(xn, yn); // returns R,G, or B color channel at that pixel
                intensity /= 255; // intensity is 0-1
                sum += intensity * kernel.At(a, b);
            }
        }

        var result = (sum - (-8d)) / (8d - (-8d)); // find the % between the min and max of -8 and 8
        result *= 255; // bring it back to 0-255
    }

没有正确的标准化方法,因为范围取决于内容。

好的RGB图片,取值范围通常是[0, 255],前提是动态范围调整好。

但是这个拉普拉斯滤波器的输出,可以看作是原始图像和它的平滑版本之间的差异,通常具有小得多的幅度。但这取决于局部变化:已经平滑的图像不会给出任何响应,而噪声(尤其是盐和胡椒)会产生巨大的值。

您还需要决定如何处理负值:移动以使零显示为中灰色、固定为零或取绝对值。

采用最小-最大范围并将其映射到 0-255 是一种选择,但会导致 "floating" 零和不受控制的增益。我更愿意为一组相同来源的图像设置一个恒定的增益。

最后但同样重要的是,直方图均衡化是另一种选择。