在Android上玩转Opencv 系列: 6.基础知识 图像rgba通道分离与融合

199 阅读3分钟

在 Android OpenCV 中,分离和融合图像通道的操作是处理图像色彩和通道的重要步骤。OpenCV 提供了非常方便的函数来进行这些操作。

1. 分离图像通道

图像通常由多个通道组成(例如,RGB 图像有红、绿、蓝三个通道),你可以使用 Core.split() 方法将图像分离成单独的通道。

代码示例:分离和融合图像通道

import org.opencv.core.Mat;
import org.opencv.core.Core;
import org.opencv.imgcodecs.Imgcodecs;

public class SplitChannels {
    public void splitImageChannels() {
    
    
    
// 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);


    }
}

在这个例子中,Core.split() 将图像分离成多个通道(如 RGB 图像会分为红、绿、蓝三个通道)。每个通道是一个单独的 Mat 对象,分别存储图像的颜色信息。

QQ_1742517149732.png

2. 融合图像通道

将多个通道合并成一张图像可以通过 Core.merge() 方法实现。你可以将分离的通道组合成一个新的图像。

代码示例:融合图像通道

import org.opencv.core.Mat;
import org.opencv.core.Core;
import org.opencv.imgcodecs.Imgcodecs;

public class MergeChannels {
    public void mergeImageChannels() {
        // 读取图像
        Mat image = Imgcodecs.imread("path/to/image.jpg");

        // 分离图像通道
        List<Mat> channels = new ArrayList<>();
        Core.split(image, channels);

        // 在这里你可以修改每个通道的内容,比如只保留某个颜色通道

        // 合并图像通道
        Mat mergedImage = new Mat();
        Core.merge(channels, mergedImage);  // 将通道合并成一个图像

        // 保存或显示合并后的图像
        Imgcodecs.imwrite("path/to/output_image.jpg", mergedImage);
    }
}

在此示例中,Core.merge() 将分离的通道合并成一个完整的图像。如果你修改了某些通道的内容(例如,去掉一个通道,或者将其设置为全 0),可以通过这种方法将修改后的通道重新合并成新的图像。

3. 通过通道操作图像

你还可以对单个通道进行处理,然后再将处理后的通道与其他通道合并。例如,修改图像的亮度、对比度、或进行色彩变换时,可以操作某个通道并在完成后将所有通道合并。

示例:修改图像的绿色通道并融合

import org.opencv.core.Mat;
import org.opencv.core.Core;
import org.opencv.core.Scalar;
import org.opencv.imgcodecs.Imgcodecs;

public class ModifyAndMergeChannels {
    public void modifyAndMergeChannels() {
        // 读取图像
        Mat image = Imgcodecs.imread("path/to/image.jpg");

        // 分离图像通道
        List<Mat> channels = new ArrayList<>();
        Core.split(image, channels);

        // 修改绿色通道(例如:将绿色通道设置为全 0)
        Mat greenChannel = channels.get(1);  // 获取绿色通道
        Core.subtract(greenChannel, greenChannel, greenChannel);  // 设置绿色通道为 0

        // 合并修改后的通道
        Mat mergedImage = new Mat();
        Core.merge(channels, mergedImage);

        // 保存合并后的图像
        Imgcodecs.imwrite("path/to/output_image.jpg", mergedImage);
    }
}

4. 注意事项

通道顺序:通常 RGB 图像的通道顺序是 BGR(蓝、绿、红),而不是 RGB。如果你使用的是 BGR 图像,分离后的通道顺序也应该是 BGR。

通道数:对于灰度图像,只有一个通道;对于彩色图像(如 RGB 或 BGR),通常有 3 个通道。如果图像有透明度(如 RGBA),则会有 4 个通道。

总结:

• 使用 Core.split() 方法分离图像的各个通道。

• 使用 Core.merge() 方法将多个通道重新合并成一张图像。

• 在分离和合并过程中,你可以对单独的通道进行任何自定义操作。