我怎样才能把一个三通道矩阵变成一个汇总的一通道矩阵呢?

  • 本文关键字:通道 一个 c++ opencv
  • 更新时间 :
  • 英文 :


我想将Mat图像的所有通道加到只有一个求和通道的Mat图像中。我试过这样做:

    // sum up the channels of the image:
    // 1 .store initial nr of rows/columns
    int initialRows = frameVid1.rows;
    int initialCols = frameVid1.cols;
    // 2. check if matrix is continous
    if (!frameVid1.isContinuous())
    {
        frameVid1 = frameVid1.clone();
    }
    // 3. reshape matrix to 3 color vectors
    frameVid1 = frameVid1.reshape(3, initialRows*initialCols);
    // 4. convert matrix to store bigger values than 255
    frameVid1.convertTo(frameVid1, CV_32F);
    // 5. sum up the three color vectors
    reduce(frameVid1, frameVid1, 1, CV_REDUCE_SUM);
    // 6. reshape to initial size
    frameVid1 = frameVid1.reshape(1, initialRows);
    // 7. convert back to CV_8UC1
    frameVid1.convertTo(frameVid1, CV_8U);

但不知何故,reduce不触及颜色通道作为一个矩阵维度。有没有别的函数可以把它们加起来?

为什么在步骤4中使用CV_16U不工作?(我必须在那里放一个CV_32F)

提前感谢!

你可以用一条线将RGB通道相加

cv::transform(frameVid1, frameVidSum, cv::Matx13f(1,1,1))

你可能需要多一行,因为在应用变换之前,你应该把图像转换成一些适当的类型来避免饱和(我假设是CV_32FC3)。-输出数组的大小和深度与源数组相同。

一些解释:

cv::transform可以操作每像素通道值。对于每个像素[u,v],有第三个参数cv::Matx13f(a, b, c),它执行以下操作:

frameVidSum[u,v] = frameVid1[u,v].B * a + frameVid1[u,v].G * b + frameVid1[u,v].R * c

通过使用第三个参数cv::Matx13f(1,0,1),您将只对蓝色和红色通道求和。

cv::transform是如此聪明,你甚至可以使用cv::Matx14f,然后第四个值将被添加(偏移)到frameVidSum中的每个像素。

每三个元素(RGB)是一个相似的颜色。如果你把每组3个元素(R, G和B)加起来,并将其存储在另一个1通道矩阵中,可能会起作用。在存储之前,应该使用饱和强制转换来避免意外的结果。所以,我认为更好的方法是使用饱和投射,而不是调整你的矩阵。

看看cv::split()cv::add()函数

您可以使用split函数将图像拆分为单独的通道,然后使用add函数添加图像。但是在使用add时要小心,因为添加可能会导致值饱和。您可能必须先转换类型,然后再添加。请看这里:http://answers.opencv.org/question/13769/adding-matrices-without-saturation/

相关内容

  • 没有找到相关文章