2016-05-27 4 views
2

イメージとカーネルの間に何らかの畳み込みをしようとしているので、私の結果は本当に巨大ではありません。カーネルを0と1の間の範囲に正規化しようとしています予め。私はCV_32FC1で働いています。Mat types &私の画像はグレースケールです。OpenCV Matを分割すると予期せぬ結果になる

私のカーネルは-1から1の範囲で始まります。最小値を引いて0から2の範囲をとり、最大値で除算して、理論的には0から1の範囲にする必要があります。しかし、この分割後、値の範囲は(私はこれらの数字を丸めている - 実際の正確な値が役に立つなら、私に知らせてください。)358に0となり

これは私のコードです:

double minVal; double maxVal; 
minMaxLoc(kernel, &minVal, &maxVal); 
kernel = kernel - minVal;    
minMaxLoc(kernel, &minVal, &maxVal); 
divide(maxVal, kernel, kernel); 

これはどうして起こっているのですか?多分私はメモリやオーバーフローの問題に陥っているように感じるかもしれませんが、私の値はすべて32Fが格納できる範囲内にあると思います。修正は素晴らしいだろうが、なぜ私が最も興味を持っているのか。

+0

overflowsは、通常、saturate_castを使用するためopenCV操作では発生しません。あなたは 'std :: cout << minVal << std :: endl;'、 'std :: cout << maxVal << std :: endl;'と 'std :: cout << kernel << std :: endl ;あなたの操作の前後に? – Micka

+1

@chrisMaesの回答が正しいはずです。 – Micka

答えて

2

からopencv documentation; divideオペレータは、あなたが何を考えていません。各要素に対して、それが計算します。

dst(I) = saturate(scale/src2(I)) 

は、あなたが期待している間:

dst(I) = saturate(src2(I)/scale) 

私はあなただけでやるべきだと思う:

kernel = kernel/maxVal; 

(わかりませんこれはうまくいくでしょうが、実際の要素分割があることを確認してください)。

関連する問題