OpenCV 图像通道的分离与合并

news2025/6/9 9:48:51


一、知识点
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_8UC3
    cv::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_8UC1
    std::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_8UC3
    cv::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.coloradmin.cn/o/2405205.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Virtex II 系列FPGA的配置原理

对FPGA 芯片的配置&#xff0c;本质上是将根据设计生成的包含配置命令和配置数据的比特流文件写入到配置存储器中。 1 配置模式 Virtex II 系列FPGA 一共有五种配置模式&#xff0c;配置模式的选择是根据管脚M[2:0]来决定。 &#xff08;1&#xff09;串行配置模式 串行配置模…

蓝桥杯 国赛2024python(b组)题目(1-3)

第一题 试卷答题页 - 蓝桥云课 问题描述 在今年蓝桥杯的决赛中&#xff0c;一共有 1010 道题目&#xff0c;每道题目的分数依次为 55 分&#xff0c;55 分&#xff0c;1010 分&#xff0c;1010 分&#xff0c;1515 分&#xff0c;1515 分&#xff0c;2020 分&#xff0c;2020 分…

算法题(165):汉诺塔问题

审题&#xff1a; 本题需要我们找到最优的汉诺塔搬法然后将移动路径输出 思路&#xff1a; 方法一&#xff1a;递归 我们先分析题目 n为2的情况&#xff0c;我们先将第一个盘子移动到三号柱子上&#xff0c;然后再将二号盘子移动到二号柱子上 n为3的情况&#xff0c;我们先将前…

玄机——某次行业攻防应急响应(带镜像)

今天给大家带来一次攻防实战演练复现的过程。 文章目录 简介靶机简介1.根据流量包分析首个进行扫描攻击的IP是2.根据流量包分析第二个扫描攻击的IP和漏扫工具&#xff0c;以flag{x.x.x.x&工具名}3.提交频繁爆破密钥的IP及爆破次数&#xff0c;以flag{ip&次数}提交4. 提…

低代码逻辑引擎配置化实战:三步穿透审批记录查询

在堆积如山的报销单中埋头寻找某笔特殊费用的审批轨迹在跨部门协作时被追问"这个合同到底卡在哪个环节" 在快节奏的办公自动化场景中&#xff0c;这些场景是很常见的&#xff0c;传统OA系统中分散的审批记录查询方式往往太繁琐。 为破解这一痛点&#xff0c;在JVS低…

【Zephyr 系列 15】构建企业级 BLE 模块通用框架:驱动 + 事件 + 状态机 + 低功耗全栈设计

🧠关键词:Zephyr、BLE 模块、架构设计、驱动封装、事件机制、状态机、低功耗、可维护框架 📌面向读者:希望将 BLE 项目从“Demo 工程”升级为“企业可复用框架”的研发人员与技术负责人 📊预计字数:5500+ 字 🧭 前言:从 Demo 到产品化,架构该如何升级? 多数 BLE…

Docker构建Vite项目内存溢出:从Heap Limit报错到完美解决的剖析

问题现象:诡异的"消失的index.html" 最近在CI/CD流水线中遇到诡异现象:使用Docker构建Vite项目时,dist目录中缺少关键的index.html文件,但本地构建完全正常。报错截图显示关键信息: FATAL ERROR: Reached heap limit Allocation failed - JavaScript heap out…

Android端口转发

如上图所示&#xff0c;有一个Android设备&#xff0c;Android设备里面有主板&#xff0c;主板上有网络接口和Wi-Fi&#xff0c;网络接口通过网线连接了一个网络摄像头&#xff0c;这就跟电脑一样&#xff0c;电脑即可以通过网线接入一个网络&#xff0c;也可以同时用Wi-Fi接入…

PHP环境极速搭建

一、为什么选择phpStudy VS Code&#xff1f; 作为一名初次接触PHP的开发者&#xff0c;我深知环境配置往往是学习路上的第一道门槛。传统PHP环境搭建需要手动配置Apache/Nginx、PHP解释器、MySQL等多重组件&#xff0c;光是处理版本兼容性和依赖问题就可能耗费半天时间——这…

建造者模式深度解析与实战应用

作者简介 我是摘星&#xff0c;一名全栈开发者&#xff0c;专注 Java后端开发、AI工程化 与 云计算架构 领域&#xff0c;擅长Python技术栈。热衷于探索前沿技术&#xff0c;包括大模型应用、云原生解决方案及自动化工具开发。日常深耕技术实践&#xff0c;乐于分享实战经验与…

代码中文抽取工具并替换工具(以ts为例)

文章目录 基本思路目录结构配置文件AST解析替换代码中文生成Excel启动脚本 基本思路 通过对应语言的AST解析出中文相关信息&#xff08;文件、所在行列等&#xff09;存到临时文件通过相关信息&#xff0c;逐个文件位置替换掉中文基于临时文件&#xff0c;通过py脚本生成Excel…

pgsql batch insert optimization (reWriteBatchedInserts )

reWriteBatchedInserts 是 PostgreSQL JDBC 驱动 提供的一个优化选项&#xff0c;它可以 重写批量插入语句&#xff0c;从而提高插入性能。 作用 当 reWriteBatchedInsertstrue 时&#xff0c;PostgreSQL JDBC 驱动会将 多个单独的 INSERT 语句 转换为 一个多行 INSERT 语句&a…

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(上)

概述 在 Swift 开发语言中&#xff0c;各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过&#xff0c;在涉及到多个子类派生于基类进行多态模拟的场景下&#xff0c;…

华为云Flexus+DeepSeek征文 | 基于DeepSeek-V3构建企业知识库问答机器人实战

作者简介 我是摘星&#xff0c;一名专注于云计算和AI技术的开发者。本次通过华为云MaaS平台体验DeepSeek系列模型&#xff0c;将实际使用经验分享给大家&#xff0c;希望能帮助开发者快速掌握华为云AI服务的核心能力。 目录 作者简介 1. 引言 2. 技术选型与架构设计 2.1 技…

【Docker 01】Docker 简介

&#x1f308; 一、虚拟化、容器化 ⭐ 1. 什么是虚拟化、容器化 物理机&#xff1a;真实存在的服务器 / 计算机&#xff0c;对于虚拟机来说&#xff0c;物理机为虚拟机提供了硬件环境。虚拟化&#xff1a;通过虚拟化技术将一台计算机虚拟为 1 ~ n 台逻辑计算机。在一台计算机…

AUTOSAR实战教程--DoIP_02_诊断链路建立流程

第一步&#xff1a;DoIP实体车辆声明/诊断仪车辆识别请求 打开激活线以后&#xff0c;DoIP实体发的三帧车辆声明报文。其中包含了DoIP实体的诊断逻辑地址&#xff08;可以类比DoCAN的物理请求/响应地址&#xff09;&#xff0c;对应车辆的VIN码&#xff08;若已配置&#xff0…

音频剪辑软件少之又少好用

我们平时见到的图片以及视频编辑工具非常多&#xff0c;但是音频剪辑软件却是少之又少&#xff0c;更不用说有没有好用的&#xff0c;今天&#xff0c;给大家带来一款非常专业的音频剪辑软件&#xff0c;而且是会员喔。 软件简介 一款手机号登录即可以享受会员的超专业音频剪…

客户端和服务器已成功建立 TCP 连接【输出解析】

文章目录 图片**1. 连接状态解析****第一条记录&#xff08;服务器监听&#xff09;****第二条记录&#xff08;客户端 → 服务器&#xff09;****第三条记录&#xff08;服务器 → 客户端&#xff09;** **2. 关键概念澄清****(1) 0.0.0.0 的含义****(2) 端口号的分配规则** *…

day26-计算机网络-4

1. tcp的11种状态 ss -ant -a 表示看所有状态 -n 表示不将ip解析为主机名 -t 表示tcp 1.1. closed状态&#xff08;客户端、服务端&#xff09; 客户端发起建立连接前的状态服务端启动服务前的状态 1.2. listen状态&#xff08;服务端&#xff09; 服务端软件运行的时候状…

国防科技大学计算机基础慕课课堂学习笔记

1.信息论 香农作为信息论的这个创始人&#xff0c;给出来了这个信息熵的计算方法&#xff0c;为我们现在的这个生活的很多领域奠定了基础&#xff0c;我第一次听说这个信息熵是在这个数学建模里面的理论学习中有关于这个&#xff1a;决策树的模型&#xff0c;在那个问题里面&a…