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

OpenCV4.8 开发实战系列专栏之 08 - 通道分离与合并

大家好,欢迎大家学习OpenCV4.8 开发实战专栏,长期更新,不断分享源码。

专栏代码全部基于C++ 与Python双语演示,专栏答疑群 请联系微信 OpenCVXueTang_Asst

本文关键知识点:

OpenCV中默认imread函数加载图像文件,加载进来的是三通道彩色图像,色彩空间是RGB色彩空间、通道顺序是BGR(蓝色、绿色、红色)、对于三通道的图像OpenCV中提供了两个API函数用以实现通道分离与合并。

  • split // 通道分类
  • merge // 通道合并

扩展一下:
在很多CNN的卷积神经网络中输入的图像一般会要求[h, w, ch]其中h是高度、w是指宽度、ch是指通道数数目、OpenCV DNN模块中关于图像分类的googlenet模型输入[224,224,3]表示的就是224x224大小的三通道的彩色图像输入。

更正一下代码里面的内容关于mixchannels的 Python版本用法,参考如下代码即可:

dst = np.zeros(src.shape, dtype=np.uint8)
print(src.shape)
print(dst.shape)
cv.mixChannels([src], [dst], fromTo=[2, 0, 1, 1, 0, 2])
cv.imshow("output4", dst)

解释:

  1. mixchannels使用前必须先分配好np图像对象
  2. 前两个参数是图像数组!

在图像处理领域,通道分离(split)与合并(merge)是两个基础且重要的操作,它们允许对图像的各个颜色通道进行单独处理或修改。以下是对这两个操作的详细解释:

通道分离(split)

通道分离是指将彩色图像分解成其组成的单个颜色通道。在大多数图像处理库中,如OpenCV,彩色图像通常表示为三个通道的集合:红色(R)、绿色(G)和蓝色(B),尽管在某些情况下也可能使用其他色彩空间(如HSV或YUV),但BGR是最常见的。

  • 功能:使用split函数可以将彩色图像分成R、G、B三个单通道图像,从而方便对这三个通道分别进行操作。
  • 示例:在OpenCV中,可以使用cv.split(src)函数来实现通道分离,其中src是需要分离通道的图像数组。分离后,会得到三个单独的数组,分别代表R、G、B三个通道。
  • 注意事项:通道分离是一个比较耗时的操作,因此应在真正需要时才使用。如果只需要修改多通道图像中的某个通道的值,可以考虑使用numpy等库直接操作数组,而不是进行通道分离。

通道合并(merge)

通道合并是指将分离后的单个颜色通道重新组合成一个彩色图像。这个过程是通道分离的逆操作。

  • 功能:使用merge函数可以将多个单通道图像合并成一个多通道图像。在OpenCV中,这通常用于将R、G、B三个通道重新组合成一个彩色图像。
  • 示例:在OpenCV中,可以使用cv.merge([b, g, r])函数来实现通道合并,其中bgr分别是代表蓝色、绿色和红色通道的数组。合并后,会得到一个新的彩色图像数组。
  • 应用场景:通道合并常用于图像处理中的多种场景,如图像增强、色彩校正、图像合成等。通过修改分离后的通道并重新合并,可以实现各种图像效果。
    在这里插入图片描述

总结

通道分离与合并是图像处理中的基础操作,它们允许对图像的各个颜色通道进行单独处理或修改。这些操作在图像增强、色彩校正、图像合成等领域具有广泛的应用价值。在使用这些操作时,需要注意它们的性能和资源消耗,并根据具体需求选择适当的处理方法。

演示代码

#include <opencv2/opencv.hpp>
#include <iostream>using namespace cv;
using namespace std;int main(int argc, const char *argv[])
{Mat src = imread("D:/vcprojects/images/flower.png");if (src.empty()) {printf("could not load image...\n");return -1;}namedWindow("input", WINDOW_AUTOSIZE);imshow("input", src);vector<Mat> mv;Mat dst1, dst2, dst3;// 蓝色通道为零split(src, mv);mv[0] = Scalar(0);merge(mv, dst1);imshow("output1", dst1);// 绿色通道为零split(src, mv);mv[1] = Scalar(0);merge(mv, dst2);imshow("output2", dst2);// 红色通道为零split(src, mv);mv[2] = Scalar(0);merge(mv, dst3);imshow("output3", dst3);waitKey(0);return 0;
}

python 代码演示

import cv2 as cvsrc = cv.imread("D:/vcprojects/images/flower.png")
cv.namedWindow("input", cv.WINDOW_AUTOSIZE)
cv.imshow("input", src)# 蓝色通道为零
mv = cv.split(src)
mv[0][:, :] = 0
dst1 = cv.merge(mv)
cv.imshow("output1", dst1)# 绿色通道为零
mv = cv.split(src)
mv[1][:, :] = 0
dst2 = cv.merge(mv)
cv.imshow("output2", dst2)# 红色通道为零
mv = cv.split(src)
mv[2][:, :] = 0
dst3 = cv.merge(mv)
cv.imshow("output3", dst3)cv.mixChannels(src, dst3, [2, 0])
cv.imshow("output4", dst3)cv.waitKey(0)
cv.destroyAllWindows()

结束语

学习贵在坚持,学习OpenCV贵在每一天的代码练习,原理跟基本的函数解释,相关知识,后续更新边学边理解,搞技术永远要坚持做长期主义者!我们一起努力!!!

专栏答疑群 请联系微信 OpenCVXueTang_Asst

http://www.lryc.cn/news/466634.html

相关文章:

  • iOS 18.1 RC 版本发布,修复iPhone16随机重启、浏览视频卡顿等bug
  • 安装buildkit,并使用buildkit构建containerd镜像
  • maven jar包二进制文件 invalid stream header: EFBFBDEF 的错误
  • Git绑定Gitee或Github以及Git面试常见题
  • 值得细读的8个视觉大模型生成式预训练方法
  • go 包相关知识
  • 机器学习:opencv--人脸检测以及微笑检测
  • linux系统挂载硬盘
  • MySQL实现主从同步
  • 人工智能--数学基础
  • 2024人工智能技术的普及 如何看待AI技术的应用前景
  • 日常记录:springboot 2.2.5 + es 6.8.12
  • MySQL数据库备份与恢复详解
  • 10.22 MySQL
  • 「AIGC」n8n AI Agent开源的工作流自动化工具
  • Android 中获取和读取短信验证码
  • SQL语句高级查询(适用于新手)
  • main.ts中引入App.vue报错,提示“Cannot find module ‘./App.vue’ or its corresponding type
  • Android15音频进阶之组音量调试(九十)
  • 【Java】常用方法合集
  • 深入了解Vue Router:基本用法、重定向、动态路由与路由守卫的性能优化
  • 深入理解InnoDB底层原理:从数据结构到逻辑架构
  • Linux介绍及操作命令
  • JS | 详解图片懒加载的6种实现方案
  • Java | Leetcode Java题解之第502题IPO
  • JavaWeb学习(3)
  • 【含开题报告+文档+PPT+源码】基于SpringBoot的百货商城管理系统的设计与实现
  • Elasticsearch 实战应用与优化策略研究
  • 植物大战僵尸杂交版游戏分享
  • ProteinMPNN中DecLayer类介绍