【问题标题】:How to handle overflow in numeric pixel operations with boost::gil?如何使用 boost::gil 处理数字像素操作中的溢出?
【发布时间】:2011-08-15 16:45:07
【问题描述】:

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会发生溢出。

我认为计算应该

  • 使用不同的类型进行处理(如何从模板化的通道类型派生出来?)
  • 将结果剪辑到 ChannelR 类型的范围以获得饱和结果(使用 boost::gil::channel_traits&lt;ChannelR&gt;::min_value() / ...max_value()?)

如何以允许性能优化结果的方式执行此操作?

  • 转换为可能的最大类型?听起来适得其反……
  • 提供模板专长库?有更好的主意吗?

【问题讨论】:

标签: c++ boost image-processing boost-gil


【解决方案1】:

我看不出问题出在哪里......我的反应是“所以不要将 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 的创建者甚至考虑将结果类型公开为单独的类型参数;有很多库不会!

【讨论】:

  • 感谢您对这个话题的看法。
  • 我理解与标准 C++ operator+ 行为的类比,但由于该通道运算符应该适用于(大)图像数据,因此我无法使用更大的 ChannelR 类型。我正在寻找以相同结果类型提供饱和结果的解决方案。
  • ...所以你的第二个建议是要走的路 - 但这是我问题的主要方面:如何以通用和最优的方式实现 struct saturating_channel_plus_t?
  • 饱和算术,见stackoverflow.com/questions/741301/…;如何概括它应该很明显。对于通用部分,是的,您在渠道特征方面是正确的。
猜你喜欢
  • 2017-04-28
  • 1970-01-01
  • 2014-08-13
  • 2014-06-20
  • 2020-08-22
  • 1970-01-01
  • 1970-01-01
  • 2017-08-01
  • 2018-10-15
相关资源
最近更新 更多