当前位置: 首页 > news >正文

c++视觉图像线性混合

图像线性混合

使用 cv::addWeighted() 函数对两幅图像进行线性混合。alpha 和 beta 是两幅图像的权重,它们之和应该等于1。gamma 是一个可选的增益,这里设置为0。

你可以通过调整 alpha 的值来改变混合比例。如果 alpha=0.5,则两幅图像等权重混合,如果 alpha=0.7,则第一幅图像的权重更大。

图像线性混合(Image Blending)通常是通过权重对两幅图像进行加权相加的操作,产生一幅新的图像。这是一个简单的线性混合的示例:

#include <opencv2/opencv.hpp>int main() {// 读取两幅图像cv::Mat image1 = cv::imread("11.png");cv::Mat image2 = cv::imread("22.png");// 检查图像是否成功加载if (image1.empty() || image2.empty()) {std::cerr << "Error: Could not read the image(s)." << std::endl;return -1;}// 确保两幅图像大小相同if (image1.size() != image2.size()) {std::cerr << "Error: Image sizes do not match." << std::endl;return -1;}// 定义混合权重double alpha = 0.5;  // 第一幅图像的权重double beta = 1.0 - alpha;  // 第二幅图像的权重// 进行线性混合cv::Mat blendedImage;cv::addWeighted(image1, alpha, image2, beta, 0.0, blendedImage);// 显示原始图像和混合后的图像cv::imshow("Image 1", image1);cv::imshow("Image 2", image2);cv::imshow("Blended Image", blendedImage);// 等待按键cv::waitKey(0);return 0;
}

在这里插入图片描述

设置感兴趣区域再矩形线形混合

#include <opencv2/opencv.hpp>int main() {// 读取两幅图像cv::Mat image1 = cv::imread("11.png");cv::Mat image2 = cv::imread("22.png");// 检查图像是否成功加载if (image1.empty() || image2.empty()) {std::cerr << "Error: Could not read the image(s)." << std::endl;return -1;}// 确保两幅图像大小相同if (image1.size() != image2.size()) {std::cerr << "Error: Image sizes do not match." << std::endl;return -1;}// 定义感兴趣区域的矩形cv::Rect roiRect(100, 50, 150, 100);// 定义不同区域的权重double alpha1 = 0.8;  // 第一幅图像的权重double beta1 = 1.0 - alpha1;  // 第二幅图像的权重double alpha2 = 0.3;  // 第一幅图像的权重double beta2 = 1.0 - alpha2;  // 第二幅图像的权重// 创建两个感兴趣区域cv::Mat roi1 = image1(roiRect);cv::Mat roi2 = image2(roiRect);// 进行线性混合cv::Mat blendedROI;cv::addWeighted(roi1, alpha1, roi2, beta1, 0.0, blendedROI);// 将混合后的ROI放回原图像blendedROI.copyTo(image1(roiRect));// 显示原始图像和混合后的图像cv::imshow("Image 1", image1);cv::imshow("Image 2", image2);// 等待按键cv::waitKey(0);return 0;
}

在这里插入图片描述

http://www.lryc.cn/news/185224.html

相关文章:

  • Doris 2.0.1 DockerFile版 升级实战
  • kotlin aes 加密解密
  • sqlite3的lib和头文件在哪下载 2023/9/19 上午10:46:43
  • 磁通量概述
  • MySql 终端常用指令
  • 【React-hooks篇幅】自定义hooks
  • 面试算法21:删除倒数第k个节点
  • 数据结构——排序算法(C语言)
  • 基于Http Basic Authentication的接口
  • 【yaml文件的编写】
  • kt6368A双模蓝牙芯片无法透传 可能是什么问题呢
  • SpringBoot终极讲义第二章笔记
  • 【C++面向对象侯捷下】4. pointer-like classes,关于智能指针 | 5. function-like classes,所谓仿函数
  • 社科院与杜兰大学能源管理硕士项目——惊喜会随时间慢慢酝酿而出
  • Array简介
  • Django的模版使用(Django-03)
  • 详解分布式搜索技术之elasticsearch
  • 系统架构设计:3 软件架构建模技术与应用
  • JAVA在线电子病历编辑器源码 B/S架构
  • TS中的枚举是什么如何使用
  • UG\NX二次开发 重命名特征对象 UF_OBJ_set_name
  • 低欲望社会:只要我没欲望,世界就对我束手无策?
  • 抢红包设计
  • k8s集群-6(daemonset job cronjob控制器)
  • Compose 编译器版本和Kotlin版本对应关系
  • vite+vue+cesium
  • tcp滑动窗口原理
  • 3.4 Android bpfloader初始化流程解读(二)
  • Linux0.12内核源码解读(2)-Bootsect.S
  • 虚拟环境搭建、后台项目创建及目录调整、封装logger、封装全局异常、封装Response、后台数据库创建