OpenCV的图像的基本运算

OpenCV的图像的基本运算

参考自:http://blog.csdn.net/liyuanbhu/article/details/48916349

图像的基本运算有很多种,比如两幅图像可以相加、相减、甚至可以相乘、相除。图像可以放大、缩小、旋转,还可以截取中间的一副子图,各个颜色通道还可以分别提取。本文只是对一些简单的图像基本运算做一个小总结:

图像间的加减乘除:

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);

利用子区域合并图像:

在上图的例子中添加一个logo的例子:

cv::Mat imageROI;
imageROI= image(cv::Rect(385,270,logo.cols, logo.rows));
// add logo to image
cv::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>&


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值