5

-1.396655我有一个在to之间的任何范围内的双打列表,1.74707甚至可能更高或更低,无论哪种方式,我都会在规范化之前知道MinandMax值是什么。我的问题是如何在-1to之间标准化这些值,1甚至更好地将它们从 double 值转换为 to 的 char0255

任何帮助,将不胜感激。

double range = (double)(max - min);
value = 255 * (value - min)/range
4

4 回答 4

5

你需要一个表格的映射y = mx + c,你需要找到一个m和一个c。您有两个固定的数据点,即:

 1 = m * max + c
-1 = m * min + c

从那里,它是简单的代数

于 2012-04-29T22:40:19.633 回答
3

最简单的方法是首先移动所有值,使 min 为 0,方法是从每个数字中减去 Min。然后乘以 255/(Max-Min),这样移动后的 Max 将映射到 255,其他所有内容都将线性缩放。所以我相信你的方程看起来像这样:

newval = (unsigned char) ((oldval - Min)*(255/(Max-Min)))

在转换为 char 之前,您可能需要更仔细地进行舍入。

于 2012-04-29T22:42:25.213 回答
2

有两个改变要做。

首先,使用 256 作为限制。

其次,确保您的范围略微缩小以避免获得 256。

    public int GetRangedValue(double value, double min, double max)
    {
        int outputLimit = 256;

        double range = (max - min) - double.Epsilon; // Here we shorten the range slightly

        // Then we build a range such that value >= 0 and value < 1
        double rangedValue = (value - min) / range;

        return min + (int)(outputLimit * rangedValue);
    }

通过这两个更改,您将在输出中获得正确的分布。

于 2019-07-14T03:01:35.503 回答
0

当我开始使用 C++ 做一些卷积工作时,我解决了这个需求。

希望我的代码能给你一个有用的参考:)

bool normalize(uint8_t*& dst, double* src, int width, int height) {
    dst = new uint8_t[sizeof(uint8_t)*width*height];
    if (dst == NULL)
        return false;
    memset(dst, 0, sizeof(uint8_t)*width*height);
    double max   = std::numeric_limits<double>::min();
    double min   = std::numeric_limits<double>::max();
    double range = std::numeric_limits<double>::max();
    double norm  = 0.0;
    //find the boundary
    for (int j=0; j<height; j++) {
        for (int i=0; i<width; i++) {
            if (src[i+j*width] > max) 
                max = src[i+j*width];
            else if (src[i+j*width] < min)
                min = src[i+j*width];
        }
    }
    //normalize double matrix to be an uint8_t matrix
    range = max - min;
    for (int j=0; j<height; j++) {
        for (int i=0; i<width; i++) {
            norm = src[i+j*width];
            norm = 255.0*(norm-min)/range;
            dst[i+j*width] = (uint8_t)norm;
        }
    }
    return true;
}

基本上输出(由'dst'接收的calley)在[0, 255]左右。

于 2021-01-04T08:56:28.503 回答