opencv学习笔记(六)图像混合

博客介绍了图像线性混合的概念,即新像素值由两个常数系数分别乘以两个图像像素值相加得到。还介绍了相关API addWeighted()及其参数,强调两张输入图像大小和类型须一致,最后给出了代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.线性混合概念

全新的像素值为一个常数系数(0~1)乘以第一个图像的像素值,加上另一个常数系数(与第一个常数相加为1)乘以第二个图像像素值。

2.相关API介绍

addWeighted():

参数1:输入图像Mat – src1

参数2:输入图像src1alpha

参数3:输入图像Mat – src2

参数4:输入图像src2alpha

参数5gamma

参数6:输出混合图像

注意点:两张图像的大小和类型必须一致才可以

3.代码实现

#include "stdafx.h"
#include <opencv2/opencv.hpp>
#include <iostream>
#include <math.h>
using namespace std;
using namespace cv;

Mat src1, src2,dst,dest, src1F, src2F;
double a = 0.5;
int main()
{
	src1 = imread("D:/VS project/Image/Windows.jpg");
	src2 = imread("D:/VS project/Image/Linux.jpg");
	dst.create(src1.size(), src1.type());
	if (src1.empty()) {
		cout << "文件打开失败" << endl;
		return -1;
	}
	if (src2.empty()) {
		cout << "文件打开失败" << endl;
		return -1;
	}
	if (src1.rows == src2.rows&&src1.cols == src2.cols&&src1.type() == src2.type())
	{
		addWeighted(src1,a,src2,(1.0-a),0.0,dst);
		imshow("API实现合成图", dst);
	}
	else
	{
		cout << "图像大小不一致!" << endl;
	}
	

	//个人实现图像混合
	dest.create(src1.size(), src1.type());
	src1.convertTo(src1F, CV_32F);
	src2.convertTo(src2F, CV_32F);
	int height = src1.rows;
	int width = src1.cols;
	for (int row = 0; row < height; row++)
	{
		for (int col = 0; col < width; col++)
		{
			Vec3f intensity1 = src1F.at<Vec3f>(row, col);
			Vec3f intensity2 = src2F.at<Vec3f>(row, col);
			float blue1 = intensity1.val[0];//B通道
			float green1 = intensity1.val[1];//G通道
			float red1 = intensity1.val[2];//R通道
			float blue2 = intensity2.val[0];//B通道
			float green2 = intensity2.val[1];//G通道
			float red2 = intensity2.val[2];//R通道
			dest.at<Vec3b>(row, col)[0] = a*blue1 + (1 - a)*blue2;
			dest.at<Vec3b>(row, col)[1] = a*green1 + (1 - a)*green2;
			dest.at<Vec3b>(row, col)[2] = a*red1 + (1 - a)*red2;
		}
	}
	namedWindow("个人合成图", CV_WINDOW_AUTOSIZE);
	imshow("个人合成图", dest);
	waitKey(0);
	return 0;
}

结果:

### OpenCV C++ 学习教程概述 OpenCV 是一个强大的开源计算机视觉库,支持多种编程语言,其中 C++ 是其主要开发语言之一。以下是关于如何通过 OpenCV 的 C++ 功能进行学习的相关资源和知识点。 #### 图像基本操作 图像的基本读取、显示以及保存功能是 OpenCV 中最基础的部分。可以通过 `imread` 函数加载图片,并利用 `imshow` 和 `imwrite` 来展示和存储处理后的结果[^1]。 ```cpp #include <opencv2/opencv.hpp> using namespace cv; int main() { Mat image = imread("example.jpg"); if (image.empty()) return -1; namedWindow("Example", WINDOW_AUTOSIZE); imshow("Example", image); waitKey(0); // Wait for key press imwrite("output_image.png", image); } ``` #### 图像融合技术 为了实现两幅图像的平滑过渡或者叠加效果,可以使用 `addWeighted()` 方法完成加权平均混合的操作[^2]。此方法接受两个输入矩阵及其权重参数 α 和 β,还有一个偏移量 γ。 ```cpp Mat blendedImage; double alpha = 0.7; double beta = 0.3; double gamma = 0.0; addWeighted(src1, alpha, src2, beta, gamma, blendedImage); ``` #### 腐蚀与膨胀操作 形态学中的腐蚀(Erosion)和膨胀(Dilation)用于改变二值化图像中对象形状大小。这些变换通常依赖于结构元素(Kernel)。创建自定义核可通过调用 `getStructuringElement` 完成[^3]。 ```cpp Mat kernel = getStructuringElement(MORPH_ELLIPSE, Size(5, 5)); erode(image, erodedImage, kernel); dilate(erodedImage, dilatedImage, kernel); ``` #### 形态学高级应用——顶帽黑帽运算 除了简单的腐蚀膨胀外,还有更复杂的形态学转换如顶帽(Tophat)和黑帽(Blackhat),分别提取亮区域细节或暗区域特征[^4]。具体表达式如下所示: - **TopHat**: \(dst = src - open(src)\) - **BlackHat**: \(dst = close(src) - src\) ```cpp morphologyEx(image, topHatResult, MORPH_TOPHAT, kernel); morphologyEx(image, blackHatResult, MORPH_BLACKHAT, kernel); ``` 以上内容涵盖了从入门到深入理解 OpenCV 库所需掌握的核心概念和技术要点。希望对你有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值