我想执行OpenCV的矩阵计算,根据这个公式:OpenCV的使用EXP与垫
newMat = 1/(1 + exp(scalar * (otherScalar - Matrix)))
有没有一种简单的方法在OpenCV中做到这一点还是我有一个计算for循环? 对我来说主要问题是exp(矩阵)。
问候
我想执行OpenCV的矩阵计算,根据这个公式:OpenCV的使用EXP与垫
newMat = 1/(1 + exp(scalar * (otherScalar - Matrix)))
有没有一种简单的方法在OpenCV中做到这一点还是我有一个计算for循环? 对我来说主要问题是exp(矩阵)。
问候
Maecky的答案是完全正常的 - 1通道的图像。
拍摄乐趣首先,如果你的形象有一个以上的频道。由于某些原因,
float(scalar) - _3ChannelMat
只适用于第一信道的操作,而乘法
float(scalar2) * _3channelMat
对图像的所有信道进行。很好笑,不是吗?
的解决方案是使用CV ::标量:
newMat = cv::Scalar(0.4, 0.4, 0.4) * (cv::Scalar(255, 255, 255) - _3channelMat);
我对这种奇怪的行为提起了错误前一阵子,但没有答案。
好吧,我发现自己的答案,在这里如果有人有同样的问题代码:
newMat = float(scalar) * (float(otherScalar) - newMat);
cv::exp(newMat, newMat);
newMat= 1.0f/(1.0f + newMat);
1.0F /垫做逐元素分裂。如果这不是你想要的 - 在这个问题你垫的公式是相当熟悉,我 - ,检查我的答案正确的表达。 –
@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();
感谢您指出这一点。就我而言,我只需要一个频道,但很好知道 - 以防万一。 – Maecky