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