当前位置: 首页 > article >正文

[C#]利用opencvsharp 已知原图和mask掩码图像,抠出原图中人物,背景设置为透明色

在 OpenCVSharp 中,将抠出的人物背景设置为透明色通常意味着你需要创建一个具有 alpha 通道的图像(即,一个带有透明度信息的图像)。这通常是一个四通道的图像(RGBA),其中 alpha 通道用于表示透明度。

然而,OpenCVSharp 默认处理的是三通道(BGR)或单通道(灰度)图像。为了处理带有 alpha 通道的图像,你需要做一些额外的步骤。以下是一个示例代码,展示了如何使用 OpenCVSharp 从原图中抠出人物,并将背景设置为透明色(RGBA 格式中的 alpha 通道为 0 表示透明):

using System;
using OpenCvSharp;

class Program
{
    static void Main(string[] args)
    {
        // 读取原图和掩码图像
        Mat src = Cv2.ImRead("path_to_original_image.jpg", ImreadModes.Color);
        Mat mask = Cv2.ImRead("path_to_mask_image.png", ImreadModes.Grayscale);

        if (src.Empty() || mask.Empty())
        {
            Console.WriteLine("Could not open or find the images!");
            return;
        }

        // 确保掩码图像是单通道的(灰度图)
        if (mask.Channels() != 1)
        {
            Console.WriteLine("Mask image must be grayscale!");
            return;
        }

        // 创建一个和原图同样大小的四通道(RGBA)输出图像
        Mat result = new Mat(src.Rows, src.Cols, MatType.CV_8UC4, Scalar.All(0)); // 初始化为全黑(透明)

        // 将原图转换为四通道图像(如果它原本不是)
        Mat srcWithAlpha = new Mat();
        Cv2.CvtColor(src, srcWithAlpha, ColorConversionCodes.BGR2BGRA);

        // 使用掩码将原图中的人物区域复制到结果图像中,并设置背景为透明
        srcWithAlpha.CopyTo(result, mask); // 这里 mask 作为操作掩码,只复制非零区域

        // 注意:由于 mask 是单通道的,CopyTo 方法会自动将其扩展为与 srcWithAlpha 相同的通道数(在这里是 4),
        // 并且只会在 mask 非零的位置进行复制。因此,结果图像中 mask 为零的位置将保持为初始化的透明值。

        // 保存结果图像为 PNG 格式(支持 alpha 通道)
        Cv2.ImWrite("path_to_result_image_with_alpha.png", result);

        // 显示结果图像(可选,但注意大多数图像查看器可能不支持显示 alpha 通道)
        // Cv2.ImShow("Result with Alpha", result); // 这通常不会显示透明背景,因为 ImShow 不支持 alpha 通道的正确显示
        // Cv2.WaitKey(0);
        // Cv2.DestroyAllWindows();

        // 如果你需要在 GUI 应用程序中显示带有透明背景的图像,你可能需要使用其他库(如 SDL、SFML 或 Qt)来正确渲染它。
    }
}

注意事项

  1. 图像格式:确保你保存的图像格式支持 alpha 通道(如 PNG)。JPEG 格式不支持 alpha 通道。

  2. 图像查看器:大多数标准的图像查看器可能不支持显示带有 alpha 通道的图像。你可能需要使用支持 alpha 通道的图像编辑器(如 Photoshop)或专门的图像查看器来查看结果。

  3. 显示透明图像Cv2.ImShow 方法通常不会正确显示带有 alpha 通道的图像。如果你需要在 GUI 应用程序中显示这些图像,你可能需要使用其他库来渲染它们。

  4. 掩码扩展:在 CopyTo 方法中,当源图像和目标图像的通道数不同时,OpenCV 会自动处理通道的扩展或缩减。在这个例子中,单通道的掩码被扩展为四通道,并且只在前三个通道中复制了非零值(因为源图像是四通道的),而 alpha 通道则保持为初始化的透明值(0)。然而,由于 CopyTo 的行为,实际上你不需要显式地处理 alpha 通道;它会在掩码为零的位置自动保持为透明。


http://www.kler.cn/a/427412.html

相关文章:

  • 方案拆解 | 打击矩阵新规频出!2025矩阵营销该怎么玩?
  • 蓝桥杯2117砍竹子(简单易懂 包看包会版)
  • 常见限流算法介绍 和 Spring Cloud Sentinel使用方式
  • 企业级资源监控方案落地:Prometheus+Grafana+Export
  • 代码随想录-算法训练营day35(贪心算法05:无重叠区间,划分字母区间,合并区间)
  • oracle 数组分组
  • 电子应用设计方案-43:智能手机充电器系统方案设计
  • node.js常用的模块和中间件?
  • DAY168内网对抗-基石框架篇单域架构域内应用控制成员组成用户策略信息收集环境搭建
  • RBA评分等级和标准
  • Oracle系统性能监控工具oswatcher演示
  • 通过 FRP 实现 P2P 通信:控制端与被控制端配置指南
  • Spring Boot接口返回统一格式
  • stm32中的常用函数
  • Java基础-异常
  • 【Vue3】 vant4 + Uploader组件上传文件
  • C++设计模式(建造者、中介者、备忘录)
  • ubuntu中使用ffmpeg库进行api调用开发
  • 【哈夫曼树】
  • Luma 视频生成 API 对接说明