OpenCV——RGB三通道分离

opencv 和 matlab 在处理彩色图像的时候,通道的存储顺序是不同的。

matlab 的排列顺序是R,G,B; 而在opencv中,排列顺序是B,G,R。 

下面通过一个小程序看看opencv中的三个通道。


// PS_Algorithm.h

#ifndef PS_ALGORITHM_H_INCLUDED
#define PS_ALGORITHM_H_INCLUDED

#include <iostream>
#include <string>
#include "cv.h"
#include "highgui.h"
#include "cxmat.hpp"
#include "cxcore.hpp"

using namespace std;
using namespace cv;

#endif // PS_ALGORITHM_H_INCLUDED


// Public_Function.h

#ifndef PUBLIC_FUNCTION_H_INCLUDED
#define PUBLIC_FUNCTION_H_INCLUDED

#include <iostream>
#include <string>
#include "cv.h"
#include "highgui.h"
#include "cxmat.hpp"
#include "cxcore.hpp"

using namespace std;
using namespace cv;

void Show_Image(Mat&, const string &);
void Save_Image(Mat&, const string &);

#endif // PUBLIC_FUNCTION_H_INCLUDED


/*
The program will Divides multi-channel array
into several single-channel arrays.
We can get the single-channel from a multi-channel
image.
*/

#include "PS_Algorithm.h"
#include "Public_Function.h"
using namespace std;
using namespace cv;

int main()
{
    string Img_name("4.jpg");
    Mat Image_in;
    Image_in=imread(Img_name);
    Show_Image(Image_in, Img_name);


    // convert the type of the image.
    // from the uchar to the float.
    Mat Image_2(Image_in.size(), CV_32FC3);
    Image_in.convertTo( Image_2, CV_32FC3);

    Mat r(Image_in.rows, Image_in.cols, CV_32FC1);
    Mat g(Image_in.rows, Image_in.cols, CV_32FC1);
    Mat b(Image_in.rows, Image_in.cols, CV_32FC1);


    Mat out[]={b,g,r};
    split(Image_2, out);

    // 三个通道的顺序是 b,g,r.
    b=out[0]/255;
    g=out[1]/255;
    r=out[2]/255;

    Show_Image(g, "g");
 
    waitKey();
}


原图



R 通道



G 通道



B 通道


### C++ OpenCV 实现彩色图像 BGR 三通道分离 在使用 C++OpenCV 进行图像处理时,可以通过 `cv::split` 函数来实现彩色图像的 BGR 三通道分离。此函数会将一个通道矩阵分解成多个单通道矩阵。 下面是一个完整的代码示例展示如何加载一张图片并将其三个颜色通道分开: ```cpp #include <opencv2/opencv.hpp> #include <vector> int main() { // 加载一幅彩色图象作为输入数据源 cv::Mat srcImage = cv::imread("path_to_image.jpg"); if (srcImage.empty()) { std::cout << "Could not open or find the image!" << std::endl; return -1; } // 创建一个向量用于存储拆分后的各通道图像 std::vector<cv::Mat> bgr_planes; // 使用 split 函数执行实际的颜色平面分割工作 cv::split(srcImage, bgr_planes); // 显示原始图像以及每个单独的蓝色、绿色和红色组件 cv::imshow("Original Image", srcImage); cv::imshow("Blue Channel", bgr_planes[0]); cv::imshow("Green Channel", bgr_planes[1]); cv::imshow("Red Channel", bgr_planes[2]); // 等待按键事件发生以便查看窗口中的内容 cv::waitKey(0); return 0; } ``` 这段程序首先通过 `cv::imread()` 函数读指定路径下的图像文件,并检查是否成功打开该文件[^1]。接着定义了一个名为 `bgr_planes` 的标准模板库容器(STL),用来保存由 `cv::split()` 函数返回的结果——即原图像按蓝(B)、绿(G)、红(R)顺序排列的三个独立灰度级版本[^5]。最后利用 `cv::imshow()` 来显示这些图像给用户看。 需要注意的是,在OpenCV中,默认情况下使用的色彩模式为BGR而非常见的RGB格式[^4]。因此当提到“BGR”的时候实际上是指按照这种特定次序组织起来的一组像素值集合。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值