OpenCV(6): 图像线性混合


注:转载请标明原文出处链接:https://xiongyiming.blog.csdn.net/article/details/106938682


图像线性混合的理论表达式为:

dst(x)=f(src1(x)alpha+src1(x)beta)+gammadst(x) = f\left( {src1(x) \cdot alpha + src1(x) \cdot beta} \right) + gamma


OpenCV中线性混合使用 addWeighted() 函数,其用法为:
addWeighted(src1, alpha, src2, beta, gamma, dst);

其中各个参数分别为:
参数src1:输入图像src1
参数alpha:输入图像src1的alpha值
参数src2:输入图像 src2
参数beta:输入图像src2的beta值
参数gamma:gamma值
参数dst:输出混合图像


注:两张图像的大小和类型必须一致才可以进行混合操作。



代码示例

#include <opencv2/core/core.hpp> 
#include <opencv2/imgcodecs.hpp> 
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/highgui/highgui_c.h>

#include <iostream>
#include <math.h>




using namespace cv;
using namespace std;
int main(int argc, char** args) {
	Mat src = imread("ZXP1.jpg", IMREAD_UNCHANGED);
	if (src.empty()) {
		cout << "could not find the image resource..." << std::endl;
		return -1;
	}
	namedWindow("Original Image", CV_WINDOW_AUTOSIZE);
	imshow("Original Image", src);


	
	Mat dst;
	dst.create(src.size(), src.type());//或者用dst = Mat(src.size(), src.type());
	int height = src.rows;
	int width = src.cols;
	
	for (int row = 0; row < height; row++)
	{
		for (int col = 0; col < width; col++)
		{

				int b = src.at<Vec3b>(row, col)[0];
				int g = src.at<Vec3b>(row, col)[1];
				int r = src.at<Vec3b>(row, col)[2];

				dst.at<Vec3b>(row, col)[0] = b - 50;
				dst.at<Vec3b>(row, col)[1] = g ;
				dst.at<Vec3b>(row, col)[2] = r + 50;
		
		}
	}
	

	namedWindow("Output Image_1", CV_WINDOW_AUTOSIZE);
	imshow("Output Image_1", dst);
	
	Mat dst_mixed;
	double alpha = 0.5;
	if (src.rows == dst.rows && src.cols == dst.cols && src.type() == dst.type())
	{
		addWeighted(src, alpha, dst, (1.0 - alpha), 0.0, dst_mixed); //图像混合
		namedWindow("Output Image_2", CV_WINDOW_AUTOSIZE);
		imshow("Output Image_2", dst_mixed);

	}

	else
	{
		cout << "图像尺寸不一致" << endl;
		return -1;
	}


	waitKey(0);

	return 0;
}

运行结果

在这里插入图片描述






参考资料

[1] https://edu.51cto.com/course/7521.html?source=so



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章