Ваш вопрос не ясен на 100%, поэтому я могу быть выключен, и это может быть не то, что вы ищете - я сделаю это в целом, игнорируя диапазон значений, который вы можете получить или использовать.
Предполагая, что у вас есть абсолютный минимум и абсолютное максимальное значение, vmin
и vmax
, и вы хотите масштабировать весь диапазон до [0; 255] вы можете сделать это так:
// move the lower end to 0
double mod_add = -vmin;
double mod_mul = 255 / (vmax + mod_add);
Теперь, чтобы переставить одно значение в диапазон, который мы вычислили:
double scaled = (value + mod_add) * mod_mul;
mod_add
переместит отрицательные числа / значения в положительный диапазон (где абсолютный минимум станет 0), а mod_mul
масштабирует весь диапазон (от абсолютного минимума до абсолютного максимума), чтобы соответствовать [0; 255]. Без отрицательных значений вы можете пропустить mod_add
, очевидно. Если вы хотите сохранить 0 в центре (то есть на 127), вам придется пропустить mod_add
и вместо этого использовать абсолютный максимум vmax
и vmin
и масштабировать его до 127 вместо 255.
Кстати, я думаю, вы могли бы значительно упростить ваш цикл, возможно, сэкономив некоторое время на обработку (это может быть невозможно в зависимости от присутствия другого кода):
const unsigned int num = width * height;
for (unsigned int i = 0; i < num; i++)
temp[i] = f[i]->Mag();
Кроме того, как упоминал Оли в комментариях, вам не следует присваивать какое-либо значение singleValue
в начале, так как оно все равно перезаписывается позже.