0
点赞
收藏
分享

微信扫一扫

OpenCV + CPP 系列(七)通道的拆分|合并|混合

文章目录

一、通道的拆分 与 合并

二、演示

一、通道的拆分 与 合并

在BGR的颜色空间中,我们可以对其中每一个通道进行操作,或者对其中多个通道进行操作,或者对所有通道进行操作,会得到不同的效果。PS中有各种通道混合叠加技巧,了解通道的混合技巧,相信各位会对通道有者更深的印象。


主要函数了解:


split 拆分通道为:B,G,R

merge 合并通道。

mixChannels 通道混合。


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


参数说明:


void mixChannels( 
const Mat* src, //输入数组或向量矩阵,所有矩阵的大小和深度必须相同。
size_t nsrcs, //矩阵的数量
Mat* dst, //输出数组或矩阵向量,大小和深度必须与src[0]相同
size_t ndsts,//矩阵的数量
const int* fromTo, //指定被复制通道与要复制到的位置组成的索引对
size_t npairs //fromTo中索引对的数目
);

将一个4通道BGRA图像分割成一个3通道BGR和一个单独的alpha通道图像:


bgra的 0通道复制到 out[]的2通道,即bgr的0通道;

bgra的 1通道复制到 out[]的1通道,即bgr的1通道;


bgra的 2通道复制到 out[]的0通道,即bgr的2通道;


bgra的 3通道复制到 out[]的3通道,即alpha通道;


OpenCV + CPP 系列(七)通道的拆分|合并|混合_opencv

头文件 quick_opencv.h:声明类与公共函数

#pragma
#include <opencv2\opencv.hpp>
using namespace cv;

class QuickDemo {
public:
...
void channel_Demo(Mat& image); //新增方法
};

主函数调用该类的公共成员函数

#include <opencv2\opencv.hpp>
#include <quick_opencv.h>
#include <iostream>
using namespace cv;


int main(int argc, char** argv) {
Mat src = imread("D:\\Desktop\\pandas_small22.png");
if (src.empty()) {
printf("Could not load images...\n");
return -1;
}
namedWindow("input", WINDOW_NORMAL);
imshow("input", src);

QuickDemo qk;
...
qk.channel_Demo(src);
waitKey(0);
destroyAllWindows();
return 0;
}

二、演示

源文件 quick_demo.cpp:实现类与公共函数

#include <quick_opencv.h>

// ...

void QuickDemo::channel_Demo(Mat& image) {
// 声明vector容器存放 mat
std::vector<Mat> bgr;
split(image.clone(), bgr);
imshow("b_channel", bgr[0]);
imshow("g_channel", bgr[1]);
imshow("r_channel", bgr[2]);

Mat dst_red;
bgr[0] = 0;
bgr[1] = 0;
merge(bgr, dst_red);
imshow("dst_red", dst_red);

// 先拆分通道再合并
std::vector<Mat> channels;
split(image.clone(), channels);
Mat blue_channel = channels[0];
Mat green_channel = channels[1] = 0;
Mat red_channel = channels[2] = 0;

std::vector<Mat> newchannels;
Mat dst_blue;
newchannels.push_back(blue_channel);
newchannels.push_back(green_channel);
newchannels.push_back(red_channel);
merge(newchannels, dst_blue);
imshow("dst_blue", dst_blue);


// 声明 Mat数组存放 mat
Mat dst_green, BGR[3];
split(image.clone(), BGR);
BGR[0] = 0;
BGR[2] = 0;
merge(BGR, 3, dst_green);
imshow("dst_green", dst_green);


//通道混合
Mat dst_mix = dst_green.clone();
int from_to[] = { 0,2,1,1,2,0 };
mixChannels(&image, 1, &dst_mix, 1, from_to, 3);
imshow("通道混合", dst_mix);
}

OpenCV + CPP 系列(七)通道的拆分|合并|混合_参数说明_02

OpenCV + CPP 系列(七)通道的拆分|合并|混合_数组_03


举报

相关推荐

0 条评论