1

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);
   }
};

2つのuint8チャネル値で埋められた場合、ChannelRもuint8の場合、オーバーフローが発生します。

計算はすべきだと思います

  • 処理に別のタイプを使用します(テンプレート化されたチャネルタイプからこれを導出する方法は?)
  • 結果をChannelRタイプの範囲にクリップして、飽和した結果を取得します(boost::gil::channel_traits<ChannelR>::min_value()/ ... max_value()?を使用)

パフォーマンスを最適化した結果を可能にする方法でこれを行うにはどうすればよいですか?

  • 可能な限り最大のタイプに変換しますか?逆効果に聞こえます...
  • テンプレートの専門分野の武器を提供しますか?より良いアイデアはありますか?
4

1 に答える 1

0

ここで何が問題なのかわかりません...私の反応は、「それで壊れる場合は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 の作成者が、結果の型を別の型パラメーターとして公開することさえ考えていたことに感謝します。そうでないライブラリがたくさんあります!

于 2012-06-21T22:00:59.557 に答える