gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 14:21:45 24 4
gpt4 key购买 nike

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 channel 值时,如果ChannelR也是uint8会发生溢出。

我觉得计算应该

  • 使用不同的类型进行处理(如何从模板化 channel 类型中派生出来?)
  • 将结果裁剪到 ChannelR 类型的范围内以获得饱和结果(使用 boost::gil::channel_traits<ChannelR>::min_value()/... max_value() ?)

如何以允许性能优化结果的方式做到这一点?

  • 转换为尽可能大的类型?听起来适得其反...
  • 提供大量的模板特化?有更好的主意吗?

最佳答案

我不明白这里的问题是什么......我的 react 是“所以不要将 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++ - 如何使用 boost::gil 处理数字像素操作中的溢出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7067891/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com