opencv —— mixChannels 通道复制

て烟熏妆下的殇ゞ 提交于 2020-03-10 09:51:30

mixChannels 主要就是把输入的图像(或图像集)的某些通道拆分复制给对应的输出图像(或图像集)的某些通道中,其中的对应关系由 fromTo 参数制定。

通道复制:mixChannels 函数

void mixChannels(const Mat* src, size_t nsrcs, Mat* dst, size_t ndsts, const int* fromTo, size_to npairs);

  • src,输入的图像或图像集,需要有相同的尺寸和深度。
  • nsrcs,输入图像个数。
  • dst,输出图像,所有图像必须被初始化,且大小和深度必须与 src[0] 相同。
  • ndsts,输出图像个数。
  • fromTo,输入图像通道与输出图像通道的对应关系。对于输入图像,第一幅图的通道索引可选范围 [0, src[0].channels() - 1],第二幅图的通道索引可选范围 [src[0].channels(), src[0].channels() + src[1].channels() - 1] 。输出图像亦满足这个规律。举个例子,假设输入和输出图像均为三通道图像,想要将输入图像中第 3 幅图的第 1 个通道放入到输出图像第 2 幅图的第三个通道,则对应关系为 src[2][0] -> dst[1][2] ,在 fromTo 中形式为 6 -> 5。
  • npairs,fromTo 的索引数,即有几个 fromTo。

 

代码示例:

#include<opencv.hpp>
#include<iostream>
using namespace std;
using namespace cv;
Mat src, hsvImg;
int main() {
    src = imread("C:/Users/齐明洋/Desktop/证件照/1.jpg");
    imshow("src", src);

    //转换为 HSV 通道图像
    cvtColor(src, hsvImg, COLOR_BGR2HSV);
    imshow("hsvImg", hsvImg);

    Mat hImg = Mat(src.size(), CV_8UC1);
    Mat sImg = Mat(src.size(), CV_8UC1);
    Mat vImg = Mat(src.size(), CV_8UC1);

    Mat dst[] = { hImg,sImg,vImg };
    //hsvImg[0]->hImg[0] hImg 在 dst 中的通道索引为:0
    //hsvImg[1]->sImg[0] sImg 在 dst 中的通道索引为:1
    //hsvImg[2]->vImg[0] vImg 在 dst 中的通道索引为:2
    int fromTo[] = { 0,0,1,1,2,2 };
    mixChannels(&hsvImg, 1, dst, 3, fromTo, 3);
    imshow("hImg", hImg);
    imshow("sImg", sImg);
    imshow("vImg", vImg);

    waitKey(0);
}

效果演示:

 

借鉴博客:https://www.cnblogs.com/ruic/archive/2015/10/31/4926254.html

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!