Вот формула для базового уменьшения цвета в OpenCV, которую я читал в книге.
//p is the value of the channel of a pixel
//n is the reduction factor
p = (p/n)*n + n/2; //integer division
Я понимаю, что первое выражение (p/n)*n
является первым кратным n
меньшим или равным p
. Я думаю, что этого достаточно для уменьшения цвета на коэффициент n
. Но я не понимаю, что нужно добавить n/2
к нему.
А также, если p=255
и n=5
, эта формула будет пытаться установить p = 257
, не будет ли она переполнять диапазон p?
Пожалуйста, объясни.
При n=255
, (((p)/n)*n)
вернет 0 для p <255 и 255 для p == 255.
Чтобы быть сбалансированным, вы хотели бы вернуть 0 для p <128 и 255 для p> = 128. Этого можно достичь с помощью:
((p + n/2) / n) * n
Это немного похоже на ((p/n) + 0.5) * n
, за исключением того, что вы, очевидно, не можете этого сделать. Эффект заключается в том, чтобы дать округление вместо усечения по результату p/n
. На самом деле это работает только для некоторых значений n.
Легкий способ получить именно то, что вы хотите, - это использовать таблицу поиска.
Я согласен ((p)/n)*n + n/2
имеет проблемы, как указано в old-ufo
Говорят, что n/2 необходимо для "центральной" позиции вместо минимума, но вы правы, похоже, что это не нужно. Предположим, что я хочу иметь 2 цвета - черно-белый, поэтому n = 255. Без n/2 в результате получилось бы 0 и 255. С n/2 - 127 и 382, что кажется неправильным.