課程視頻鏈接:https://www.bilibili.com/video/av29600072?p=6
內容
- 線性混合操作理論知識
- 相關 API (addWeighted)
- 完整代碼
1. 線性混合操作理論知識
g(x) = (1-α) * f_0(x) + α * f_1(x)
其中 f0(x) 表示一幅圖像,f1(x) 表示另一幅圖像, α 表示權重,取值範圍在 0~1 之間,所以最後得到的計算值不會超過 255,最後生成的另一幅圖像就是 g(x) 。x 對每個元素進行遍歷。
2. 相關 API
注意:兩張圖像的大小和類型必須一致纔可以。
2.1 addWeighted
將兩幅圖像的各個像素值先乘以權重然後相加。
void cv::addWeighted( inputArray src1, // 輸入圖像Mat src1
double alpha, // 輸入圖像 src1 的 alpha 值
inputArray src2, // 輸入圖像Mat src2
double beta, // 輸入圖像 src2 的 alpha 值
double gamma, // gamma 值,校驗值,如果前兩項相加值太小,像素太暗,就加一個校驗值
OutputArray dst, // 輸出混合圖像
int dtype = -1
)
計算公式
dst(I) = saturate(src1(I) * alpha + src2(I) * beta + gamma)
2.2 add
單純將兩幅圖像的各個像素值相加。
void cv::add( inputArray src1,
inputArray src2,
outputArray dst,
inputArray mask = noArray(),
int dtype = -1
)
2.3 multiply
單純將兩幅圖像的各個像素值相乘。
void cv::multiply( inputArray src1,
inputArray src2,
outputArray dst,
double scale = 1,
int dtype = -1
)
3. 完整代碼
#include <opencv.hpp>
#include <iostream>
int main(int argc, char** argv)
{
cv::Mat src1 = cv::imread(cv::samples::findFile("LBXX1.jpg"), cv::IMREAD_COLOR);
cv::Mat src2 = cv::imread(cv::samples::findFile("LBXX2.jpg"), cv::IMREAD_COLOR);
if (!src1.data)
{
std::cout << "No such a image" << std::endl;
return -1;
}
cv::namedWindow("src1", cv::WINDOW_AUTOSIZE);
cv::imshow("src1", src1);
cv::namedWindow("src2", cv::WINDOW_AUTOSIZE);
cv::imshow("src2", src2);
cv::Mat dst;
//std::cout << src1.type() << std::endl;
if (src1.rows == src2.rows && src1.cols == src2.cols && src1.type() == src2.type())
{
double alpha = 0.5;
cv::add(src1, src2, dst);
cv::multiply(src1, src2, dst);
cv::addWeighted(src1, alpha, src2, (1.0 - alpha), 0.0, dst);
cv::namedWindow("Blend demo", cv::WINDOW_AUTOSIZE);
cv::imshow("Blend demo", dst);
}
else
{
std::cout << "Images' size or type don't fit !" << std::endl;
return -1;
}
cv::waitKey(0);
return 0;
}
注意:在判斷兩幅原圖像大小是否一致時可以使用
if(src1.size() == src2.size())
示例結果
1. addWeighed α = 0.5
2. add
3. multiply
4. 附
讀入圖像後,判斷是否讀入成功:
cv::Mat src = cv::imread("***.jpg", cv::IMREAD_COLOR);
if(src.empty())
{
······
}
或者
cv::Mat src = cv::imread("***.jpg", cv::IMREAD_COLOR);
if(!src.data)
{
······
}