实现简单的图像运算 - sumpig/OpenCV GitHub Wiki
OpenCV 提供了很多图像算法运算符,本节将讨论它们的用法。
我们使用算法运算符,将两幅图像进行组合。
我们可以使用 cv::add 函数来实现相加功能,但因为这次是想得到加权和,因此使用更精确的 cv::addWeighted 函数:
cv::addWeighted(image1, 0.7, image2, 0.9, 0., result);
cv::add 是典型的具有多种格式的函数:
// c[i]= a[i]+b[i];
cv::add(imageA,imageB,resultC);
// c[i]= a[i]+k;
cv::add(imageA,cv::Scalar(k),resultC);
// c[i]= k1*a[i]+k2*b[i]+k3;
cv::addWeighted(imageA,k1,imageB,k2,k3,resultC);
// c[i]= k*a[i]+b[i];
cv::scaleAdd(imageA,k,imageB,resultC);
// 如果(mask[i]) c[i]= a[i]+b[i];
cv::add(imageA,imageB,resultC,mask);
使用掩码后,操作就只会在掩码值非空的像素上执行(掩码必须是单通道的)。
- cv::subtract
- cv::absdiff
- cv::multiply
- cv::divide
此外还有位运算符(对像素的二进制数值进行按位运算)
- cv::bitwise_and
- cv::bitwise_or
- cv::bitwise_xor
- cv::bitwise_not
cv::min 和 cv::max 运算符也非常实用,它们能找到每个元素中最大或最小的像素值。
在所有场合都要使用 cv::saturate_cast 函数。
还有运算符使用单个输入图像
- cv::sqrt
- cv::pow
- cv::abs
- cv::cuberoot
- cv::exp
- cv::log
调用 cv::addWeighted 的语句也可以写成:
result = 0.7*image1 + 0.9*image2;
这两种方法都会调用 cv::saturate_cast 函数。
大部分C++运算符都已被重载,其中包括位运算符
- &
- |
- ^
- ~
- min
- max
- abs
- <
- <=
- ==
- !=
- >
- >=
我们有时需要分别处理图像中的不同通道,可以使用 cv::split 函数
假设我们要把一张雨景图只加到蓝色通道中,可以这样实现:
// 创建三幅图像的向量
std::vector<cv::Mat> planes;
// 将一个三通道图像分割为三个单通道图像
cv::split(image1, planes);
// 加到蓝色通道上
planes[0] += image2;
// 将三个单通道图像合并为一个三通道图像
cv::merge(planes, result);