标准化负值的正确方法是什么?

What is the proper way to normalize negative values?

假设,我用以下内核执行了一个卷积运算:

double[,] image = ImageDataConverter.ToDouble2d(lena);
double[,] kernel = new double[,] { { 2, 0, 0, }, 
                                   { 0,-1, 0, }, 
                                   { 0, 0,-1, }, };  
double[,] conv = Convolution.LinearConvolutionInSpatialDomain(image, kernel );  

可以理解的是,与该内核进行卷积会在二维双精度数组中产生一些负值。

很明显,下面的方法:

    public static void Rescale(double[,] convolve)
    {
        int imageWidth = convolve.GetLength(0);
        int imageHeight = convolve.GetLength(1);

        double maxAmp = 0.0;

        for (int j = 0; j < imageHeight; j++)
        {
            for (int i = 0; i < imageWidth; i++)
            {
                maxAmp = Math.Max(maxAmp, convolve[i, j]);
            }
        }

        double scale = 1 / maxAmp;

        for (int j = 0; j < imageHeight; j++)
        {
            for (int i = 0; i < imageWidth; i++)
            {
                double d = convolve[i, j] * scale;
                convolve[i, j] = d;
            }
        }
    }

将无法在 0-1 之间重新调整这些值。

那么,实现标准化的标准程序是什么?

您可以找到最小值和最大值。将比例更改为 double scale = 1 / (Math.abs(minAmp) + maxAmp) 并在应用比例之前添加 minAmp

double d = (convolve[i, j] + Math.abs(minAmp)) * scale

我使用了以下功能来解决我的问题:

    private static double Constraint(double value, double minRange, double maxRange, 
                                           double minVal, double maxVal)
    {
        return (((value - minVal) / (maxVal - minVal)) * 
                  (maxRange - minRange) + minRange);
    }

这个函数是在this link的基础上写的.