OpenCv图像处理之颜色通道分离与多通道融合、图像线性融合
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图像处理之颜色通道分离与多通道融合、图像线性融合相关推荐
- OpenCV系列四 --- 颜色通道分离与多通道图像混合
今天呢,我们一起来学习彩色图像的颜色通道分离与多通道图像混合,一般情况下,我们大多数看到的图像都是基于RGB颜色通道的图像,因此要实现颜色通道的分离,即要将R.G.B三个通道分离,而多通道图像混合,即 ...
- 基于openCV3的颜色通道分离及多通道图像混合
注:文档摘至<OpenCV3编程入门>毛星云版 <1>通道分离: split()函数 split函数用于将一个多通道数组分离成几个单通道数组.这里的array 按语境翻译为数组 ...
- Opencv图像基本操作——读取、显示、截取图像、属性、颜色通道、边界填充、图像融合
引言 我们都会有一个疑惑:计算机眼中的图像长什么样子呢? 首先拿来一张图片分割成无数个小格,每一个小格叫做像素点,计算机中的图像是由像素点构成的像素矩阵,像素点构成它的每一个值都是在0-255之间浮动 ...
- OpenCV图像处理(14)——文件夹下所有图像转灰度
前言 一个项目中,给三维模型的贴图是彩色的,但是要实现红外的纹理贴图,首先第一步是将彩色的转换成灰度,但是对于FBX格式文件,是如何从文件夹下读取不同部件的贴图,已经贴图的不同LOD级别,还没有搞清楚 ...
- OpenCV图像处理(1)——指定文件夹写入图像
文件夹写入图像 imwrite("./111/maoqiubiaozhu_" + std::to_string(i) + ".bmp", src);//在项目目 ...
- pythpn实现bgr颜色通道分离,并分别显示一副彩色图片的BGR通道图片
分别显示一副彩色图片的B,G,R通道图片 要实现这个功能,原理很简单. 一张彩图有三个颜色通道,显示哪个就将另外两个通道置0 代码 import cv2 as cv img = cv.imread(' ...
- OpenCV图像处理(18)——文件夹下所有图像转灰度(14-15综合)
对文件夹下所有图像做灰度转换,并做garma校正,产生不同的灰度亮度范围,方案用(13-14) #pragma once #include<stdio.h> #include<ope ...
- OpenCV开发笔记(十):OpenCV图像颜色通道分离和图像颜色多通道混合
若该文为原创文章,未经允许不得转载 本文章博客地址:https://blog.csdn.net/qq21497936/article/details/101420314 各位读者,知识无穷而人力有穷, ...
- Python+OpenCV 图像处理系列(8)—— Numpy 对象及图像对象创建与赋值
1. Numpy 相关知识 1.1 Ndarray 对象 在了解 OpenCV 的图像对象之前我们先对 NumPy 的基础知识做一回顾,方便我们后续更进一步理解图像对象的一系列操作. In [2]: ...
- OpenCV--颜色通道分离和合并
OpenCV–颜色通道分离和合并 颜色通道分离: 语法: mv = cv.split( img[, mv] ) img:输入的多通道的图像数组: mv:数组的输出向量:如果需要,数组本身被重新分配(B ...
最新文章
- 保障数据安全,强调科技向善,旷视发布《人工智能应用准则》
- linux集群-keepalived介绍-用keepalived配置高可用集群
- gzencode php demo,8个必备的PHP功能实例代码
- 禁止用户复制网页的内容
- python打开另一个程序_python 新手问题啊,为什么我运行一个python程序,另一个就会自动退出呢?始终只能运行一个...
- 转json_Java对象转JSON时如何动态的增删改查属性
- python将dataframe导出为csv_python将dataframe转换为csv,为每列导出一个格式独特的文本文件...
- 无限踩坑系列(5)-MySQLdb
- python asyncio_如何使用Python中的asyncio?
- C# Hashtable的序列化
- update.php,update php version to 5.6
- 测试经验谈:测试人怎么从 0—1 进化
- DevEco Studio 使用和问题总结
- 上下文路径request.getContextPath();与${pageContext.request.contextPath}
- mysql57介绍_MySQL5.7 JSON类型使用介绍
- IDEA利用wsdl文件生成WebService调用接口的方法
- 用matlab机器人工具箱对SCARA机器人建模
- 学习java哪个网课最好_学习Java的最佳方法
- 六、python实现日语单词索引:查询单词对应的课
- C++的O2、O3到底是个什么鬼
热门文章
- [Steam]成就游戏销量乐观
- http://www.xun6.net/file/931caf122/f721.rar.html
- sql查看mysql表结构_MySQL 查看表结构简单命令
- 基于华三交换机,限制其他网段的IP访问
- linux系统中怎么配置路由,Linux系统中路由配置介绍
- 货币市场基金基础知识
- 嵌入式系统架构设计师的理解
- java微信学生考勤小程序前台vue和后台(考勤,请假,校园新闻,导出,地图等)(需要使用的软件)打包源码及安装视频+功能文档
- 多媒体视频开发_(3) ffmpeg获取视频的总帧数
- 真探第一季/全集True Detective1迅雷下载