课程视频链接: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)
{
······
}