2

ピクセルがその周囲の8ピクセルと比較して最大値を持っているかどうかを画像で見つける必要があります。

最適な方法がわからないので、次のように if ステートメントを使用することを考えています。

if(pixel > pixel1 && pixel > pixel2 && pixel > pixel3 && ... && pixel> pixel8)

私の質問は次のとおりです。たとえば、ピクセルがピクセル1より大きくないことがわかった場合、ステートメントの残りをチェックしますか、それともANDのみであるため、すでに命令を破棄してさらに先に進みますか?

そして、答えが最初のものである場合、各ピクセルを常にチェックするのは非常に計算量が多くなりますが、この単純な問題により効率的にアプローチする方法について、誰かがヒントを教えてくれますか?

4

6 に答える 6

9

これは短絡評価と呼ばれます。

2 番目の引数は、最初の引数が式の値を決定するのに十分でない場合にのみ実行または評価されます。


条件が&&であるため、いずれかの条件で を取得した場合、それ以上のチェックは行われませんfalse

同様に、条件が の場合、 が||見つかるとチェックを停止しtrueます。


ところで、私は優先順位のルールについて完全に確信しているわけではありません。そのため、安全のために各条件を括弧で囲みます。

if((pixel > pixel1) && (pixel > pixel2) && ...

編集:演算子の優先順位規則は、この場合の括弧が不要であることを示しているようです。

于 2013-01-15T10:17:01.353 に答える
1

いいえ、残りのステートメントはチェックしません。C++ は条件ステートメントを「短絡」し&&、最初のオペランドが false の場合は an の 2 番目のオペランドを無視します (2 番目のオペランド||が true の場合は a の 2 番目のオペランドを無視します)。

于 2013-01-15T10:18:04.600 に答える
1

一連のものではなく、式のグループと考えてください&&。左側と右側だけがあり、左側の連想があります。

左辺が評価される場合false、右辺は評価されないことが標準で保証されています。右側にはアクセス違反が含まれている場合もあります (多くの場合含まれています)。たとえば、ポインターが左側で非 null かどうかをチェックし、右側で逆参照します。

あなたの操作はO(N)最悪です。これを 1 回行う場合は、これが最適な方法です。これを何度も行う場合は、ピクセルの最大値を見つけてから、その値に対してチェックする方がよいでしょう。

于 2013-01-15T10:21:00.460 に答える
1

C++ には「短絡」があります。これは、最初の条件が満たされたときifに 2 番目の条件がチェックされないことを意味します。

たとえば、pixel > pixel1結果falseの場合、次の条件は無視されます。

この「短絡評価」を参照してください

于 2013-01-15T10:19:33.247 に答える
1

演算子&&||は、C++ (および他のほとんどの言語でも同様) ではいわゆる「短絡演算子」です。これは、結果が決定されるとすぐに評価が停止されることを意味します。の場合、これは、1 つの項が である場合、他の項とは無関係に答えが であるため、&&他の項の評価が停止することを意味します。逆に、これは、1 つの用語が である場合、他の用語の評価が停止することを意味します。このリンクも参照してください。falsefalse||true

于 2013-01-15T10:20:38.927 に答える
0

短絡評価は他の回答で説明されていますが、2 つのピクセルの比較は完全に簡単ではない可能性があることを指摘する価値があります。たとえば、赤、緑、青のピクセル値に重み係数を掛けた後に追加したい場合があります (人間の目は、他の色よりもいくつかの色に敏感であるため)...その場合、比較されるオブジェクト内の全体的なピクセル値 (したがって、その値と無効化されたときに何らかの方法で追跡するためにより多くのメモリを使用し、+ 必要に応じてそれをチェックして再生成するための CPU 時間)、この冗長な計算を毎回実行する必要があります。それらの比較の。これを回避するには、たとえば、「get_brightness()」を追加します。

于 2013-01-15T11:14:17.727 に答える