• c++视觉图像线性混合


    图像线性混合

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

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

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

    #include 
    
    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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    在这里插入图片描述

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

    #include 
    
    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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49

    在这里插入图片描述

  • 相关阅读:
    LD_LIBRARY_PATH 环境变量设置
    glibc2.35-通过tls_dtor_list劫持exit执行流程
    服务器(Linux)查看Tomcat运行日志
    2023NOIP A层联测27 A.kotori
    麒麟系统安装找不到安装源!!!!设置基础软件仓库时出错
    jsp357校园点餐订餐系统ssm
    OSS存储开放接口规范 和 错误响应
    基于Yolov5的吸烟行为识别检测
    SpringBoot 源码分析(四) 内置Tomcat分析
    html 动态设置下拉选项
  • 原文地址:https://blog.csdn.net/qq_46107892/article/details/133646017