在 Android 中使用 OpenCV 融合(合成)两张图像,常见的方法是通过图像加权平均(即加权融合)或者使用特定的图像合成技术(例如 alpha blending)。加权融合指的是通过给每张图像分配一个权重,然后按一定比例混合它们。
下面,我将介绍如何使用 OpenCV 在 Android 上将两张图像进行融合。
融合两张图像的基本步骤:
-
读取两张图像:首先,加载需要融合的两张图像。
-
调整图像尺寸(如果它们的大小不一样):确保两张图像的尺寸相同,如果不一样,可以通过 Imgproc.resize 来调整大小。
-
执行加权融合:使用 OpenCV 的 addWeighted 函数来进行加权融合。
加权融合(Alpha Blending):
Imgproc.addWeighted 是一种常见的图像加权融合方法。它按比例将两张图像合成一张图像。公式如下:
其中:
• src1 和 src2 是两张输入图像。
• alpha 和 beta 是两个权重(浮动值,通常在 [0, 1] 范围内)。
• gamma 是一个可选的常数(通常设为 0)。
代码示例:
假设我们要融合两张大小相同的图像,并使用 alpha 和 beta 权重来控制它们的融合比例。
1. 导入 OpenCV 库并初始化
首先,确保你在 build.gradle 中已经添加了 OpenCV 的依赖,并初始化 OpenCV。
dependencies {
implementation 'org.opencv:opencv-android:4.5.1'
}
在 MainActivity 中初始化 OpenCV:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (!OpenCVLoader.initDebug()) {
Log.e("OpenCV", "OpenCV initialization failed.");
} else {
Log.d("OpenCV", "OpenCV initialization succeeded.");
}
}
2. 加载图像并进行加权融合
void merege(ImageView imageView){
// 1.加载图像
Mat image1 = ImgHelper.bitmapToMatWithAlpha(ImgHelper.readImg(R.drawable.bt));
Mat image2 = ImgHelper.bitmapToMatWithAlpha(ImgHelper.readImg(R.drawable.hs));
// 2. 如果图像大小不同,调整它们的大小
if (image1.size().height != image2.size().height || image1.size().width != image2.size().width) {
Imgproc.resize(image2, image2, image1.size());
}
// 3. 设置加权参数
double alpha = 0.7; // 第一张图的权重
double beta = 0.3; // 第二张图的权重
double gamma = 0.0; // 偏移量,通常为0
// 4. 执行图像融合
Mat dst = new Mat();
Core.addWeighted(image1, alpha, image2, beta, gamma, dst);
// 将融合后的 Mat 转换为 Bitmap,用于显示在 ImageView 中
Bitmap bitmap = Bitmap.createBitmap(dst.cols(), dst.rows(), Bitmap.Config.ARGB_8888);
Utils.matToBitmap(dst, bitmap);
imageView.setImageBitmap(bitmap);
}
代码解释:
-
读取图像:使用 Imgcodecs.imread 加载两张图像(image1 和 image2)。
-
调整图像大小:如果两张图像的尺寸不同,使用 Imgproc.resize 调整第二张图像 (image2) 的大小,使其与第一张图像 (image1) 一致。
-
加权融合:使用 Core.addWeighted 对两张图像进行加权平均。alpha 和 beta 控制每张图像的贡献比例,gamma 是一个常量偏移量,通常为 0。
-
显示或保存结果:使用 Imgcodecs.imwrite 将结果保存到文件,或者将其转换为 Bitmap,然后显示在 ImageView 中。
参数调节:
• alpha:控制第一张图像的权重,值范围通常是 [0, 1]。
• beta:控制第二张图像的权重,值范围通常是 [0, 1]。
• gamma:可以设置为一个常数,用于调节图像的亮度或对比度,通常为 0。
可选功能:使用 Alpha 通道进行融合
如果你想通过 alpha 通道(透明度)对两张图像进行融合,可以使用图像的透明度信息来调整图像的合成方式。这可以通过自定义代码来实现(如提取图像的 alpha 通道进行处理),但常规加权融合不涉及透明度的处理。
总结:
使用 OpenCV 的 Core.addWeighted 方法可以非常方便地将两张图像进行融合。在 Android 上,首先需要加载图像并调整其大小,使得它们的尺寸一致。然后,你可以使用 alpha 和 beta 参数来控制图像融合的比例,达到你想要的效果。