OpenCvSharp从入门到实践-(05)通道

目录

1、拆分通道

1.1、实例1-拆分一副BGR图像的通道

 1.2、实例2-拆分一副HSV图像的通道

2、合并通道

2.1 实例3-合并通道的顺序不同,图像的显示效果也不通

实例4-合格H通道图像、S通道图像、V通道图像

3、综合运用拆分通道和合并通道

2.2、实例5-只把H通道的值调整为180

4、alpha通道

4.1、实例5-调整A通道的值


一副BGR图像是由B通道、G通道、R通道这3个通道构成的。本篇博客介绍如何对通道进行拆分和合并,从而达到处理图像的目的。

1、拆分通道

OpenCvSharp提供Cv2.Split函数,函数如下:

public static void Split(Mat src, out Mat[] mv)

说明

摘要:
    Copies each plane of a multi-channel array to a dedicated array

参数:
  src:
    The source multi-channel array

  mv:
    The destination array or vector of arrays; The number of arrays must match mtx.channels()
    . The arrays themselves will be reallocated if needed

1.1、实例1-拆分一副BGR图像的通道

代码如下:

Mat mat = Cv2.ImRead("test.jpg");
Cv2.ImShow("SRC", mat);

Mat[] mv;
Cv2.Split(mat, out mv);

Cv2.ImShow("B", mv[0]);
Cv2.ImShow("G", mv[1]);
Cv2.ImShow("R", mv[2]);

Cv2.WaitKey();
Cv2.DestroyAllWindows();

原图如下:

运行代码后得到的B、G、R通道图如下:

 1.2、实例2-拆分一副HSV图像的通道

代码如下:

Mat mat = Cv2.ImRead("test.jpg");

Cv2.CvtColor(mat, mat, ColorConversionCodes.BGR2HSV);

Mat[] mv;
Cv2.Split(mat, out mv);

Cv2.ImShow("H", mv[0]);
Cv2.ImShow("S", mv[1]);
Cv2.ImShow("V", mv[2]);

Cv2.WaitKey();
Cv2.DestroyAllWindows();

运行代码后得到的H、S、V通道图如下:

2、合并通道

OpenCvSharp提供Cv2.Merge函数合并通道,函数如下:

public static void Merge(Mat[] mv, Mat dst)

说明

摘要:
    makes multi-channel array out of several single-channel arrays

参数:
  mv:

  dst:

2.1 实例3-合并通道的顺序不同,图像的显示效果也不通

编写程序,先拆分通道,再分别按照BGR的顺序和RGB的顺序合并通道。

代码如下:

Mat mat = Cv2.ImRead("test.jpg");

Mat[] mv;
Cv2.Split(mat, out mv);

Mat dst = new Mat();
Cv2.Merge(new Mat[] { mv[0], mv[1], mv[2] }, dst);
Cv2.ImShow("BGR", dst);

Cv2.Merge(new Mat[] { mv[2], mv[1], mv[0] }, dst);
Cv2.ImShow("RGB", dst);

Cv2.WaitKey();
Cv2.DestroyAllWindows();

运行代码后,效果如下:

实例4-合格H通道图像、S通道图像、V通道图像

代码如下:

Mat mat = Cv2.ImRead("test.jpg");

Cv2.ImShow("SRC", mat);

Cv2.CvtColor(mat, mat, ColorConversionCodes.BGR2HSV);

Mat[] mv;
Cv2.Split(mat, out mv);

Mat dst = new Mat();
Cv2.Merge(new Mat[] { mv[0], mv[1], mv[2] }, dst);
Cv2.ImShow("HSV", dst);

Cv2.WaitKey();
Cv2.DestroyAllWindows();

运行代码后,效果如下:

3、综合运用拆分通道和合并通道

在HSV色彩空间,如果保持其中两个通道的值不变,调整第3个通道的值,可以得到相应的艺术效果。

2.2、实例5-只把H通道的值调整为180

编写一个程序,首先将测试图片从BGR色彩空间转换到HSV色彩空间;然后拆分得到HSV图像中的通道;接着让S通道和V通道的值保持不变,把H通道的值调整为180;再接着合并拆分后的通道图像,把这个图像从HSV色彩空间转换到BGR色彩空间;最后显示得到的BRG图像。代码如下:

Mat mat = Cv2.ImRead("test.jpg");

Cv2.ImShow("SRC", mat);

Cv2.CvtColor(mat, mat, ColorConversionCodes.BGR2HSV);

Mat[] mv;
Cv2.Split(mat, out mv);

// 将H通道的值全部调整为180
mv[0] = new Mat(mv[0].Size(), mv[0].Type(), new Scalar(180));

Mat dst = new Mat();
Cv2.Merge(new Mat[] { mv[0], mv[1], mv[2] }, dst);

Cv2.CvtColor(dst, dst, ColorConversionCodes.HSV2BGR);

Cv2.ImShow("NEW", dst);

Cv2.WaitKey();
Cv2.DestroyAllWindows();

运行代码后,效果如下:

如果让H通道和S通道的值保持不变,只把V通道的值调整为255,代码如下:

Mat mat = Cv2.ImRead("test.jpg");
Cv2.ImShow("SRC", mat);

Cv2.CvtColor(mat, mat, ColorConversionCodes.BGR2HSV);

Mat[] mv;
Cv2.Split(mat, out mv);

// 将V通道的值全部调整为255
mv[2] = new Mat(mv[2].Size(), mv[2].Type(), new Scalar(255));

Mat dst = new Mat();
Cv2.Merge(new Mat[] { mv[0], mv[1], mv[2] }, dst);

Cv2.CvtColor(dst, dst, ColorConversionCodes.HSV2BGR);

Cv2.ImShow("NEW", dst);

Cv2.WaitKey();
Cv2.DestroyAllWindows();

效果如下:

如果让H通道和V通道的值保持不变,只把S通道的值调整为255,代码如下:

Mat mat = Cv2.ImRead("test.jpg");
Cv2.ImShow("SRC", mat);

Cv2.CvtColor(mat, mat, ColorConversionCodes.BGR2HSV);

Mat[] mv;
Cv2.Split(mat, out mv);

// 将S通道的值全部调整为255
mv[1] = new Mat(mv[1].Size(), mv[1].Type(), new Scalar(255));

Mat dst = new Mat();
Cv2.Merge(new Mat[] { mv[0], mv[1], mv[2] }, dst);

Cv2.CvtColor(dst, dst, ColorConversionCodes.HSV2BGR);

Cv2.ImShow("NEW", dst);

Cv2.WaitKey();
Cv2.DestroyAllWindows();

效果如下:

4、alpha通道

BGR色彩空间包含3个通道,即B通道、G通道、R通道,OpenCV在这个3个通道的基础上,又增加了一个A通道,即alpha通道,用于设置图像的透明度。这样,一个由B通道、G通道、R通道和A通道这4个通道构成的色彩空间就诞生了,即BGRA通道。在BGRA色彩空间中,alpha通道在区间[0,255]内取值;其中0表示透明,255表示不透明。

4.1、实例5-调整A通道的值

编写一个程序,首先将测试图片从BGR色彩空间转换到BGRA色彩空间;然后拆分得到BGRA图像中的通道;接着把BGRA图像的透明度调整为172;再接着合并拆分后的通道图像,再接着BGRA图像的透明度调整为0后,合并拆分后的通道图像;最后分别显示RGBA图像、透明度为172的RGBA图像和透明度为0的RGBA图像,代码如下:

Mat mat = Cv2.ImRead("test.jpg");

Cv2.CvtColor(mat, mat, ColorConversionCodes.BGR2BGRA);
Cv2.ImShow("BGRA", mat);

Mat[] mv;
Cv2.Split(mat, out mv);

Mat dst_bgra_172 = new Mat();
// 将透明度调整为172(半透明)
mv[3] = new Mat(mv[3].Size(), mv[3].Type(), new Scalar(172));
Cv2.Merge(new Mat[] { mv[0], mv[1], mv[2], mv[3] }, dst_bgra_172);

Mat dst_bgra_0 = new Mat();
// 将透明度调整为0(透明)
mv[3] = new Mat(mv[3].Size(), mv[3].Type(), new Scalar(0));
Cv2.Merge(new Mat[] { mv[0], mv[1], mv[2], mv[3] }, dst_bgra_0);

Cv2.ImShow("BGRA A=172", dst_bgra_172);
Cv2.ImShow("BGRA A=0", dst_bgra_0);

Cv2.WaitKey();
Cv2.DestroyAllWindows();

效果如下:

虽然在代码中调整了BGRA图像中A通道的值,但是显示图像的效果是一样的。为了显示这3幅图的不同效果,需要用方法将这3幅图像保存到磁盘上,代码如下:

Mat mat = Cv2.ImRead("test.jpg");

Cv2.CvtColor(mat, mat, ColorConversionCodes.BGR2BGRA);

Mat[] mv;
Cv2.Split(mat, out mv);

Mat dst_bgra_172 = new Mat();
// 将透明度调整为172(半透明)
mv[3] = new Mat(mv[3].Size(), mv[3].Type(), new Scalar(172));
Cv2.Merge(new Mat[] { mv[0], mv[1], mv[2], mv[3] }, dst_bgra_172);

Mat dst_bgra_0 = new Mat();
// 将透明度调整为0(透明)
mv[3] = new Mat(mv[3].Size(), mv[3].Type(), new Scalar(0));
Cv2.Merge(new Mat[] { mv[0], mv[1], mv[2], mv[3] }, dst_bgra_0);

Cv2.ImWrite("brga.png", mat);
Cv2.ImWrite("brga_0.png", dst_bgra_0);
Cv2.ImWrite("brga_172.png", dst_bgra_172);

Cv2.WaitKey();
Cv2.DestroyAllWindows();

效果如下:

说明:PNG图像是一种典型的4通道(即B通道、G通道、R通道和A通道)图像,因此被保存的3幅图像的格式为.png

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

头插法巧解任意链表区间反转

题目链接:https://leetcode.cn/problems/reverse-linked-list-ii/description/?envTypestudy-plan-v2&envIdtop-interview-150 头节点插入法,设置一个虚拟节点,不断循环到要反转的前面一个位置,哪怕是1也能包含进去。接着反…

python如何打乱列表里的元素顺序

可以使用random模块中的shuffle函数来打乱列表里的元素顺序。示例如下: import randommy_list [1, 2, 3, 4, 5] random.shuffle(my_list) print(my_list)运行以上代码会输出一个打乱了顺序的列表。

Java后端开发——MVC商品管理程序

Java后端开发——MVC商品管理程序 本篇文章内容主要有下面几个部分: MVC架构介绍项目环境搭建商品管理模块Servlet代码重构BaseServlet文件上传 MVC 是模型-视图-控制器(Model-View-Controller),它是一种设计模式,也…

中低压MOSFET 2N7002KW 60V 300mA 双N通道 SOT-323封装

2N7002KW小电流双N通道MOSFET,电压60V电流300mA,采用SOT-323封装形式。超高密度电池设计,适用于极低的ros (on),具有导通电阻和最大直流电流能力,ESD保护。可应用于笔记本中的电源管理,电池供电系统等产品应…

实用又好用Mybatis-Plus版的EasyCode模板

1:插件下载 Plugins中搜索EasyCode,并且下载安装 2:模板编写 2.1:entity.vm.java模板 ##引入宏定义 $!{define.vm}##使用宏定义设置回调(保存位置与文件后缀) #save("/entity", "DO.java")##使…

建筑结构健康监测系统和传统人工监测的区别

在繁华的城市里,建筑结构作为城市生命线的重要一环,其安全与稳定对城市的运转和居民的生活至关重要。为了更好地守护建筑结构的健康,WITBEE万宾自主研发建筑结构健康监测系统让建筑安全,在上一个台阶。 WITBEE万宾建筑结构健康监测…

DC电源模块的散热措施

BOSHIDA DC电源模块的散热措施 DC电源模块的散热措施可以分为以下几种: 1. 增加散热器:在DC电源模块的电路板上增加散热片或散热器,通过增加散热面积和散热能力来提高散热效果。 2. 增加风扇:在散热器的基础上增加风扇&#xff…

《枪炮、病菌与钢铁》读书笔记

文章目录 一、分享书的主要内容1.1 现代人类的起源1.2 人类发展的基石——农业1.3 人类文明传承的关键——语言文字1.4 正反馈的发展加速器——技术1.5 不断发展与探索的过程——社会组织形态1.6 伴随发展的隐身者——病菌1.7 地理隔离带来的传播难易程度 二、暂时拒绝虚无2.1 …

Axios 并发请求指南 - 3 种简单实用的方法

在实际开发中,我们经常需要同时发送多个请求,并在所有请求完成后进行处理,这就是所谓的并发请求。实现 Axios 并发请求的关键是使用 Axios.all 方法,它接受一个 Promise 的数组作为参数,当这些 Promise 都 resolve 时&…

在线教育机构如何借助小程序技术创新

随着人工智能AI技术的发展,我们的生活学习工作方式都在经历变化。在线教育也处于这场变化的核心之中,同样借助这股东风引来了行业的一波红利期。 在正式分享在线教育行业的开始,我们先简单搞清楚什么是在线教育。 在线教育行业是指通过互联…

C语言--根据成绩判断等级

一.题目描述 如果学生的成绩小于60分&#xff0c;那么输出不及格 如果学生的成绩大于60分小于85分&#xff0c;那么输出良好 如果学生的成绩大于85分&#xff0c;那么输出优秀 二.代码实现 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> //根据成绩打印等级 //scor…

Vue CLI 初体验之如何创建一个项目并打开,以及组件的简单使用案例。

目录 什么是Vue CLI? 如何使用Vue CLI 创建一个项目 1.winr 打开cmd 输入vue create 1127(1127是文件名) 2.配置基础设置 选择Manually select features 选择Router和Vuex 选中vue版本&#xff08;我这里选vue3&#xff09; 剩下的看自己需要&#xff0c;如果不确定就一…