在Android上玩转Opencv 系列: 5.基础知识 图像融合

371 阅读3分钟

在 Android 中使用 OpenCV 融合(合成)两张图像,常见的方法是通过图像加权平均(即加权融合)或者使用特定的图像合成技术(例如 alpha blending)。加权融合指的是通过给每张图像分配一个权重,然后按一定比例混合它们。

下面,我将介绍如何使用 OpenCV 在 Android 上将两张图像进行融合。

融合两张图像的基本步骤:

  1. 读取两张图像:首先,加载需要融合的两张图像。

  2. 调整图像尺寸(如果它们的大小不一样):确保两张图像的尺寸相同,如果不一样,可以通过 Imgproc.resize 来调整大小。

  3. 执行加权融合:使用 OpenCV 的 addWeighted 函数来进行加权融合。

加权融合(Alpha Blending):

Imgproc.addWeighted 是一种常见的图像加权融合方法。它按比例将两张图像合成一张图像。公式如下:

image.png

其中:

• 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);
}

merege.png

代码解释:

  1. 读取图像:使用 Imgcodecs.imread 加载两张图像(image1 和 image2)。

  2. 调整图像大小:如果两张图像的尺寸不同,使用 Imgproc.resize 调整第二张图像 (image2) 的大小,使其与第一张图像 (image1) 一致。

  3. 加权融合:使用 Core.addWeighted 对两张图像进行加权平均。alpha 和 beta 控制每张图像的贡献比例,gamma 是一个常量偏移量,通常为 0。

  4. 显示或保存结果:使用 Imgcodecs.imwrite 将结果保存到文件,或者将其转换为 Bitmap,然后显示在 ImageView 中。

参数调节:

alpha:控制第一张图像的权重,值范围通常是 [0, 1]。

beta:控制第二张图像的权重,值范围通常是 [0, 1]。

gamma:可以设置为一个常数,用于调节图像的亮度或对比度,通常为 0。

可选功能:使用 Alpha 通道进行融合

如果你想通过 alpha 通道(透明度)对两张图像进行融合,可以使用图像的透明度信息来调整图像的合成方式。这可以通过自定义代码来实现(如提取图像的 alpha 通道进行处理),但常规加权融合不涉及透明度的处理。

总结:

使用 OpenCV 的 Core.addWeighted 方法可以非常方便地将两张图像进行融合。在 Android 上,首先需要加载图像并调整其大小,使得它们的尺寸一致。然后,你可以使用 alpha 和 beta 参数来控制图像融合的比例,达到你想要的效果。