0

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

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

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

问候

4

3 回答 3

3

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);

我不久前就这种奇怪的行为提交了一个错误,但还没有答案。

于 2012-10-11T11:16:40.037 回答
3

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

newMat = float(scalar) * ( float(otherScalar) - newMat);
cv::exp( newMat, newMat );
newMat= 1.0f / ( 1.0f + newMat);
于 2012-10-11T09:44:33.860 回答
0

@Maecky 您可能只是在答案中写了一个错误。

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

在您的解决方案中,您将添加一个全为矩阵newMat(在 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();
于 2012-11-26T21:55:28.867 回答