opencv之split、merge、mixChannels

1 split

函数功能

split()将多通道图像划分成B、G、R三通道。

参数解释

void split(InputArray _m, OutputArrayOfArrays _mv)
_m: 多通道图像
_mv: 输出向量, 包含多通道的Mat

2 merge

函数功能

merge()将多个单通道图像合成一个多通道图像。

参数解释

void merge(InputArrayOfArrays _mv, OutputArray _dst)
_mv: 输入向量, 包含多通道的Mat
_dst: 输出的多通道图像

3 mixChannels

函数功能

mixChannels()是opencv处理图像通道的一个函数,能够实现复杂的通道组合。

参数解释

void cv::mixChannels( const Mat* src, size_t nsrcs, Mat* dst, size_t ndsts, const int* fromTo, size_t npairs )
src: 输入矩阵或向量
nsrcs: 输入矩阵数量
dst: 输出矩阵或向量
ndsts: 输出矩阵数量
fromTo: 列表, 由被复制的通道位置与要复制到的通道位置组成的索引对
npairs: 索引对的数量(要处理的通道数)

4 代码示例

#include 
#include 
using namespace cv;
using namespace std;


class QuickDemo
{
    public:
        void channels_demo(Mat &image);
};


void QuickDemo::channels_demo(Mat &image)
{    
    imshow("input image", image);

    vectormv;

    // 通道分离
    split(image, mv);

    // 0、1、2三个通道分别代表BGR
    imshow("blue", mv[0]);
    imshow("green", mv[1]);
    imshow("red", mv[2]);

    Mat dst;
    // 通道0、2的像素置零
    mv[0] = 0;
    mv[2] = 0;

    // 通道混合
    merge(mv, dst);
    imshow("channel mix", dst);
    
    // 通道交换,0->2,1->1,2->0
    int from_to[] = {0, 2, 1, 1, 2, 0};
    // param1: 输入矩阵或向量; param2: 输入矩阵数量; param3: 输出矩阵或向量; param4: 输出矩阵数量;
    // param5: 由被复制的通道位置与要复制到的通道位置组成的索引对; param6: 索引对的数量(要处理的通道数)
    mixChannels(&image, 1, &dst, 1, from_to, 3);
    imshow("channel switch", dst);
}


int main()
{
    Mat image = imread("D:\\c++_opencv\\images\\0--Parade_0_Parade_marchingband_1_20.jpg", IMREAD_ANYCOLOR);

    if (image.empty())
    {
        printf("could not load image");
        return -1;
    }

    QuickDemo qd;

    qd.channels_demo(image);

    waitKey(0);
    destroyAllWindows();

    return 0;
}

5 结果展示

opencv之split、merge、mixChannels_第1张图片

你可能感兴趣的:(opencv,opencv,计算机视觉,人工智能,c++)