OpenCV杂项图像变换(2)线性混合函数blendLinear()的使用
- 操作系统:ubuntu22.04
- OpenCV版本:OpenCV4.9
- IDE:Visual Studio Code
- 编程语言:C++11
算法描述
执行两个图像的线性混合:
dst
(
i
,
j
)
=
weights1
(
i
,
j
)
∗
src1
(
i
,
j
)
+
weights2
(
i
,
j
)
∗
src2
(
i
,
j
)
\texttt{dst}(i,j) = \texttt{weights1}(i,j)*\texttt{src1}(i,j) + \texttt{weights2}(i,j)*\texttt{src2}(i,j)
dst(i,j)=weights1(i,j)∗src1(i,j)+weights2(i,j)∗src2(i,j)
blendLinear 函数是 OpenCV 中用于实现线性混合的一种方法。这个函数可以将多个图像按照指定的权重进行混合,生成一个新的图像。这对于图像融合或者创建过渡效果非常有用。
函数原型
void cv::blendLinear
(
InputArray src1,
InputArray src2,
InputArray weights1,
InputArray weights2,
OutputArray dst
)
参数
- 参数src1 它的类型为 CV_8UC(n) 或 CV_32FC(n),其中 n 是一个正整数。
- 参数src2 它具有与 src1 相同的类型和大小。
- 参数weights1 它的类型为 CV_32FC1 并且与 src1 具有相同的大小。
- 参数weights2 它的类型为 CV_32FC1 并且与 src1 具有相同的大小。
- 参数dst 如果它没有与 src1 相同的大小和类型,则会创建它。
代码示例
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
using namespace cv;
int main(int argc, char** argv)
{
// 读取图像
Mat image1 = imread("/media/dingxin/data/study/OpenCV/sources/images/top.jpg");
Mat image2 = imread("/media/dingxin/data/study/OpenCV/sources/images/bottom.jpg");
if (image1.empty() || image2.empty()) {
std::cerr << "Error: Could not open or find the images." << std::endl;
return -1;
}
// 确保两个图像的大小一致
if (image1.size() != image2.size()) {
std::cerr << "Error: Images must have the same size." << std::endl;
return -1;
}
cv::resize(image2, image2, image1.size());
// 创建权重图像
Mat weights1(image1.size(), CV_32FC1, Scalar(0.5));
Mat weights2(image1.size(), CV_32FC1, Scalar(0.5));
std::cout<<image1.size()<<" "<<image2.size()<<weights1.size()<<weights2.size()<<std::endl;
// 创建输出图像
// 创建输出图像
Mat blendedImage;
// 应用线性混合
blendLinear(image1, image2, weights1, weights2, blendedImage);
// 显示结果
namedWindow("Image 1", WINDOW_NORMAL);
imshow("Image 1", image1);
namedWindow("Image 2", WINDOW_NORMAL);
imshow("Image 2", image2);
namedWindow("Blended Image", WINDOW_NORMAL);
imshow("Blended Image", blendedImage);
waitKey(0);
return 0;
}