14.java openCV4.x 入门-Core之图像融合

2024-04-10 20:12

本文主要是介绍14.java openCV4.x 入门-Core之图像融合,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

专栏简介

💒个人主页
📰专栏目录

点击上方查看更多内容
📖心灵鸡汤📖

我们唯一拥有的就是今天,唯一能把握的也是今天


建议把本文当作笔记来看,据说专栏目录里面有相应视频🤫
🧭文章导航🧭
⬆️ 13.Core之图像差异比对(动态预警)
⬇️

Core之图像融合

  • 一、逐元素和
    • 1.方法说明
    • 2.扩展示例
      • 1.图像融合
      • 2.添加噪点
  • 二、缩放和
    • 1.方法说明
  • 三、加权和
    • 2.方法说明

  

一、逐元素和

   add函数用于将两个矩阵或者矩阵与常量之间进行逐像素相加,并生成一个新的矩阵,其中每个像素表示对应位置上两者像素的和。

1.方法说明

   仅列举全参方法

1.当两个输入数组具有相同的大小和相同的通道数时,两个数组的和为:
  dst(I)=saturate(src1(I)+src2(I))如果 mask(I)≠0
2.当第二个输入(src2)是由 Scalar 构造的或者具有与 src1.channels() 相同数量的元素时,数组和标量的和为:
  dst(I)=saturate(src1(I)+src2)如果 mask(I)≠0
3.当第一个输入(src1)是由 Scalar 构造的或者具有与 src2.channels() 相同数量的元素时,标量和数组的和为:
  dst(I)=saturate(src1+src2(I))如果 mask(I)≠0

1.计算两个数组(矩阵)的每个元素的和

add​(Mat src1, Mat src2, Mat dst, Mat mask, int dtype)
参数:
src1第一个数组(矩阵)
src2 第二个数组(矩阵)
dst 输出数组,其大小和通道数与输入数组相同
mask 可选操作掩码- 8位单通道数组,用于指定输出数组中要更改的元素
dtype 可选的输出数组深度,默认值为-1
   输入数组和输出数组可以有相同的或不同的深度。例如,可以将一个16位无符号数组添加到一个8位有符号数组中,并将和存储为32位浮点数数组。输出数组的深度由dtype参数确定。在上述第二种和第三种情况以及第一种情况中,当src1.depth()等于src2.depth()时,dtype可以设置为默认值-1。在这种情况下,输出数组将具有与输入数组相同的深度,无论是src1,src2还是两者。
        Mat src1 = new Mat(2,2, CvType.CV_8UC1);src1.put(0,0,1,2,3,4);//克隆Mat src2 = src1.clone();src2.t();System.out.println("src1.dump() = \n" + src1.dump());System.out.println("src2.dump() = \n" + src2.dump());Mat dst =new Mat();Core.add(src1,src2,dst,new Mat(),-1);System.out.println("dst.dump() = \n" + dst.dump());

结果:

src1.dump() =
[ 1, 2;
3, 4]
src2.dump() =
[ 1, 2;
3, 4]
dst.dump() =
[ 2, 4;
6, 8]

2.计算数组与标量之间的每个元素的和值.

add​(Mat src1, Scalar src2, Mat dst, Mat mask, int dtype)
参数:
src1第一个数组(矩阵)
src2 标量
dst 输出数组,其大小和通道数与输入数组相同
mask 可选操作掩码- 8位单通道数组,用于指定输出数组中要更改的元素
dtype 可选的输出数组深度,默认值为-1
        Mat src1 = new Mat(2,1, CvType.CV_8UC2);src1.put(0,0,1,2,3,4);System.out.println("src1.dump() = \n" + src1.dump());Mat dst =new Mat();Core.add(src1,new Scalar(0,-1),dst,new Mat(),-1);System.out.println("dst.dump() = \n" + dst.dump());

结果:

src1.dump() =
[ 1, 2;
3, 4]
dst.dump() =
[ 1, 1;
3, 3]

2.扩展示例

  通过了解此函数,我们可以用它实现图像融合的效果。例如实现图像叠加、混合或透明度调整、亮度调整等功能。

1.图像融合

        Mat src1 = Imgcodecs.imread("img_5.png");Mat src2 = Imgcodecs.imread("img_6.png");Mat dst = new Mat();Core.add(src1,src2,dst);HighGui.imshow("dst",dst);HighGui.waitKey(10);

结果:
在这里插入图片描述

2.添加噪点

        Mat src1 = Imgcodecs.imread("img_5.png");//创建随机矩阵,为了效果明显,像素值设置到最大Mat src2 = new Mat(src1.size(),src1.type());int rows = src2.rows();int cols = src2.cols();Random random = new Random(10);for (int r = 0; r < rows; r++) {for (int c = 0; c < cols; c++) {if ( random.nextInt()<6){src2.put(r,c,255,255,255);}}}Mat dst = new Mat();Mat mask = new Mat();Core.add(src1,src2,dst,mask,-1);HighGui.imshow("dst",dst);HighGui.waitKey();

结果:
在这里插入图片描述

二、缩放和

1.方法说明

1.计算一个缩放数组与另一个数组的和

scaleAdd​(Mat src1, double alpha, Mat src2, Mat dst)
参数:
src1第一个数组(矩阵)
alpha 第一个数组的缩放因子
src2 与src1具有相同大小和通道数的第二个输入数组
dst 输出数组具有与输入数组相同的大小和通道数
计算公式为:
  dst(I)=scale⋅src1(I)+src2(I)
        Mat mat = new Mat(3,3, CvType.CV_8UC1);mat.put(0,0,1,2,3,4,5,6,7,8,9);Mat clone = mat.clone();clone.put(0,0,1,0,2);Mat dst = new Mat();Core.scaleAdd(mat,10,clone,dst);System.out.println("mat.dump() = \n" + mat.dump());System.out.println("clone.dump() = \n" + clone.dump());System.out.println("dst.dump() = \n" + dst.dump());

结果:

mat.dump() = 
[  1,   2,   3;4,   5,   6;7,   8,   9]
clone.dump() = 
[  1,   0,   2;4,   5,   6;7,   8,   9]
dst.dump() = 
[ 11,  20,  32;44,  55,  66;77,  88,  99]

三、加权和

  addWeighted用于将两个图像按照指定的权重进行融合。

2.方法说明

1.计算两个数组的加权和

addWeighted​(Mat src1, double alpha, Mat src2, double beta, double gamma, Mat dst, int dtype)
参数:
src1第一个数组(矩阵)
alpha 第一个数组元素的权重
src2 与src1具有相同大小和通道数的第二个输入数组
beta 第二个数组元素的权重
gamma 每个和加上标量
dst 输出数组具有与输入数组相同的大小和通道数
dtype 可选的输出数组的深度。当两个输入数组具有相同的深度时,dtype 可以设置为 -1
计算公式为:
  dst(I)=saturate(src1(I)∗alpha+src2(I)∗beta+gamma)
其中I是一个多维数组元素的索引。在多通道数组的情况下,每个通道独立处理
        Mat mat = new Mat(3,3, CvType.CV_8UC1);mat.put(0,0,1,2,3,4,5,6,7,8,9);Mat clone = mat.clone();clone.put(0,0,2,2,2);Mat dst = new Mat();Core.addWeighted(mat,2,clone,3,-1,dst);System.out.println("mat.dump() = \n" + mat.dump());System.out.println("clone.dump() = \n" + clone.dump());System.out.println("dst.dump() = \n" + dst.dump());

结果:

mat.dump() = 
[  1,   2,   3;4,   5,   6;7,   8,   9]
clone.dump() = 
[  2,   2,   2;4,   5,   6;7,   8,   9]
dst.dump() = 
[  7,   9,  11;19,  24,  29;34,  39,  44]

这篇关于14.java openCV4.x 入门-Core之图像融合的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/892026

相关文章

Java实现检查多个时间段是否有重合

《Java实现检查多个时间段是否有重合》这篇文章主要为大家详细介绍了如何使用Java实现检查多个时间段是否有重合,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录流程概述步骤详解China编程步骤1:定义时间段类步骤2:添加时间段步骤3:检查时间段是否有重合步骤4:输出结果示例代码结语作

Java中String字符串使用避坑指南

《Java中String字符串使用避坑指南》Java中的String字符串是我们日常编程中用得最多的类之一,看似简单的String使用,却隐藏着不少“坑”,如果不注意,可能会导致性能问题、意外的错误容... 目录8个避坑点如下:1. 字符串的不可变性:每次修改都创建新对象2. 使用 == 比较字符串,陷阱满

Java判断多个时间段是否重合的方法小结

《Java判断多个时间段是否重合的方法小结》这篇文章主要为大家详细介绍了Java中判断多个时间段是否重合的方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录判断多个时间段是否有间隔判断时间段集合是否与某时间段重合判断多个时间段是否有间隔实体类内容public class D

IDEA编译报错“java: 常量字符串过长”的原因及解决方法

《IDEA编译报错“java:常量字符串过长”的原因及解决方法》今天在开发过程中,由于尝试将一个文件的Base64字符串设置为常量,结果导致IDEA编译的时候出现了如下报错java:常量字符串过长,... 目录一、问题描述二、问题原因2.1 理论角度2.2 源码角度三、解决方案解决方案①:StringBui

Java覆盖第三方jar包中的某一个类的实现方法

《Java覆盖第三方jar包中的某一个类的实现方法》在我们日常的开发中,经常需要使用第三方的jar包,有时候我们会发现第三方的jar包中的某一个类有问题,或者我们需要定制化修改其中的逻辑,那么应该如何... 目录一、需求描述二、示例描述三、操作步骤四、验证结果五、实现原理一、需求描述需求描述如下:需要在

Java中ArrayList和LinkedList有什么区别举例详解

《Java中ArrayList和LinkedList有什么区别举例详解》:本文主要介绍Java中ArrayList和LinkedList区别的相关资料,包括数据结构特性、核心操作性能、内存与GC影... 目录一、底层数据结构二、核心操作性能对比三、内存与 GC 影响四、扩容机制五、线程安全与并发方案六、工程

JavaScript中的reduce方法执行过程、使用场景及进阶用法

《JavaScript中的reduce方法执行过程、使用场景及进阶用法》:本文主要介绍JavaScript中的reduce方法执行过程、使用场景及进阶用法的相关资料,reduce是JavaScri... 目录1. 什么是reduce2. reduce语法2.1 语法2.2 参数说明3. reduce执行过程

如何使用Java实现请求deepseek

《如何使用Java实现请求deepseek》这篇文章主要为大家详细介绍了如何使用Java实现请求deepseek功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1.deepseek的api创建2.Java实现请求deepseek2.1 pom文件2.2 json转化文件2.2

Java调用DeepSeek API的最佳实践及详细代码示例

《Java调用DeepSeekAPI的最佳实践及详细代码示例》:本文主要介绍如何使用Java调用DeepSeekAPI,包括获取API密钥、添加HTTP客户端依赖、创建HTTP请求、处理响应、... 目录1. 获取API密钥2. 添加HTTP客户端依赖3. 创建HTTP请求4. 处理响应5. 错误处理6.

Spring AI集成DeepSeek的详细步骤

《SpringAI集成DeepSeek的详细步骤》DeepSeek作为一款卓越的国产AI模型,越来越多的公司考虑在自己的应用中集成,对于Java应用来说,我们可以借助SpringAI集成DeepSe... 目录DeepSeek 介绍Spring AI 是什么?1、环境准备2、构建项目2.1、pom依赖2.2