Здесь нужно учесть две вещи:
- Сами значения пикселей
- Как эти значения отображаются на экране
Если вашimages имеет целочисленный тип без знака (скажем, uint8
), и вы вычитаете среднее значение, не переводя изображение в другой тип, вы, скорее всего, уничтожите информацию об изображении.Например, если ваше изображение содержит значения пикселей
204 208 100 75 86
, а среднее значение равно 100,3, результат uint8
вычитания этого среднего значения равен
104 108 0 0 0 -- saturated subtraction
или
* 1018.*
в зависимости от того, используете ли вы насыщенное вычитание или арифметику в стиле C.В обоих случаях изображение больше не содержит ту же информацию, что и раньше.
Правильно, конечно, использовать значения с плавающей точкой:
103.7 107.7 -0.3 -25.3 -14.3 -- floating-point subtraction
В этом случае данные по-прежнему содержат точнота же информация, только теперь она имеет нулевое среднее значение.
Теперь, как отобразить это изображение с нулевым средним на экране?Вы можете либо сопоставить каждое значение от <0 до 0, и каждое значение> от 255 до 255, чтобы значения за пределами допустимого диапазона [0,255] были насыщенными;или вы можете найти минимальные и максимальные значения в ваших данных, линейно отобразить значения пикселей в допустимый диапазон.В первом случае это будет выглядеть так, как будто вы испортили изображение (как в вашем примере), во втором случае оно будет выглядеть не сильно измененным на изображении.То есть, нет способа показать изображение на экране и все равно увидеть эффект среднего вычитания.