概述
在图像处理中,有时需要对各个通道进行分离,分别处理。
在OpenCV中,cv::split()用于实现图像通道的分离。
而cv::merge()用于实现图像通道的合并,是split的逆向操作。
函数
void merge
(
vector mv,
OutputArray dst
)
- mv 是vector容器,装载不同通道的图像信息。
- dst 输出的图像。
测试代码
#include "widget.h"
#include "ui_widget.h"
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <vector>
using namespace cv;
using namespace std;
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
//载入图片
cv::Mat src = imread("c:/opencv/666.jpg");
imshow("src",src);
//分离
vector<Mat> channels;
cv::split(src,channels);
//接收
cv::Mat channel_red = channels.at(2);
cv::Mat channel_green = channels.at(1);
cv::Mat channel_blue = channels.at(0);
//显示
imshow("channel_red",channel_red);
imshow("channel_green",channel_green);
imshow("channel_blue",channel_blue);
//建立一个空白通道
cv::Size size(src.cols,src.rows);
cv::Mat mat0 = cv::Mat::zeros(size,CV_8UC1);
//合并R通道
vector<Mat> ch_r;
ch_r.push_back(mat0);
ch_r.push_back(mat0);
ch_r.push_back(channel_red);
cv::Mat mat_red;
cv::merge(ch_r,mat_red);
imshow("mat_red",mat_red);
//合并G通道
vector<Mat> ch_g;
ch_g.push_back(mat0);
ch_g.push_back(channel_green);
ch_g.push_back(mat0);
cv::Mat mat_green;
cv::merge(ch_g,mat_green);
imshow("mat_green",mat_green);
//合并B通道
vector<Mat> ch_b;
ch_b.push_back(channel_blue);
ch_b.push_back(mat0);
ch_b.push_back(mat0);
cv::Mat mat_blue;
cv::merge(ch_b,mat_blue);
imshow("mat_blue",mat_blue);
}
Widget::~Widget()
{
delete ui;
}