次の式に従ってOpenCVで行列計算を実行したいと思います。
newMat = 1 / ( 1 + exp( scalar * ( otherScalar - Matrix ) ) )
OpenCVでこれを行う簡単な方法はありますか、それともforループでこれを計算する必要がありますか?私にとっての主な問題はexp(Matrix)です。
よろしく
わかりました、私は自分で答えを見つけました、誰かが同じ問題を抱えている場合のコードはここにあります:
newMat = float(scalar) * ( float(otherScalar) - newMat);
cv::exp( newMat, newMat );
newMat= 1.0f / ( 1.0f + newMat);
Maeckyの答えは完全に問題ありません-1チャンネルの画像の場合。
画像に複数のチャンネルがある場合、楽しみが始まります。いくつかの理由で、
float(scalar) - _3ChannelMat
乗算中、最初のチャネルにのみ演算を適用します
float(scalar2) * _3channelMat
画像のすべてのチャンネルで行われます。おかしいですね。
解決策は、cv :: Scalarsを使用することです:
newMat = cv::Scalar(0.4, 0.4, 0.4) * ( cv::Scalar(255, 255, 255) - _3channelMat);
私はこの奇妙な振る舞いについて少し前にバグを報告しましたが、まだ答えはありません。
@Maeckyは、答えにバグを書いた可能性があります。
1+A
通常はを意味I+A
し、1 / Aは反転(つまりA ^ {-1})を意味します。ここI
で、は単位行列です。matlabおよびopencvではeyeと呼ばれます。(さらにF / A === F * A ^ {-1})
あなたのソリューションではnewMat
、目ではなく、すべて1つの行列(matlabおよびopencvでは行列と呼ばれます)を追加しています。
正しく(つまり、(I + exp(scalar *(otherScalar * I-Matrix)))^ {-1}を計算しています):
using namespace cv;
Size s = Matrix.size();
int t = Matrix.type();
Mat newMat;
Mat I = Mat::eye(s,t);
exp( scalar * ( otherScalar*I - Matrix ), newMat );
newMat = (I + newMat).inv();