gpt4 book ai didi

c++ - 我怎样才能把一个三 channel 的垫子变成一个总结的单 channel 垫子?

转载 作者:行者123 更新时间:2023-12-02 17:48:02 26 4
gpt4 key购买 nike

我想将 Mat 图像的所有 channel 添加到只有一个和 channel 的 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 不会像矩阵维度那样触及颜色 channel 。还有其他功能可以总结它们吗?

另外,为什么在步骤 4 中使用 CV_16U。)不起作用? (我必须在里面放一个 CV_32F)

提前致谢!

最佳答案

您可以用一行总结 RGB channel

cv::transform(frameVid1, frameVidSum, cv::Matx13f(1,1,1))

您可能需要多一行,因为在应用转换之前,您应该将图像转换为某种适当的类型以避免饱和(我假设 CV_32FC3 )。 - 输出数组的大小和深度与源相同。

一些解释:
cv::transform可以对每个像素的 channel 值进行操作。
有第三个参数 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)您将仅对蓝色和红色 channel 求和。
cv::transform太聪明了,你甚至可以使用 cv::Matx14f然后将第四个值添加(偏移)到 frameVidSum 中的每个像素.

关于c++ - 我怎样才能把一个三 channel 的垫子变成一个总结的单 channel 垫子?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30666224/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com