gpt4 book ai didi

opencv - 是否有将 3 channel 垫拆分为三个 3 channel 垫而不是分成三个 1 channel 垫的内置函数?

转载 作者:太空宇宙 更新时间:2023-11-03 22:17:11 26 4
gpt4 key购买 nike

据我所知,内置的 split 会将一个 3 channel Mat 拆分为三个 1 channel Mat。结果,这三个 Mat 只是具有一些不同强度的灰度。

我的意图是获得三个 3 channel Mat,如下所示。

void splitTo8UC3(const Mat& input, vector<Mat>& output)
{
Mat blue = input.clone();
Mat green = input.clone();
Mat red = input.clone();
const uint N = input.rows * input.step;

for (uint i = 0; i < N; i += 3)
{
// blue.data[i]
green.data[i] = 0;
red.data[i] = 0;


blue.data[i + 1] = 0;
//green.data[i+1]
red.data[i + 1] = 0;


blue.data[i + 2] = 0;
green.data[i + 2] = 0;
//red.data[i+2]
}

output.push_back(blue);
output.push_back(green);
output.push_back(red);
}

它有效,但不是重新发明轮子,我正在寻找内置的(如果有的话)。

编辑

建议的解决方案必须比我的更快。

最佳答案

编辑:我结合了 Dan 从他的评论中提出的改进建议。


我想不出一个内置函数来做这件事,我也找不到一个。但是在做一些研究时,我遇到了 mixChannels功能,这可能会改善您的解决方案。至少,它避免了实现循环。

以下是我对您的代码所做的修改:

void splitTo8UC3(const cv::Mat& input, std::vector<cv::Mat>& output)
{
// Allocate outputs
cv::Mat b(cv::Mat::zeros(input.size(), input.type()));
cv::Mat g(cv::Mat::zeros(input.size(), input.type()));
cv::Mat r(cv::Mat::zeros(input.size(), input.type()));

// Collect outputs
cv::Mat out[] = { b, g, r };

// Set up index pairs
int from_to[] = { 0,0, 1,4, 2,8 };

cv::mixChannels(&input, 1, out, 3, from_to, 3);
output.assign(std::begin(out), std::end(out));
}

让我们有这个测试图像colors.png:

然后,让我们有这个测试代码:

    cv::Mat img = cv::imread("images/colors.png");

std::vector<cv::Mat> bgr;

splitTo8UC3(img, bgr);

cv::imwrite("images/b.png", bgr[0]);
cv::imwrite("images/g.png", bgr[1]);
cv::imwrite("images/r.png", bgr[2]);

然后,我们得到以下输出 b.pngg.pngr.png,希望它们是对于您的初始解决方案:

希望对您有所帮助!

关于opencv - 是否有将 3 channel 垫拆分为三个 3 channel 垫而不是分成三个 1 channel 垫的内置函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56473838/

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