| 专栏简介 | ||
💒个人主页 📰专栏目录 点击上方查看更多内容  |  📖心灵鸡汤📖 我们唯一拥有的就是今天,唯一能把握的也是今天 建议把本文当作笔记来看,据说专栏目录里面有相应视频🤫  |  🧭文章导航🧭 ⬆️ 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 | 
        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]
                
 



















