代码之家  ›  专栏  ›  技术社区  ›  user366312

规范化负值的正确方法是什么?

  •  0
  • user366312  · 技术社区  · 6 年前

    假设我使用以下内核执行了卷积操作:

    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之间重新缩放这些值。

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

    2 回复  |  直到 6 年前
        1
  •  1
  •   digonly    6 年前

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

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

        2
  •  0
  •   user366312    6 年前

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

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

    此函数的编写基于 this link .