OpenCv使用exp与Mat

时间:2012-10-11 08:39:14

标签: c++ opencv

我想根据以下公式在OpenCV中执行矩阵计算:

newMat = 1 / ( 1 + exp( scalar * ( otherScalar - Matrix ) ) )

在OpenCV中有一种简单的方法可以做到这一点,还是我必须在for循环中计算它? 对我来说主要的问题是exp(Matrix)。

此致

3 个答案:

答案 0 :(得分:3)

对于单通道图像,Maecky的答案非常好。

如果您的图片有多个频道,则会开始有趣。出于某些原因,

float(scalar) - _3ChannelMat

仅在第一个通道上应用该操作,而乘法

float(scalar2) * _3channelMat

在图像的所有通道上完成。好笑,不是吗?

解决方案是使用cv :: Scalars:

newMat = cv::Scalar(0.4, 0.4, 0.4) * ( cv::Scalar(255, 255, 255) - _3channelMat);

我刚刚提到了一个关于这种奇怪行为的错误,但还没有答案。

答案 1 :(得分:2)

好的,我自己找到了答案,这里是代码,如果有人有同样的问题:

newMat = float(scalar) * ( float(otherScalar) - newMat);
cv::exp( newMat, newMat );
newMat= 1.0f / ( 1.0f + newMat);

答案 2 :(得分:0)

@Maecky你很可能在你的答案中写了一个错误。

1+A通常表示I+A ,1 / A表示反转(即A ^ { - 1}),其中I是单位矩阵 - 在matlab和opencv中称为eye。 (此外,F / A === F * A ^ { - 1})

在你的解决方案中,你要为newMat添加一个全矩阵(在matlab和opencv中称为一个矩阵),而不是眼睛。

正确(即计算(I + exp(标量*(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();