OpenCV 学习(图像的基本运算)
来源:互联网 发布:阿里云数据盘克隆 编辑:程序博客网 时间:2024/05/01 21:10
OpenCV 学习(图像的基本运算)
图像的基本运算有很多种,比如两幅图像可以相加、相减、甚至可以相乘、相除。图像可以放大、缩小、旋转,还可以截取中间的一副子图,各个颜色通道还可以分别提取。总之,对于图像可以进行的基本运算非常的多,这里不可能全部都写出来,只是挑了些特别常用的简单的写写。
图像间的加减乘除
OpenCV 中提供了如下的一些函数,用来进行图像的加减乘除。
void add(InputArray src1, InputArray src2, OutputArray dst, InputArray mask=noArray(), int dtype=-1);void subtract(InputArray src1, InputArray src2, OutputArray dst, InputArray mask=noArray(), int dtype=-1);void multiply(InputArray src1, InputArray src2, OutputArray dst, double scale=1, int dtype=-1);void divide(InputArray src1, InputArray src2, OutputArray dst, double scale=1, int dtype=-1);void divide(double scale, InputArray src2, OutputArray dst, int dtype=-1);void scaleAdd(InputArray src1, double alpha, InputArray src2, OutputArray dst);void addWeighted(InputArray src1, double alpha, InputArray src2, double beta, double gamma, OutputArray dst, int dtype=-1);
这些函数都要求相加的两幅图像具有相同的尺寸,并且像素类型是相同的。
比如我们有两幅尺寸相同的图像,分别如下:
执行下面的操作后:
cv::addWeighted(image, 0.5, image2, 0.5, 0., result);
得到的输出图像如下:
实际上,上面的代码还可以写为:
result= 0.5 * image1 + 0.5 * image2;
与此类似的还有位运算函数:
void bitwise_and(InputArray src1, InputArray src2, OutputArray dst, InputArray mask=noArray());void bitwise_or(InputArray src1, InputArray src2, OutputArray dst, InputArray mask=noArray());void bitwise_xor(InputArray src1, InputArray src2, OutputArray dst, InputArray mask=noArray());void bitwise_not(InputArray src, OutputArray dst, InputArray mask=noArray());
用法很简单,就不多介绍了。
另外一个比较常用的运算是求两幅图像像素的差的绝对值。
void absdiff(InputArray src1, InputArray src2, OutputArray dst);
还有些函数是对单幅图像进行操作的,比如对每个像素的值取平方、平方根、对数等。
void sqrt(InputArray src, OutputArray dst);void pow(InputArray src, double power, OutputArray dst);void exp(InputArray src, OutputArray dst);void log(InputArray src, OutputArray dst);
这里给出的函数很有限。但是,基本上我们能想到的各种操作,OpenCV 的作者都替我们实现了,需要时可以现查。
上面的操作都假定两幅图像是相同大小的。当图像大小不同时,我们可以在较大的图像中挖取出一块小区域。
取图像中的子区域(ROI)
下面的代码在一副图像中加入个 logo。 logo 图像如下:
cv::Mat imageROI;imageROI= image(cv::Rect(385,270,logo.cols, logo.rows));// add logo to imagecv::addWeighted(imageROI, 1.0, logo, 0.3,0., imageROI);
如果我们的 ROI 由图像中的一些连续行或连续列组成。可以用下面的方式来定义:
cv::Mat imageROI= image.rowRange(start,end);cv::Mat imageROI= image.colRange(start,end) ;
分离图像的通道
有时,我们需要单独处理图像的某一个通道,这时可以可以用 split函数来分离图像的通道。
void split(const Mat& src, vector<Mat_<_Tp> >& mv);
这个函数将一副图像的各个通道,分离成多个矩阵。
std::vector<cv::Mat> planes;cv::split(image1, planes);
对某个通道处理完成后,可以用 merge 函数组合回彩色图像。
void merge(const vector<Mat>& mv, OutputArray dst );
5 0
- OpenCV 学习(图像的基本运算)
- 【OpenCV学习笔记】十一、基本图像运算
- opencv基本图像运算
- 【opencv学习之二十】图像基本运算
- OpenCV 学习笔记 ----图像的基本操作(二)
- openCV Python 学习笔记(一)图像的基本操作
- opencv pyhon学习笔记(四)基本的图像操作
- OpenCV学习笔记:基本的图像处理
- 图像的基本运算
- 图像的基本运算
- 图像的基本运算
- opencv入门学习第一章,对图像基本的操作(图像腐蚀、图像模糊、canny图像边缘检测)
- 【OpenCV学习笔记 008】基于形态学运算的图像变换
- opencv学习(七)之图像卷积运算函数filter2D()
- 【OpenCV学习笔记】1.2图像的基本操作
- Opencv学习笔记(三)--图像处理的基本操作
- opencv 学习笔记--图像的基本操作(一)
- Opencv学习笔记--图像处理的基本操作
- [leetcode] Insert sort list
- 一个并发程序开多少线程合适?
- [Python进阶-4]类的继承/多态/多重继承/任意多参数
- 浅谈android的selector,背景选择器
- jdbc数据库连接
- OpenCV 学习(图像的基本运算)
- POJ3573(模拟)
- java学习笔记]java语言基础概述之内存的划分&堆和栈
- POJ3259 Wormholes SPFA 或者 bellman_ford
- 多线程编程的基础知识
- 《C++primer(第五版)》学习之路-第十九章:特殊工具与技术
- poj2823 Sliding Window (优先队列)
- iOS 分享功能开发
- 灰度共生矩阵