Как справиться с переполнением в числовых пиксельных операциях с boost :: gil? - PullRequest
1 голос
/ 15 августа 2011

Числовое расширение для boost :: gil содержит следующие алгоритмы:

template <typename Channel1,typename Channel2,typename ChannelR>
struct channel_plus_t : public std::binary_function<Channel1,Channel2,ChannelR> {
   ChannelR operator()(typename channel_traits<Channel1>::const_reference ch1,
                       typename channel_traits<Channel2>::const_reference ch2) const {
      return ChannelR(ch1)+ChannelR(ch2);
   }
};

При заполнении двумя значениями канала uint8 произойдет переполнение, если ChannelR также равен uint8.

Iдумаю, что вычисление должно

  • использовать другой тип для обработки (как вывести это из шаблонных типов каналов?)
  • обрезать результат в диапазоне типа ChannelR, чтобы получитьнасыщенный результат (используя boost::gil::channel_traits<ChannelR>::min_value() / ... max_value()?)

Как сделать это таким образом, чтобы получить оптимизированные для производительности результаты?

  • Преобразовать в максимально возможный тип?Звучит неэффективно ...
  • Предоставить арсенал шаблонных специализаций?Есть идея получше?

1 Ответ

0 голосов
/ 22 июня 2012

Я не вижу, в чем здесь проблема ... моя реакция такова: так что не устанавливайте ChannelR на uint8, если это сломается "

Вы, кажется, делаете эквивалент, утверждая, чтокод типа

  uint8 a=128;
  uint8 b=128;
  uint8 c=a+b;  // Uh-Oh...

должен делать что-то умное (например, насыщающая арифметика).

Я бы предложил решение использовать более высокую точность или определить свой собственный channel_saturating_plus_t с поведением, которое вытребуют, как бы я ни предлагал, решение вышеописанного -

uint16 c=uint16(a)+uint16(b)

или

uint8 c=saturating_add(a,b);

И будьте благодарны, что создатели GIL даже подумали представить тип результата какпараметр отдельного типа;есть много людей, которых бы не было!

...