0

我目前正在读这本书。作者在第 83 页上写了一个代码片段,以便(如果我理解正确的话)计算两个矩阵的元素功率。但我认为代码没有实现其目的,因为矩阵dst在执行后不包含逐元素的权力。

这是原始代码:

const Mat* arrays[] = { src1, src2, dst, 0 };
float* ptrs[3];

NAryMatIterator it(arrays, (uchar**)ptrs);
for( size_t i = 0; i < it.nplanes; i++, ++it )
{
    for( size_t j = 0; j < it.size; j++ )
    {
        ptrs[2][j] = std::pow(ptrs[0][j], ptrs[1][j]);
    }
}

由于构造函数的参数 orcv::NAryMatIterator是,我认为不允许const cv::Mat **更改矩阵中的值。dst

我试图重新分配ptrs[2][j]dst但未能获得正确的索引dst。我的问题如下:

  1. 是否有一种方便的方法来计算矩阵元素的幂,就像A .^ B在 Matlab 中一样?
  2. 有没有办法使用cv::NAryMatIterator来实现这个目标?如果不是,那么实现它的最有效方法是什么?
4

1 回答 1

1

您可以通过将src1,src2和转换dstfloat (CV_32F)类型矩阵来实现此目的。这是因为代码在float* ptrs[3];.

使用opencv函数的替代实现logmultiply最后exp给出。

作为您的第二个问题的示例,

Mat src1 = (Mat_<int>(3, 3) <<
    1, 2, 3,
    4, 5, 6,
    7, 8, 9);
Mat src2 = (Mat_<uchar>(3, 3) <<
    1, 2, 3,
    1, 2, 3,
    1, 2, 3);
Mat dst = (Mat_<float>(3, 3) <<
    1, 2, 3,
    4, 5, 6,
    7, 8, 9);

src1.convertTo(src1, CV_32F);
src2.convertTo(src2, CV_32F);

cout << "before\n";
cout << dst << endl;

const Mat* arrays[] = { &src1, &src2, &dst, 0 };
float* ptrs[3];
NAryMatIterator it(arrays, (uchar**)ptrs);
for( size_t i = 0; i < it.nplanes; i++, ++it )
{
    for( size_t j = 0; j < it.size; j++ )
    {
        ptrs[2][j] = std::pow(ptrs[0][j], ptrs[1][j]);
    }
}

cout << "after\n";
cout << dst << endl;

输出

before
[1, 2, 3;
  4, 5, 6;
  7, 8, 9]
after
[1, 4, 27;
  4, 25, 216;
  7, 64, 729]

如果您删除src1.convertTo(src1, CV_32F);or src2.convertTo(src2, CV_32F);,您将无法获得所需的结果。尝试一下。

如果这是一个单独的函数,请不要将 放在convertTo函数中,因为它会修改图像表示,这可能会影响以后的操作。相反,convertTo在临时垫上使用,比如

Mat src132f, src232f, dst32f;
src1.convertTo(src132f, CV_32F);
src2.convertTo(src132f, CV_32F);
dst.convertTo(dst32f, CV_32F);

pow_mat(&src132f, &src232f, &dst32f); /* or whatever the name */

至于你的第一个问题,我不知道有这样的功能。但你可以尝试类似的东西

Mat tmp;
cv::log(src1, tmp);
cv::multiply(src2, tmp, dst);
cv::exp(dst, dst);

使用c = a^b等价于的关系c = e^(b.ln(a))。在这里,矩阵应该有类型32For 64F。这产生

[1, 4, 27.000002;
  4, 25.000002, 216.00002;
  6.9999995, 64, 729.00006]

对于上面的例子。

于 2017-11-04T02:42:48.513 回答