Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用Open CV和C+将彩色图像拆分为三个通道+;?_C++_Opencv - Fatal编程技术网

C++ 使用Open CV和C+将彩色图像拆分为三个通道+;?

C++ 使用Open CV和C+将彩色图像拆分为三个通道+;?,c++,opencv,C++,Opencv,我是新开简历的,所以如果我的问题听起来很愚蠢,请原谅我。因此,我正在研究使用split函数将BGR通道拆分为单个通道的新概念。我正在读这篇文章(),但我无法理解代码。所以,请任何人解释我下面的代码行,因为我真的想了解这个概念 我根本不理解创建蓝色通道的部分。谁能给我解释一下吗 src = imread("pic.png"); vector<mat> spl(3); split(src,spl); Mat empty_image = Mat::zeros(src.rows, src

我是新开简历的,所以如果我的问题听起来很愚蠢,请原谅我。因此,我正在研究使用split函数将BGR通道拆分为单个通道的新概念。我正在读这篇文章(),但我无法理解代码。所以,请任何人解释我下面的代码行,因为我真的想了解这个概念

我根本不理解创建蓝色通道的部分。谁能给我解释一下吗

src = imread("pic.png");
vector<mat> spl(3);
split(src,spl);

Mat empty_image =  Mat::zeros(src.rows, src.cols, CV_8UC1);


Mat result_blue(src.rows, src.cols, CV_8UC3); // notice the 3 channels here!

// Create blue channel
Mat in1[] = { spl[0], empty_image, empty_image };
int from_to1[] = { 0,0, 1,1, 2,2 };
mixChannels( in1, 3, &result_blue, 1, from_to1, 3 );

imshow("blue image", result_blue);
src=imread(“pic.png”);
向量spl(3);
拆分(src、spl);
Mat empty_image=Mat::zeros(src.rows、src.cols、CV_8UC1);
Mat result_blue(src.rows、src.cols、CV_8UC3);//注意这里的3个频道!
//创建蓝色通道
matin1[]={spl[0],空_图像,空_图像};
int from_to 1[]={0,0,1,1,2,2};
混合通道(in1、3和result_blue、1、from_到1、3);
imshow(“蓝色图像”,结果为蓝色);

该代码将彩色图像分割为3个灰度图像,保持红色、绿色和蓝色的强度


然后,代码获取蓝色通道并构造一个红色和绿色为零的彩色图像,这样当您显示它时,它将显示为蓝色,而不仅仅是灰度。

Th OpenCV Split Function:

cv:split(src, spl)
获取CV_8UC3类型的3通道24位(每个通道8位)并将其拆分为CV_8UC1类型(灰度),即单独的单通道图像或R、G和B类型

如果以spl vector中的绿色通道图像为例并执行cv::imshow,则应注意,原始RGB图像中的绿色将仅在绿色通道图像中显示为高强度值。对于任何其他通道也是如此

mixChannels( in1, 3, &result_blue, 1, from_to1, 3 );
基本上是一个将源映像的某个通道复制到新目标映像的函数。使用该函数时,您需要指定需要混合的频道数,在您的情况下为3

cv::Mat result_blue(src.rows, src.cols, CV_8UC3);
请注意,此cv::Mat类型的变量是内存,用于保存输出图像,其中来自src的通道与目标图像混合

1指定最终输出图像(即cv::Mat result_blue)中所需的矩阵或图像数

int from_to1[] = { 0,0, 1,1, 2,2 };
此数组指定src中的哪个通道需要与目标中的哪个通道混合。即0将被复制到0,依此类推

mixChannel中的最后一个参数3指定目标映像中的通道对数

您还可以查看此合并频道的功能

另一个上的
cv::merge()
函数获取多个单通道图像并将其合并以生成高级别图像。请注意,还需要一个int,第二个参数指定需要合并的通道数


最后,我建议您使用函数来更好地理解它们。

:-谢谢您的回复。这行代码是什么意思?int from_to 1[]={0,0,1,1,2,2};你能给我解释一下吗?是(0,0)、(1,1)、(2,2)告诉
mixChannels
如何使用
in1
数组。(0,0)表示将
写入1[0]
结果\u蓝
通道0;和(1,1)表示在1[1]至
结果\u蓝
通道1中的