• 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

    在这里插入图片描述

  • 相关阅读:
    C#中的方法
    【无标题】
    1515_人月神话阅读笔记_20年后的人月神话_下篇
    【JS】使用wavesurfer播放网络音频(Vue)
    java计算机毕业设计古玩玉器交易系统源码+mysql数据库+系统+lw文档+部署
    对一门不是非常熟悉的语言是怎么面试的
    多线程应用——单例模式
    Leetcode 1834. Single-Threaded CPU (堆好题)
    jxTMS设计思想之流程追溯
    Java SE 13 新增特性
  • 原文地址:https://blog.csdn.net/qq_46107892/article/details/133646017