OpenCV 4基础篇| OpenCV图像的拆分和合并

目录

  • 1. 通道拆分
    • 1.1 cv2.split
      • 1.1.1 语法结构
      • 1.1.2 注意事项
      • 1.1.3 代码示例
    • 1.2 NumPy切片
      • 1.2.1 代码示例
  • 2. 通道合并
    • 2.1 cv2.merge
      • 2.1.1 语法结构
      • 2.1.2 注意事项
      • 2.1.3 代码示例

1. 通道拆分

1.1 cv2.split

1.1.1 语法结构

b,g,r = cv2.split(img[, mv]) #图像拆分为 BGR 通道。
  • img:图像数据,nparray 多维数组
  • mv:指定的分拆通道(可选)
  • b,g,r :分割成三个单通道图像,分别代表蓝色、绿色和红色通道,并将它们分别赋值给b、g和r

1.1.2 注意事项

  • OpenCV 使用的图像格式是 BGR(蓝、绿、红),而不是常见的 RGB 格式。因此,当你使用 cv2.split() 拆分通道时,得到的通道顺序将是 B、G、R,而不是 R、G、B。
  • BGR 彩色图像的数据形状为 (width, height, channels=3),返回的 B/G/R 通道的数据形状为 (width, height),不能按照 BGR 彩色图像直接显示。
  • 如果直接用 imshow 显示返回的单通道对象,将被视为 (width, height) 形状的灰度图像显示。
  • 如果要正确显示某一颜色分量,需要增加另外两个通道值(置 0)转换为 BGR 三通道格式,再用 imshow 才能显示为拆分通道的颜色。
  • cv2.split() 操作复杂耗时,可以直接使用 NumPy 切片得到分离通道。

1.1.3 代码示例

import cv2

imgFile = "img/lena.jpg"
img1 = cv2.imread(imgFile, flags=1)  # flags=1 读取彩色图像(BGR)
# 通道拆分
b,g,r=cv2.split(img1)
# 显示图像
cv2.imshow("b", b)
cv2.imshow("g", g)
cv2.imshow("r", r)

cv2.waitKey(0)
cv2.destroyAllWindows()

1

1.2 NumPy切片

1.2.1 代码示例

import cv2

imgFile = "img/lena.jpg"
img1 = cv2.imread(imgFile, flags=1)  # flags=1 读取彩色图像(BGR)
# 获取 B 通道
bImg = img1.copy()  # 获取 BGR
bImg[:, :, 1] = 0  # G=0
bImg[:, :, 2] = 0  # R=0

# 获取 G 通道
gImg = img1.copy()  # 获取 BGR
gImg[:, :, 0] = 0  # B=0
gImg[:, :, 2] = 0  # R=0

# 获取 R 通道
rImg = img1.copy()  # 获取 BGR
rImg[:, :, 0] = 0  # B=0
rImg[:, :, 1] = 0  # G=0

# 显示图像
cv2.imshow("b", bImg)
cv2.imshow("g", gImg)
cv2.imshow("r", rImg)

cv2.waitKey(0)
cv2.destroyAllWindows()  # 释放所有窗口

1

2. 通道合并

2.1 cv2.merge

2.1.1 语法结构

cv2.merge(mv[, dst])  #BGR 通道合并
  • mv:要合并的单通道
  • dst:通道合并的图像,nparray 多维数组

2.1.2 注意事项

  • 进行合并的 B、G、R 单通道图像分量,数据形状必须为 (width, height),而不是形状为 (width, height, channels=3) 的蓝色/绿色/红色图像。
  • 单通道图像分量的图像大小 (width, height) 必须相同才能进行合并。
  • 颜色通道要按照 B、G、R 通道次序合并,才能得到 BGR 格式的合并结果。
  • cv2.merge() 操作复杂耗时,推荐使用 NumPy 数组合并函数 np.stack() 生成合成图像。

2.1.3 代码示例

import cv2

imgFile = "img/lena.jpg"
img1 = cv2.imread(imgFile, flags=1)  # flags=1 读取彩色图像(BGR)
# 通道拆分
b, g, r = cv2.split(img1)

# 通道合并
rgb = cv2.merge([r, g, b])
gbr = cv2.merge([g, b, r])
brg = cv2.merge([b, r, g])

# 显示图像
cv2.imshow("rgb", rgb)
cv2.imshow("gbr", gbr)
cv2.imshow("brg", brg)

cv2.waitKey(0)
cv2.destroyAllWindows()  # 释放所有窗口

1

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/427002.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

《TCP/IP详解 卷一》第10章 UDP 和 IP 分片

目录 10.1 引言 10.2 UDP 头部 10.3 UDP校验和 10.4 例子 10.5 UDP 和 IPv6 10.6 UDP-Lite 10.7 IP分片 10.7.1 例子:IPV4 UDP分片 10.7.2 重组超时 10.8 采用UDP的路径MTU发现 10.9 IP分片和ARP/ND之间的交互 10.10 最大UDP数据报长度 10.11 UDP服务器…

设计模式(十二)享元模式

请直接看原文: 原文链接:设计模式(十二)享元模式-CSDN博客 -------------------------------------------------------------------------------------------------------------------------------- 享元模式定义 享元模式是结构型设计模式的一种&am…

两天学会微服务网关Gateway-Gateway简介

锋哥原创的微服务网关Gateway视频教程: Gateway微服务网关视频教程(无废话版)_哔哩哔哩_bilibiliGateway微服务网关视频教程(无废话版)共计17条视频,包括:1_Gateway简介、2_Gateway工作原理、3…

lv20 QT主窗口4

熟悉创建主窗口项目 1 QAction 2 主窗口 菜单栏:fileMenu menuBar()->addMenu(tr("&File")); 工具栏:fileToolBar addToolBar(tr("File")); 浮动窗:QDockWidget *dockWidget new QDockWidget(tr("Dock W…

C语言-简单实现单片机中的malloc示例

概述 在实际项目中,有些单片机资源紧缺,需要mallloc内存,库又没有自带malloc函数时,此时,就需要手动编写,在此做个笔录。(已在项目上使用),还可进入对齐管理机制。 直接…

韦东山嵌入式Liunx入门驱动开发五

文章目录 一、驱动程序基石1-1 休眠与唤醒1-2 POLL机制1-3 异步通知(1) 异步通知程序解析(2) 异步通知机制内核代码详解 1-4 阻塞与非阻塞1-5 定时器(1) 内核函数(2) 定时器时间单位 1-6 中断下半部 tasklet 本人学习完韦老师的视频,因此来复习巩固,写以…

2023年第十四届蓝桥杯大赛软件类省赛C/C++大学A组真题

2023年第十四届蓝桥杯大赛软件类省赛C/C大学A组部分真题和题解分享 文章目录 蓝桥杯2023年第十四届省赛真题-平方差思路题解 蓝桥杯2023年第十四届省赛真题-更小的数思路题解 蓝桥杯2023年第十四届省赛真题-颜色平衡树思路题解 蓝桥杯2023年第十四届省赛真题-买瓜思路题解 蓝桥…

c/c++ | 静态链接、动态链接

正如标题所见,我们就来讲讲开发时遇到的一些问题,以及解决方案 这里不介绍动态库、静态库的生成与调用, 无论是静态库还是动态库,都是在编译项目的时候链接器会根据编译命令去调用的 如果直接把库(动态、静态不论&…

自己本地模拟内存数据库增删改查

目录 学习初衷准备代码实现结果感谢阅读 学习初衷 用于满足自己的测试要求,不连接数据库,也不在意数据丢失 准备 maven依赖 org.springframework.boot spring-boot-starter-test test 代码实现 内存数据库(InMemoryDatabase&#xff0…

玩转SpringBoot:动态排除Starter配置,轻松部署

引言 在软件开发中,进行本地单元测试是一项常规且必要的任务。然而,在进行单元测试时,有时需要启动一些中间件服务,如Kafka、Elasticjob等。举例来说,我曾经遇到过一个问题:项目中使用了Redisson锁&#x…

试手一下CameraX(APP)

书接上回。 首先还是看谷歌的官方文档: https://developer.android.com/media/camera/camerax?hlzh-cn https://developer.android.com/codelabs/camerax-getting-started?hlzh-cn#1 注:这里大部分内容也来自谷歌文档。 官方文档用的是Kotlin&…

JavaWeb之 创建 Web项目,使用Tomcat 部署项目,使用 Maven 构建Web项目(一万八千字详解)

目录 前言3.1 Tomcat 简介3.1.1 什么是 Web服务器3.1.2 Tomcat 是什么3.1.3 小结 3.2 Tomcat 的基本使用3.2.1 下载 Tomcat3.2.2 安装 Tomcat3.2.3 卸载 Tomcat3.2.4 启动 Tomcat3.2.5 关闭 Tomcat3.2.6 配置 Tomcat3.2.7 在 Tomcat 中部署 Web项目 3.3 在 IDEA 中创建 Web 项目…

探索前景:机器学习中常见优化算法的比较分析

目录 一、介绍 二、技术背景 三、相关代码 四、结论 一、介绍 优化算法在机器学习和深度学习中至关重要,可以最小化损失函数,从而改善模型的预测。每个优化器都有其独特的方法来导航损失函数的复杂环境以找到最小值。本文探讨了一些最常见的优化算法&…

Python爬虫——解析常用三大方式之JsonPath

目录 JsonPath 安装 使用 我们的json数据 基本使用 案例 总结 JsonPath 主要适用于解析一些json的数据 安装 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ jsonpath 使用 obj json.load(open( json文件 , r , encoding utf-8 ) )ret jsonpath.…

一些C语言知识

C语言的内置类型&#xff1a; char short int long float double C99中引入了bool类型&#xff0c;用来表示真假的变量类型&#xff0c;包含true&#xff0c;false。 这个代码的执行结果是什么&#xff1f;好好想想哦&#xff0c;坑挺多的。 #include <stdio.h>int mai…

EdgeX Foundry 安全模式安装部署

文章目录 一、安装准备1.官方文档2. 克隆服务器3.安装 Docker4.安装 docker-compose 二、安装部署1.docker-comepse2.启动 EdgeX Foundry3.访问 UI3.1. consul3.2. EdgeX Console EdgeX Foundry # EdgeX Foundryhttps://iothub.org.cn/docs/edgex/ https://iothub.org.cn/docs…

机器学习|KNN和Kmeans

KNN和Kmeans KNN KNN-K个最近的邻居&#xff0c;而K是可人先预设出来的。 所谓近朱者赤&#xff0c;近墨者黑。 可以选取离当前最近的K个样本来作为辅助判断&#xff0c;因为本样本和最近的K个样本应该是处于一种相似的状态。 以下是一个苹果和梨的识别任务。 图上会出现一个未…

立式学习灯值得买吗?五款立式学习灯真实测评

现在人们注重健康生活&#xff0c;特别是在面对目前青少年严峻的近视情况&#xff0c;大路灯作为补充光线的照明电器&#xff0c;在市场热度持续高涨&#xff0c;但其负面评价也屡见不鲜。有人反映使用后眼睛更容易疲劳、酸疼等不适症状。作为一名专业测评师&#xff0c;我提醒…

pdf编辑软件哪个好用?5款PDF编辑器分享

pdf编辑软件哪个好用&#xff1f;PDF编辑软件在现代办公和学术研究中发挥着举足轻重的作用&#xff0c;它们不仅具备基础的编辑和修改功能&#xff0c;还能够支持多种注释工具&#xff0c;帮助我们高效地管理和整理PDF文件。无论是需要调整文档布局、添加文本或图像&#xff0c…

Linux系统——LNMP架构

目录 一、LNMP架构定义 1.LNMP定义 1.1LNMP工作原理 2.FASTCGI 2.1CGI的由来 2.2为什么会有FastCGI 3.PHP 3.1什么是PHP-FPM 3.2PHP配置 3.1.1对配置文件的修改生效方法 3.1.2/etc/php.ini配置文件格式 3.1.3注释符&#xff1a; 3.1.4php.ini配置参考文档 3.1.5…