1

私はこのコードを持っています:

vector<Mat> brg;
Mat output;
split(inputImage, brg);


double mb=mean(brg[0])[0];
double mg=mean(brg[1])[0];
double mr=mean(brg[2])[0];
cout << "mb "<< mb<< " mg "<< mg<< " mr "<< mr << endl;
double max=MAX(mb,MAX(mg,mr));

mb=max/mb;
mg=max/mg;
mr=max/mr;
brg[0]=brg[0] *mb;
brg[1]=brg[1] *mg;
brg[2]=brg[2] *mr;

{
    double mb=mean(brg[0])[0];
    double mg=mean(brg[1])[0];
    double mr=mean(brg[2])[0];
    cout << "mb "<< mb<< " mg "<< mg<< " mr "<< mr << endl;
}

merge(brg,output);
return output;

数学的観点から、行列に数値を掛けると、その平均にその数値を掛ける必要があるため、この関数の最後に同じmb、mg、mrを取得する必要がありますが、取得していません。私が得ている結果は次のとおりです。

mb 166.891 mg 176.319 mr 158.288
mb 169.619 mg 176.319 mr 164.149

ご覧のとおり、平均は変化しましたが、等しくはありませんが、すべて最大値に等しいはずです。

これが得られない理由はありますか?

どうすれば修正できますか?

4

1 に答える 1

2

私の推測では、マトリックスのデータ型は CV_8UC3 のようなもので、これはピクセルが符号なし 8 ビット値として格納されることを意味します。

スケーリングすると、スケーリングされた結果は 0 ~ 255 の範囲にクリップされるため、同じスケーリング量だけ平均が変化することはありません。

たとえば、次の値があるとします。

0 , 64 , 64 , 128

4 倍にスケーリングしてみてください。

結果は次のようになります。

0, 255, 255, 255 

これが問題である場合は、convertToメソッドを使用して、行列をダイナミック レンジの広い別のデータ型 (浮動小数点データ型など) に変更することをお勧めします。

convertTo メソッドにはオプションのスケール (およびオフセット) もあるため、データ型の変換中にスケーリングを適用できることに注意してください。

于 2013-09-13T12:46:40.580 に答える