5. 图像混合(OpenCV基础课程视频学习)

课程视频链接: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)
{
    ······
}
发布了73 篇原创文章 · 获赞 14 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/wangyuankl123/article/details/104758830