使用 C#EmguCV 來進行 去背(背景去除) 的範例程式碼。這段程式碼使用 GrabCut 方法來進行前景與背景分割,適用於大多數圖片的去背需求。


步驟概述

  1. 載入影像
  2. 轉換為灰階(可選)
  3. 使用 GrabCut 進行前景提取
  4. 建立遮罩並去除背景
  5. 輸出去背結果


C# + EmguCV 去背程式碼

csharp
using System; using System.Drawing;
using Emgu.CV;
using Emgu.CV.Structure;
using Emgu.CV.CvEnum;
using Emgu.CV.ML;
class Program
{
  static void Main()
  {
    string inputImagePath = "input.jpg"; // 替換為你的圖片路徑
    string outputImagePath = "output.png"; // 去背後的輸出圖片
    // 讀取原始影像
    Mat image = CvInvoke.Imread(inputImagePath, ImreadModes.Color);
    if (image.IsEmpty)
    {
      Console.WriteLine("無法讀取圖片!");
      return;
    }
    // 創建遮罩
    Mat mask = new Mat(image.Size, DepthType.Cv8U, 1);
    mask.SetTo(new MCvScalar(0));
    // 初始化背景與前景模型
    Mat bgModel = new Mat();
    Mat fgModel = new Mat();
    // 設定ROI區域(假設前景大約在圖片中心)
    Rectangle rect = new Rectangle(image.Width / 4, image.Height / 4, image.Width / 2, image.Height / 2);
    // 執行 GrabCut CvInvoke.GrabCut(image, mask, rect, bgModel, fgModel, 5, GrabCutModes.InitWithRect);
    // 轉換 Mask 成二元圖
    Mat foregroundMask = new Mat(); CvInvoke.Compare(mask, new ScalarArray(2), foregroundMask, CmpType.Equal); 
    // 創建輸出圖
    Mat output = new Mat(); image.CopyTo(output, foregroundMask);
    // 儲存去背後的圖片
    CvInvoke.Imwrite(outputImagePath, output);
    Console.WriteLine("去背完成! 輸出圖片已儲存至 " + outputImagePath);
  }
}

程式碼說明

  • 讀取圖片 (CvInvoke.Imread)
    這部分讀取原始圖片,確保圖片存在。
  • 建立遮罩 (Mat mask)
    mask 會用來標記哪些部分是前景、哪些是背景。
  • GrabCut 前景提取 (CvInvoke.GrabCut)
    GrabCutModes.InitWithRect 會以矩形區域來初步標定前景,接著演算法會自動計算出更精確的前景範圍。
  • 生成最終去背圖片 (CvInvoke.Compare)
    透過 Compare 方法將非前景區域設為黑色,然後使用 CopyTo 建立最終去背結果。
  • 輸出並儲存 (CvInvoke.Imwrite)
    產生去背結果並存成 PNG(保留透明背景)。

適用場景

拍攝清楚的物體(對比明顯)
前景與背景區別明顯的圖片

如果背景較為複雜,可以改進:

  • 手動標記前景區域(更精準)
  • 使用深度學習模型(如 U-Net 或 MODNet)

這段程式碼已經能基本實現去背功能

 

OpenCV 實作篇-圖像分割(GrabCut Technique)

可參考此網址內容: 網址

創作者介紹
創作者 IMM 的頭像
IMM-AT

IMM

IMM-AT 發表在 痞客邦 留言(0) 人氣( 5 )