规范卷积滤波器的正确方法是什么?

时间:2018-11-26 01:42:09

标签: image-processing edge-detection

我正在遵循these的说明。但是我的结果并不正确。我正在使用此内核:

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

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

enter image description here

    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
    }

1 个答案:

答案 0 :(得分:2)

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

在良好的RGB图像中,只要动态范围调整得当,值的范围通常为[0,255]。

但是这个拉普拉斯滤波器的输出可以看作是原始图像与其平滑版本之间的差异,通常幅度要小得多。但这取决于局部差异:已经很平滑的图像将无法响应,而噪点(尤其是盐和胡椒)会产生巨大的价值。

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

选择最小-最大范围并将其映射到0-255是一个选项,但是会导致“浮动”零和不受控制的增益。我希望为一组相同来源的图像设置恒定增益。

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