项目功能实现:对一张彩色图片的三个颜色通道进行分离,修改之后进行合并
按照之前的博文结构来,这里就不在赘述了
一、头文件
channel.h
#pragma once
#include<opencv2/opencv.hpp>
using namespace cv;
class CHANNELS {
public:
void channel(Mat& image);
};
#pragma once
二、函数实现
splict_marge.cpp
split(image,beyond);
将上传的图片image的颜色通道进行分割,赋值给beyond,此时的beyond的下标0,1,2分别就代表这BGR三颜色通道的单个数据信息
因为是单颜色通道,故显示的只是黑白图
想要展示纯通道的彩色图片,只需要将其他两个通道值赋值为0,然后三颜色通道进行合并即可
beyond[0] = 0;//Blue设置全0
beyond[1] = 0;//Green设置为全0
merge(beyond, result);//合并BGR三颜色通道,形成只包含红色的彩色图像
此时的beyond[0]表示B通道,设置为全0、beyond[1]表示G通道,也设置为全0、beyond[2]表示R通道,保持不变
合并之后便会显示单纯得红色得通道的数据信息,得到的结果为result
mixChannels(&image, 1, &result, 1, from_to, 3);
按照from_to的规则进行切换颜色通道
int from_to[] = { 0,2,1,1,2,0 };
0和2、1和1、2和0互相调换颜色通道,说白了,现在变成了RGB了
之前家驹(Red)和世荣(Blue)穿的衣服的颜色反过来了
#include"channel.h"
#include<iostream>
#include<opencv2/opencv.hpp>
void CHANNELS::channel(Mat& image) {
std::vector<Mat>beyond;
Mat result;
split(image,beyond);
imshow("Blue_only",beyond[0]);
imshow("Green_only", beyond[1]);
imshow("Red_only", beyond[2]);
//这里只是举例,只保留红色颜色通道,其他的都类似
beyond[0] = 0;//Blue设置全0
beyond[1] = 0;//Green设置为全0
merge(beyond, result);//合并BGR三颜色通道,形成只包含红色的彩色图像
imshow("Red",result);
int from_to[] = { 0,2,1,1,2,0 };//0和2 1和1 2和0 互相调换颜色通道,说白了,现在变成了RGB了
mixChannels(&image, 1, &result, 1, from_to, 3);//之前是BGR为(0,0,255),之后变成了(255,0,0)了
imshow("mixChannels",result);
}
三、主函数
yy_main.cpp
#include <opencv2/opencv.hpp>
#include <iostream>
#include "channel.h"
using namespace cv;
using namespace std;
int main(int argc, char** argv) {
Mat src = cv::imread("E:/C++_workspace/beyond.jpg", IMREAD_COLOR);
if (src.empty()) {
printf("load image is false...\n");
return -1;
}
namedWindow("yanyu", WINDOW_FREERATIO);
imshow("yanyu", src);
CHANNELS yy;
yy.channel(src);
waitKey(0);
destroyAllWindows();
return 0;
}
项目结构如下:
效果图如下: