c# - 标准化负值的正确方法是什么?
问题描述
假设,我使用以下内核执行了卷积操作:
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