将 3x1 垫子分配给 3 通道垫子
Assign 3x1 mat to 3 channels mat
这个问题是我在此链接中的问题的延续。 我得到垫子矩阵后,将 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;
如果你也需要阿尔法通道,你可以很容易地适应。
相关文章:
- 对静态分配的子类对象进行静态分配的纯虚拟父类引用是否合法?
- 如何通过接口将函子分配给函数对象
- 分配/访问2d阵列,使得2d子块是连续的
- 具有模板的树类,并为子级动态分配
- C++释放带有子数组的数组的内存分配
- 子数组分配:使用聚合对象错误的预期"{...}"进行初始化
- 将TopoDS_Face对象分配给其子对象编译没有错误,但我有 3 个 valgrind 错误
- 如何在Qt中处理子类中的动态内存分配
- 子分配内存块
- 是子阵列保证通过线性分配
- 删除时,QObject是否区分堆栈和堆分配的子级
- 正在从子析构函数中删除父构造函数进行的分配
- 你能给自己分配一个 std::string 的子字符串吗?
- 如何在opencv中创建cv::matrix的向量,并将图像数据的子矩阵分配给向量的所有索引上的矩阵
- 当对象不是动态分配的(不是指针)时,是否可以从超类对象转换到子类
- 如何将子类分配给函数中的抽象类指针
- 当子对象引用被分配给父对象指针时,为什么不能访问子类
- 将子节点分配给父节点
- 动态分配矩阵的算子重载
- 基类中只有一个方法可以分配给子类