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

Assign 3x1 mat to 3 channels mat

本文关键字:通道 子分配 3x1      更新时间:2023-10-16

这个问题是我在此链接中的问题的延续。 我得到垫子矩阵后,将 3x1 矩阵与 3x3 垫矩阵相乘。

    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 垫矩阵并使用过滤器进行乘法。

        multiply= Filter*mat;

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

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

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

这是非常有效的,因为没有复制数据,只更改了矩阵标头。

尝试:

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

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

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;

如果你也需要阿尔法通道,你可以很容易地适应。