opencv(三)對影象進行簡單算術運算(加減乘除)
opencv可以將影象以不同的方式組合,影象其實就是一般的矩陣,所以它們可以做加減乘除。opencv提供了各種影象算術操作符。
1【首先我們對兩幅影象進行操作】
當我們需要一些影象特效或者在影象上疊加資訊時,就需要用到影象加法。我們只需呼叫cv::add函式就可以完成,更準確的說是cv::addWeighted()函式來完成影象的加法。cv::addWeighted(image, 0.7, imag1, 0.9, 0.,result);
效果如下
所有的二值算術函式工作方式都是一樣的,他接受兩個輸入變數和一個輸出變數。在一些情況下,還需要指定權重作為運算中的標量因子。每種函式都有幾個不同的形式:
//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);
//對某些函式,還可以指定一個影象的掩模
//if(mast[i]) c[i] = a[i] + b[i]
cv::add(imageA,imageB, resultC, mask);
參與運算的影象必須相同的大小和型別(輸出影象如果合適不符,那麼他會被重新分配)同樣,由於運算是逐畫素進行的,輸入影象之一也可以作為輸出影象。
opencv給我們過載了操作符,上面的操作可以換成下面:reslut = 0.7 * image + 0.9 * image,效果是一樣的。有時候我們想對彩色影象的一個通道進行運算,我們可以使用cv::split函式將彩色影象的三個通道分別拷貝到三個獨立的cv::Mat例項中,然後對其中一個通道單獨處理:
std::vector(cv::Mat) planes;
cv::split(image, planes);
planes[0] += image1;
cv::merge(planes, result);
函式cv::merge是cv::splitr的對偶運算,它將三個單通道合併一個彩色通道。
其他操作基本都和加運算差不多,這裡就不一一介紹了。