【问题标题】:Assign 3x1 mat to 3 channels mat将 3x1 垫子分配给 3 通道垫子
【发布时间】:2014-12-29 17:46:12
【问题描述】:

这个问题是我在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;

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

【问题讨论】:

    标签: c++ opencv computer-vision


    【解决方案1】:

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

    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 元素都不能保存值 &lt; 0&gt; 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 通道,您可以轻松适应。

    【讨论】:

    • 谢谢。在 OpenCV 中,彩色图像的格式是 BGR 对吗?如果我想使用矩阵乘法来处理图像,我应该将颜色的顺序更改为 RGB 吗?还是BGR与RGB相同?因为我通常使用 MatLab 来执行此操作,所以我们知道 MatLab 是否有彩色图像格式的 RGB。
    • 您可以轻松转换为 RGB 排序。如果未转换,OpenCV 使用 BGR 排序,并假定 BGR 排序用于显示和写入磁盘。因此,如果您在处理前转换为 RGB,则应在处理后转换回 BGR。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-09
    • 1970-01-01
    • 2023-03-05
    • 2017-11-15
    • 2022-01-04
    相关资源
    最近更新 更多