OpenCV入门教程03.10:图像通道合并与分离
索引地址:系列索引
在OpenCV入门教程02.05:常用类中简单介绍了通道的概念。有时为了更好的观察一些图像材料的特征,需要对RGB三个颜色的分量进行分别的显示和调整,通过OpenCV的split和merge方法可以很方便的达到目的。
分离通道
split()函数:用于将一个多通道数组分离成几个单通道数组,这里的array按语境翻译为数组或阵列。
函数原型:
1 |
|
- 第一个参数:src或者m填我们需要进行分离的多通道数组;
- 第二个参数:mv填 输出数组 或者 输出的vector容器。
测试代码:
1 |
|
测试结果:
合并通道
merge()函数:split()函数的逆向操作——将多个数组合并成一个多通道数组,将给定的这些孤立的单通道数组合并成一个多通道数组,从而创建一个由多个单通道阵列组成的多通道阵列。
函数原型:
1 |
|
- 第一个参数:mv,填需要被合并的输入矩阵 或 vector容器的阵列;
- 第二个参数:count,当mv为一空白C数组时,代表输入矩阵的个数,显然必须大于1;
- 第三个参数:dst,即输出矩阵,和mv[0]具有相同的尺寸和深度,并且通道的数量是矩阵阵列中通道的总数。
测试代码:
1 |
|
测试结果:
最后结果是合并三个通道的结果,可以测试只合并一两个通道的结果。
通道混合
在图像处理中,目标区域定义为感兴趣区域ROI(region of Interest),这是后期图像处理的基础,在获取ROI后,进行一些列的处理。ROI区域在Opencv中就是Rect,先构建Rect,然后给予ROI一些特点,形成了图像掩膜。
1 |
|
代码中定义了一个Mat类型,是一种类似指针的引用,然后指向Image(Mat)中制定区域,这样就创建了一个ROI区域,这个区域在Image中。
图像掩膜,在ROI区域中导入一张图像,然后在image中进行加载
1 |
|
线性混合就是,对两幅图像(f0(x)和f1(x))或两段视频(同样为(f0(x)和f1(x))产生时间上的画面叠化(cross-dissolve)效果,就像幻灯片放映和电影制作中的那样。公式为:
混合函数原型为:
1 |
|
- 第一个参数,InputArray类型的src1,表示需要加权的第一个数组,常常填一个Mat。
- 第二个参数,alpha,表示第一个数组的权重
- 第三个参数,src2,表示第二个数组,它需要和第一个数组拥有相同的尺寸和通道数。
- 第四个参数,beta,表示第二个数组的权重值。
- 第五个参数,dst,输出的数组,它和输入的两个数组拥有相同的尺寸和通道数。
- 第六个参数,gamma,一个加到权重总和上的标量值。看下面的式子自然会理解。
- 第七个参数,dtype,输出阵列的可选深度,有默认值-1。;当两个输入数组具有相同的深度时,个参数设置为-1(默认值),即等同于src1.depth()。dst = src1
addWeighted函数计算如下两个数组(src1和src2)的加权和,得到结果输出给第四个参数。即addWeighted函数的作用可以被表示为为如下的矩阵表达式为:
;
测试代码为:
1 |
|
测试结果:
图片直接覆盖在另一张图片上:
线性混合效果:
roi和线性混合 的混合效果:
多通道混合
彩色图像是三通道图像,当然灰度图像是单通道图像,在图像应用中需要对某一通道混合,或者几个通道颜色混合,这就是多通道颜色混合。
测试代码:
1 |
|
测试效果: