Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何使用boost::gil处理数字像素操作中的溢出?_C++_Boost_Image Processing_Boost Gil - Fatal编程技术网

C++ 如何使用boost::gil处理数字像素操作中的溢出?

C++ 如何使用boost::gil处理数字像素操作中的溢出?,c++,boost,image-processing,boost-gil,C++,Boost,Image Processing,Boost Gil,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>::cons

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通道值填充时,如果通道器也是uint8,则会发生溢出

我认为应该进行计算

使用不同的处理类型如何从模板化通道类型派生? 使用boost::gil::channel\u traits::min\u value/…max\u value将结果剪切到ChannelR类型的范围,以获得饱和结果? 如何以允许性能优化结果的方式实现这一点

转换为最大可能的类型?听起来适得其反。。。 提供一个模板专门化的武库?还有更好的主意吗?
我不明白这里有什么问题。。。我的反应是,如果这会中断,不要将通道设置为uint8

您似乎在做与争论代码类似的事情

  uint8 a=128;
  uint8 b=128;
  uint8 c=a+b;  // Uh-Oh...
应该做些聪明的事情,例如饱和运算

我建议解决方案是使用更高的精度,或者根据您需要的行为定义您自己的通道饱和,就像我建议解决上述问题的方法一样

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


值得庆幸的是,GIL的创建者甚至想到将结果类型作为一个单独的类型参数公开;有很多Lib是不可能的

你可能会发现这个有趣:感谢你对这个话题的想法。我理解了与标准C++操作符+行为的类比,但是由于这个通道操作符应该在大的图像数据上工作,所以我不能使用更大的通道类型。我正在寻找一种在相同结果类型中提供饱和结果的解决方案……因此,你的第二个建议是可行的——但这是我问题的主要方面:如何以通用和最佳的方式实现结构饱和\u通道\u plus\t?有关饱和算法,请参阅;应该很清楚如何概括它。对于一般的部分,是的,你的渠道特征是正确的。
uint8 c=saturating_add(a,b);