3

我正在使用 openCV,我需要将两个三通道 RGB 图像组合成一个 6 通道图像。我不确定我将如何组合它们。有任何想法吗?

4

2 回答 2

2

首先,您必须创建一个目标矩阵。
cv::Mat允许创建最多CV_CN_MAX(512) 个通道的图像。
例如cv::Mat(cv::Size(640,480),CV_8UC(6)),具有六个 8 位通道的 640x480 图像。更一般地说,给定s 输入,您可以获得一个自适应目标矩阵:

cv::Mat(s.size(), CV_MAKETYPE(s.depth(), 6))

请参阅数据类型cv::Mat构造函数

您可能希望使用Mat::convertTo来确保两个输入图像具有相同的格式,然后使用mixChannels

mixChannels(const Mat *     src,
    size_t      nsrcs,
    Mat *   dst,
    size_t      ndsts,
    const int *     fromTo,
    size_t      npairs 
)   

需要将 2 个源图像放入容器中(请记住,分配矩阵只会创建一个新标头,除非明确要求,否则不会复制图像缓冲区)。

最后要做的是from_to使用通道映射创建一个向量。给定 s0 和 s1 输入图像,目标是具有以下映射:

s0 red   -> 1st output channel
s0 green -> 2nd
s0 blue  -> 3rd
s1 red   -> 4th
s1 green -> 5th
s1 blue  -> 6th

最终代码将是:

std::vector<cv::Mat> s;
s.resize(2); //Or `push_back` your 2 input images
s[0] = ...   //1st input image
s[1] = ...   //2nd input image
auto d = cv::Mat(s[0].size(), CV_MAKETYPE(s[0].depth(), 6));

int from_to[] = { 0,0, 1,1, 2,2, 3,3, 4,4, 5,5 };
cv::mixChannels(s.data(), s.size(), &d, 1, from_to, 6);
于 2012-05-14T02:09:00.613 回答
-1

split将图像拆分为一组单通道图像,然后它们按任意顺序重新组合在一起。还有 mixchannels() ,它是两者的更有效但更复杂的组合

理论上,opencv 适用于任意数量的通道,但我怀疑许多功能仅适用于 1 或 3(即灰色或“正常”颜色)

于 2012-05-13T23:28:38.647 回答