当前位置: 首页 > ai >正文

OpenCV 图像通道的分离与合并


一、知识点
1、一张彩色图像可以由R、G、B三个通道的灰度图合并而成。

2、void split(InputArray m, OutputArrayOfArrays mv);
  (1)、将多通道阵列划分为几个单通道阵列。
  (2)、参数说明:
      m: 要分离的多通道阵列。
      mv: 输出的vector容器,每个元素都是一个单通道阵列。
  (3)、m.channels()和mv.size()相等。
  
3、void merge(InputArrayOfArrays mv, OutputArray dst);
  (1)、将几个单通道阵列合并为一个多通道阵列。
  (2)、参数说明:
      mv: 输入的vector容器,每个元素都是一个单通道阵列。
      dst: 输出的经过合并的一个多通道阵列。
  (3)、mv.size()和dst.channels()相等。
 
4、void mixChannels(const Mat * src, size_t nsrcs, Mat * dst, size_t ndsts, const int * fromTo, size_t npairs);
  (1)、将输入图像的某些通道值复制给输出图像的某些通道中。
  (2)、参数说明:
      src: 输入图像的指针。
      nsrcs: 输入图像的个数。
      dst: 输出图像的指针,注意必须分配好内存,大小、深度和src[0]相同。
      ndsts: 输出图像的个数。
      fromTo: 输入图像通道与输出图像通道的对应关系。 src[0]通道索引范围[0, src[0].channels() - 1],src[1]通道索引范围[src[0].channels(), src[0].channels() + src[1].channels() - 1],输出图像也满足此规律。
      npairs: 有几个from->to。


  二、示例代码

#include <iostream>
#include <opencv2/opencv.hpp>int main()
{//原始图像类型是CV_8UC3cv::Mat src = cv::Mat::zeros(4, 3, CV_8UC3);src = cv::Scalar(120, 50, 88);std::cout << "src:" << std::endl << src << std::endl;//通道分离//vecM[0]图像类型是CV_8UC1,vecM[1]图像类型是CV_8UC1, vecM[2]图像类型是CV_8UC1std::vector<cv::Mat> vecM;cv::split(src, vecM);std::cout << "src B:" << std::endl << vecM[0] << std::endl;std::cout << "src G:" << std::endl << vecM[1] << std::endl;std::cout << "src R:" << std::endl << vecM[2] << std::endl;std::cout << "src.channels() = " << src.channels() << ", vecM.size() = " << vecM.size() << std::endl;//通道合并//三通道合并后,结果和原始图像类型相同,为CV_8UC3cv::Mat dst;cv::merge(vecM, dst);std::cout << "通道合并:" << std::endl << dst << std::endl;//去掉G通道值, BR通道值合并vecM[1] = 0;cv::Mat dst2;cv::merge(vecM, dst2);std::cout << "去掉G通道值, BR通道值合并:" << std::endl << dst2 << std::endl;//再去掉R通道值,只保留B通道vecM[2] = 0;cv::Mat dst3;cv::merge(vecM, dst3);std::cout << "再去掉R通道值,只保留B通道:" << std::endl << dst3 << std::endl;//通道混合//注意, dst4需要提前分配好内存。//{ 0, 2, 1, 1, 2, 0 }表示把输入图像0通道值给输出图像2通道,把输入图像1通道值给输出图像1通道,把输入图像2通道值给输出图像0通道。cv::Mat dst4 = cv::Mat::zeros(src.size(), src.type());int from_to[] = { 0, 2, 1, 1, 2, 0 };cv::mixChannels(&src, 1, &dst4, 1, from_to, 3);std::cout << "通道混合:" << std::endl << dst4 << std::endl;int input = 0;std::cin >> input;return 0;
}输出结果:
src:
[120,  50,  88, 120,  50,  88, 120,  50,  88;120,  50,  88, 120,  50,  88, 120,  50,  88;120,  50,  88, 120,  50,  88, 120,  50,  88;120,  50,  88, 120,  50,  88, 120,  50,  88]
src B:
[120, 120, 120;120, 120, 120;120, 120, 120;120, 120, 120]
src G:
[ 50,  50,  50;50,  50,  50;50,  50,  50;50,  50,  50]
src R:
[ 88,  88,  88;88,  88,  88;88,  88,  88;88,  88,  88]
src.channels() = 3, vecM.size() = 3
通道合并:
[120,  50,  88, 120,  50,  88, 120,  50,  88;120,  50,  88, 120,  50,  88, 120,  50,  88;120,  50,  88, 120,  50,  88, 120,  50,  88;120,  50,  88, 120,  50,  88, 120,  50,  88]
去掉G通道值, BR通道值合并:
[120,   0,  88, 120,   0,  88, 120,   0,  88;120,   0,  88, 120,   0,  88, 120,   0,  88;120,   0,  88, 120,   0,  88, 120,   0,  88;120,   0,  88, 120,   0,  88, 120,   0,  88]
再去掉R通道值,只保留B通道:
[120,   0,   0, 120,   0,   0, 120,   0,   0;120,   0,   0, 120,   0,   0, 120,   0,   0;120,   0,   0, 120,   0,   0, 120,   0,   0;120,   0,   0, 120,   0,   0, 120,   0,   0]
通道混合:
[ 88,  50, 120,  88,  50, 120,  88,  50, 120;88,  50, 120,  88,  50, 120,  88,  50, 120;88,  50, 120,  88,  50, 120,  88,  50, 120;88,  50, 120,  88,  50, 120,  88,  50, 120]


 

http://www.xdnf.cn/news/12061.html

相关文章:

  • SpringBoot3项目架构设计与模块解析
  • CIFAR10的使用
  • 【Redis】Redis 的常见客户端汇总
  • 四六级监考《培训学习》+《培训考试》
  • linux 串口调试命令 stty
  • HTML中各种标签的作用
  • 储能数字化的第一步,是把直流能量“看清楚
  • 【Qt】之【Get√】【Bug】通过值捕获(或 const 引用捕获)传进 lambda,会默认复制成 const
  • 二叉树-104.二叉树的最大深度-力扣(LeetCode)
  • (头歌作业)-6.5 幻方(project)
  • 【大模型】MCP是啥?它和点菜、做菜、端菜有啥关系?
  • 【python深度学习】Day 45 Tensorboard使用介绍
  • [蓝桥杯]摆动序列
  • 深度强化学习驱动的智能爬取策略优化:基于网页结构特征的状态表示方法
  • Ubuntu ssh 永久添加私钥
  • Ubuntu ifconfig 查不到ens33网卡
  • 【Android基础回顾】三:Android启动流程
  • 使用Python提取PDF元数据的完整指南
  • 《棒球百科知识》1号位是什么位置·野球1号位
  • 三甲医院“AI平台+专家系统”双轮驱动模式的最新编程方向分析
  • 基于51单片机的天然气浓度检测报警系统
  • 第14节 Node.js 全局对象
  • AI系统微服务架构——服务网关与API网关
  • STM32发送MQTT请求到Onenet
  • 基于 TensorFlow 2 的 WGAN来生成表格数据、数值数据和序列数据。 WGAN生成对抗网络。代码仅供参考
  • kubernetes jenkins pipeline优化拉取大仓库性能指定分支+深度
  • 【物联网-S7Comm协议】
  • 快速用 uv 模拟发布一个 Python 依赖包到 TestPyPI 上,以及常用命令
  • scDown:单细胞RNA测序下游分析管道-文献精读140
  • Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!