将3x1垫分配给3个通道垫

时间:2014-12-29 02:13:19

标签: c++ opencv computer-vision

这个问题是this link中我的问题的延续。在得到mat矩阵后,3x1矩阵乘以3x3 mat矩阵。

    for (int i = 0; i < im.rows; i++)
    {
    for (int j = 0; j < im.cols; j++)
        {
        for (int k = 0; k < nChannels; k++)
           {
            zay(k) = im.at<Vec3b>(i, j)[k]; // get pixel value and assigned to Vec4b zay

            }
        //convert to mat, so i can easily multiplied it
        mat.at <double>(0, 0) = zay[0];
        mat.at <double>(1, 0) = zay[1];
        mat.at <double>(2, 0) = zay[2];

我们得到3x1 mat矩阵并与滤波器进行乘法运算。

        multiply= Filter*mat;

我得到mat矩阵3x1。我想将值分配到我的新3通道mat矩阵中,该怎么做?我想用这个操作构建一个图像。我不使用卷积函数,因为我认为结果是不同的。我在c ++工作,我想使用矩阵乘法将彩色图像更改为另一种颜色。我从这个paper得到算法。在那篇论文中,我们需要乘以几个矩阵来得到结果。

1 个答案:

答案 0 :(得分:0)

OpenCV为您提供了一个重塑函数来隐式更改通道/行/列的数量:

http://docs.opencv.org/modules/core/doc/basic_structures.html#mat-reshape

这非常有效,因为没有数据被复制,只有矩阵标题被更改。

尝试:

cv::Mat mat3Channels = mat.reshape(3,1);

没有测试,但应该工作。如果你想要一个Vec3b元素,你应该给你一个1x1矩阵和3个通道元素(Vec3d),你必须转换它:

cv::Mat mat3ChannelsVec3b;
mat3Channels.convertTo(mat3ChannelsVec3b, CV_8UC3);

如果您只想写回mat,那么最好再创建一个Vec3b元素:

cv::Vec3b element3Channels;
element3Channels[0] = multiply.at<double>(0,0);
element3Channels[1] = multiply.at<double>(1,0);
element3Channels[2] = multiply.at<double>(2,0);

但是在所有情况下都要注意,Vec3b元素无法保存值< 0> 255

编辑:再次阅读您的问题后,您会询问如何分配...

我猜你还有另一个矩阵:

cv::Mat outputMatrix = cv::Mat(im.rows, im.cols, CV_8UC3, cv::Scalar(0,0,0));

现在将multiply分配给您outputMatrix中的元素:

cv::Vec3b element3Channels;
element3Channels[0] = multiply.at<double>(0,0);
element3Channels[1] = multiply.at<double>(1,0);
element3Channels[2] = multiply.at<double>(2,0);
outputMatrix.at<Vec3b>(i, j) = element3Channels;

如果你也需要alpha通道,你可以很容易地适应它。