持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第11天,点击查看活动详情
前言
图像可以以不同的方式组合。因为它们是正则矩阵,所以它们可以可以执行加、减、乘或除等运算。OpenCV 提供了各种图像算术运算符,本节将学习如何使用不同的图像运算符。我们会加载二张图像,并使用算术运算符这两张图像结合起来。
执行图像运算
在本节中,我们对两个图像执行加法运算,这在要创建一些特殊效果或在图像上叠加信息时非常有用。
调用 cv::add 函数,或者更准确地说,调用 cv::addWeighted 函数,因为我们可以使用以下方法求取图像的加权和:
cv::addWeighted(image1,0.7,image2,0.9,0.,result);
该操作会生成一个新图像,如下图所示:
所有 OpenCV 算术运算函数的工作方式都相同。提供了两个输入,第三个参数指定了输出。在某些情况下,可以指定在操作中用作标量乘数的权重,可以使用多种形式调用这些函数,例如,使用 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[1]+k2*b[i]+k3;
cv::addWeighted(imageA,k1,imageB,k2,k3,resultC);
// c[i]= k*a[1]+b[i];
cv::scaleAdd(imageA,k,imageB,resultC);
对于某些函数,我们还可以指定掩码进行调用:
// (mask[i]) c[i]= a[i]+b[i];
cv::add(imageA,imageB,resultC,mask);
如果应用掩码,则仅对掩码值不为空的像素执行操作(掩码必须是单通道),除了 cv::add 函数外,还可以调用 cv::subtract、cv::absdiff、cv::multiply 和 cv::divide 函数观察不同 OpenCV 运算效果,除此之外,还可以使用位运算符(应用于像素二进制表示的每个单独位的运算符):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::Mat 实例或 cv::Mat 实例的各个通道上使用常用的 C++ 算术运算符。