2012-10-11 65 views
0

我想执行OpenCV的矩阵计算,根据这个公式:OpenCV的使用EXP与垫

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

有没有一种简单的方法在OpenCV中做到这一点还是我有一个计算for循环? 对我来说主要问题是exp(矩阵)。

问候

回答

3

Maecky的答案是完全正常的 - 1通道的图像。

拍摄乐趣首先,如果你的形象有一个以上的频道。由于某些原因,

float(scalar) - _3ChannelMat 

只适用于第一信道的操作,而乘法

float(scalar2) * _3channelMat 

对图像的所有信道进行。很好笑,不是吗?

的解决方案是使用CV ::标量:

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

我对这种奇怪的行为提起了错误前一阵子,但没有答案。

+0

感谢您指出这一点。就我而言,我只需要一个频道,但很好知道 - 以防万一。 – Maecky

2

好吧,我发现自己的答案,在这里如果有人有同样的问题代码:

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

1.0F /垫做逐元素分裂。如果这不是你想要的 - 在这个问题你垫的公式是相当熟悉,我 - ,检查我的答案正确的表达。 –

0

@Maecky的机会,你只写了一个错误的答案。

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

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

正确(即计算(I + EXP(标量*(otherScalar * I-矩阵)))^ { - 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();