文章目录
一、通道的拆分 与 合并
二、演示
一、通道的拆分 与 合并
在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通道;
头文件 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);
}