这个问题是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得到算法。在那篇论文中,我们需要乘以几个矩阵来得到结果。
答案 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通道,你可以很容易地适应它。