我想将Mat图像的所有通道加到只有一个和通道的Mat图像上。我已经这样试过了:
// sum up the channels of the image:
// 1 .store initial nr of rows/columns
int initialRows = frameVid1.rows;
int initialCols = frameVid1.cols;
// 2. check if matrix is continous
if (!frameVid1.isContinuous())
{
frameVid1 = frameVid1.clone();
}
// 3. reshape matrix to 3 color vectors
frameVid1 = frameVid1.reshape(3, initialRows*initialCols);
// 4. convert matrix to store bigger values than 255
frameVid1.convertTo(frameVid1, CV_32F);
// 5. sum up the three color vectors
reduce(frameVid1, frameVid1, 1, CV_REDUCE_SUM);
// 6. reshape to initial size
frameVid1 = frameVid1.reshape(1, initialRows);
// 7. convert back to CV_8UC1
frameVid1.convertTo(frameVid1, CV_8U);
但不知何故,reduce不会将颜色通道作为Matrix Dimension。还有其他功能可以总结它们吗?
为什么在步骤4中使用CV_16U不起作用? (我必须在那里放一个CV_32F)
提前致谢!
答案 0 :(得分:0)
每个第3个元素(RGB)是一个相似的颜色。如果你抓住每组3个元素(R,G和B)将它们相加并将其存储在另一个1通道矩阵中,它可能会起作用。存储之前,您应使用saturate cast以避免意外结果。所以,我认为更好的方法是使用饱和演员而不是调整你的矩阵。
答案 1 :(得分:0)
查看cv::split()
和cv::add()
个功能。
您可以使用分割功能将图像分割为单独的通道,然后使用添加功能添加图像。但是在使用add时要小心,因为添加可能会导致值饱和。您可能必须先转换类型然后添加。看看这里:http://answers.opencv.org/question/13769/adding-matrices-without-saturation/
答案 2 :(得分:0)
您可以用一行来总结RGB通道
cv::transform(frameVid1, frameVidSum, cv::Matx13f(1,1,1))
您可能还需要一行,因为在应用变换之前,您应该将图像转换为某种适当的类型以避免饱和(我假设为CV_32FC3
)。 -输出数组的大小和深度与源数组相同。
一些解释:
cv::transform
可以对每个像素的通道值进行操作。
每个像素cv::Matx13f(a, b, c)
都有第三个参数[u,v]
,它可以执行以下操作:
frameVidSum[u,v] = frameVid1[u,v].B * a + frameVid1[u,v].G * b + frameVid1[u,v].R * c
使用第三个参数cv::Matx13f(1,0,1)
,您将只对蓝色和红色通道求和。
cv::transform
非常聪明,您甚至可以使用cv::Matx14f
,然后将第四个值添加(偏移)到frameVidSum
中的每个像素。