OpenCv图像处理之颜色通道分离与多通道融合、图像线性融合

  • 颜色通道分离
  • 多通道融合
  • 图像线性融合

颜色通道分离

在图像中不同的分量存放在不同的通道中,有时为了减少数据占用的内存,提高程序的运行效率,满足特定的需求,需要将颜色通道中的某一个分量分离出来,例如分离RGB中的GREEN通道。在opencv中提供了split()用来分离通道得到单通道语义信息。

split()源码中的函数原型

CV_EXPORTS void split(const Mat &src, Mat *mvbegin);

split()源码中重点的函数描述

The function cv::split splits a multi-channel array into separate single-channel arrays:
\f[\texttt{mv} [c](I) =  \texttt{src} (I)_c\f] .@param src input multi-channel array.
@param mvbegin output array; the number of arrays must match src.channels(); the arrays themselves are
reallocated, if needed.

上述描述大概意思是该函数对多通道数组分离为单通道数组。并且分离出来的单通道数组mvbegin个数必须要和输入图片的多通道的通道数src.channerls()相匹配。
下面我们来看一个示例

#include <iostream>
#include <opencv2/opencv.hpp>
#include <vector>using namespace std;
using namespace cv;//定义单通道图片存储的动态数组
vector<cv::Mat> list_mat_img;int main() {Mat img, clone_img;img = imread("D:/cat.jpg", 3);clone_img = img.clone();double scale = 0.5;//尺度缩小为原来的50%resize(clone_img, clone_img, Size(int(img.cols * scale), int(img.rows * scale)), 0, 0, INTER_AREA);//分割通道split(clone_img, list_mat_img);//vector.at(index)查找数组下标为index的数据for (int i = 0; i < list_mat_img.size(); ++i) {//to_string(object) int强转为stringimshow("single_channel_frame_" + to_string(i), list_mat_img.at(i));waitKey(0);}return 0;
}

效果显示


多通道融合

有时,当我们分别处理完多个通道后,需要将所有通道合并在一起重新生成RGB或其他颜色空间图像时,就需要opencv中提供的merge()进行通道融合。

merge()源码中的函数原型

CV_EXPORTS_W void merge(InputArrayOfArrays mv, OutputArray dst);

merge()源码中的函数描述

@param mv input vector of matrices to be merged; all the matrices in mv must have the same
size and the same depth.
@param dst output array of the same size and the same depth as mv[0]; The number of channels will
be the total number of channels in the matrix array.

上述描述大概意思是输入矩阵中的向量用于融合,并且它们都要有相同大小的尺度和深度。而输出数组要与输入向量的尺度和深度相同。它的通道数要和输入矩阵中所有向量通道数的和相同。

下面看一个颜色通道为HSV分离融合的示例

#include <iostream>
#include <opencv2/opencv.hpp>
#include <vector>using namespace std;
using namespace cv;vector<cv::Mat> list_convert_hsv;int main() {Mat img, clone_img, merge_img, convert_hsv_img;img = imread("D:/cat.jpg", 3);clone_img = img.clone();cvtColor(clone_img, convert_hsv_img, COLOR_BGR2HSV);double scale = 0.5;resize(convert_hsv_img, convert_hsv_img, Size(int(img.cols * scale), int(img.rows * scale)), 0, 0, INTER_AREA);split(convert_hsv_img, list_convert_hsv);cv::merge(list_convert_hsv, merge_img);imshow("merge_img", merge_img);waitKey(0);return 0;
}

效果图

图像线性融合

addWeight()源码中的线性融合公式

dst = src1*alpha + src2*beta + gamma;//dst是融合之后图像

addWeight()源码中的函数原型

CV_EXPORTS_W void addWeighted(InputArray src1, double alpha, InputArray src2,double beta, double gamma, OutputArray dst, int dtype = -1);

addWeight()源码中主要描述

@param src1 first input array.
@param alpha weight of the first array elements.
@param src2 second input array of the same size and channel number as src1.
@param beta weight of the second array elements.
@param gamma scalar added to each sum.
@param dst output array that has the same size and number of channels as the input arrays.
@param dtype optional depth of the output array; when both input arrays have the same depth, dtype
can be set to -1, which will be equivalent to src1.depth().

上述描述大概意思是对各个参数的描述,src1是待融合的图像1,alpha是图像1的融合所占权值(小于1时,亮度暗,大于1时候亮度亮),src2是待融合的图像2,beta是图像2的融合所占的权值,dst融合之后的图像,图像尺寸和深度和src1相同,dtype可选参数,若与src1尺寸和深度相同时,则设置为-1,否则要设置为src1.depth()
下面来看一个示例

#include <iostream>
#include <opencv2/opencv.hpp>using namespace std;
using namespace cv;void resize_img(Mat &mat, int width, int height, int interpolation);int main() {Mat img1, img2;Mat img1_clone, img2_clone;img1 = imread("D:/cat.jpg", 3);img2 = imread("D:/food.jpg", 3);img1_clone = img1.clone();img2_clone = img2.clone();double scale = 0.5;int weight = int(img1.cols * scale);int height = int(img1.rows * scale);int interpolation = INTER_AREA;Mat merge_img(height, weight, CV_8UC3);resize(img2_clone, weight, height, interpolation);resize(img1_clone, weight, height, interpolation);imshow("img1", img1_clone);waitKey(0);imshow("img2", img2_clone);waitKey(0);addWeighted(img1_clone, 0.8, img2_clone, 0.2, 0, merge_img, -1);imshow("merge_img", merge_img);waitKey(0);return 0;
}void resize_img(Mat &mat, int width, int height, int interpolation) {resize(mat, mat, Size(width, height), 0, 0, interpolation);
}

效果显示


OpenCv图像处理之颜色通道分离与多通道融合、图像线性融合相关推荐

  1. OpenCV系列四 --- 颜色通道分离与多通道图像混合

    今天呢,我们一起来学习彩色图像的颜色通道分离与多通道图像混合,一般情况下,我们大多数看到的图像都是基于RGB颜色通道的图像,因此要实现颜色通道的分离,即要将R.G.B三个通道分离,而多通道图像混合,即 ...

  2. 基于openCV3的颜色通道分离及多通道图像混合

    注:文档摘至<OpenCV3编程入门>毛星云版 <1>通道分离: split()函数 split函数用于将一个多通道数组分离成几个单通道数组.这里的array 按语境翻译为数组 ...

  3. Opencv图像基本操作——读取、显示、截取图像、属性、颜色通道、边界填充、图像融合

    引言 我们都会有一个疑惑:计算机眼中的图像长什么样子呢? 首先拿来一张图片分割成无数个小格,每一个小格叫做像素点,计算机中的图像是由像素点构成的像素矩阵,像素点构成它的每一个值都是在0-255之间浮动 ...

  4. OpenCV图像处理(14)——文件夹下所有图像转灰度

    前言 一个项目中,给三维模型的贴图是彩色的,但是要实现红外的纹理贴图,首先第一步是将彩色的转换成灰度,但是对于FBX格式文件,是如何从文件夹下读取不同部件的贴图,已经贴图的不同LOD级别,还没有搞清楚 ...

  5. OpenCV图像处理(1)——指定文件夹写入图像

    文件夹写入图像 imwrite("./111/maoqiubiaozhu_" + std::to_string(i) + ".bmp", src);//在项目目 ...

  6. pythpn实现bgr颜色通道分离,并分别显示一副彩色图片的BGR通道图片

    分别显示一副彩色图片的B,G,R通道图片 要实现这个功能,原理很简单. 一张彩图有三个颜色通道,显示哪个就将另外两个通道置0 代码 import cv2 as cv img = cv.imread(' ...

  7. OpenCV图像处理(18)——文件夹下所有图像转灰度(14-15综合)

    对文件夹下所有图像做灰度转换,并做garma校正,产生不同的灰度亮度范围,方案用(13-14) #pragma once #include<stdio.h> #include<ope ...

  8. OpenCV开发笔记(十):OpenCV图像颜色通道分离和图像颜色多通道混合

    若该文为原创文章,未经允许不得转载 本文章博客地址:https://blog.csdn.net/qq21497936/article/details/101420314 各位读者,知识无穷而人力有穷, ...

  9. Python+OpenCV 图像处理系列(8)—— Numpy 对象及图像对象创建与赋值

    1. Numpy 相关知识 1.1 Ndarray 对象 在了解 OpenCV 的图像对象之前我们先对 NumPy 的基础知识做一回顾,方便我们后续更进一步理解图像对象的一系列操作. In [2]: ...

  10. OpenCV--颜色通道分离和合并

    OpenCV–颜色通道分离和合并 颜色通道分离: 语法: mv = cv.split( img[, mv] ) img:输入的多通道的图像数组: mv:数组的输出向量:如果需要,数组本身被重新分配(B ...

最新文章

  1. 保障数据安全,强调科技向善,旷视发布《人工智能应用准则》
  2. linux集群-keepalived介绍-用keepalived配置高可用集群
  3. gzencode php demo,8个必备的PHP功能实例代码
  4. 禁止用户复制网页的内容
  5. python打开另一个程序_python 新手问题啊,为什么我运行一个python程序,另一个就会自动退出呢?始终只能运行一个...
  6. 转json_Java对象转JSON时如何动态的增删改查属性
  7. python将dataframe导出为csv_python将dataframe转换为csv,为每列导出一个格式独特的文本文件...
  8. 无限踩坑系列(5)-MySQLdb
  9. python asyncio_如何使用Python中的asyncio?
  10. C# Hashtable的序列化
  11. update.php,update php version to 5.6
  12. 测试经验谈:测试人怎么从 0—1 进化
  13. DevEco Studio 使用和问题总结
  14. 上下文路径request.getContextPath();与${pageContext.request.contextPath}
  15. mysql57介绍_MySQL5.7 JSON类型使用介绍
  16. IDEA利用wsdl文件生成WebService调用接口的方法
  17. 用matlab机器人工具箱对SCARA机器人建模
  18. 学习java哪个网课最好_学习Java的最佳方法
  19. 六、python实现日语单词索引:查询单词对应的课
  20. C++的O2、O3到底是个什么鬼

热门文章

  1. [Steam]成就游戏销量乐观
  2. http://www.xun6.net/file/931caf122/f721.rar.html
  3. sql查看mysql表结构_MySQL 查看表结构简单命令
  4. 基于华三交换机,限制其他网段的IP访问
  5. linux系统中怎么配置路由,Linux系统中路由配置介绍
  6. 货币市场基金基础知识
  7. 嵌入式系统架构设计师的理解
  8. java微信学生考勤小程序前台vue和后台(考勤,请假,校园新闻,导出,地图等)(需要使用的软件)打包源码及安装视频+功能文档
  9. 多媒体视频开发_(3) ffmpeg获取视频的总帧数
  10. 真探第一季/全集True Detective1迅雷下载