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