Hapus Gambar Latar Belakang C#

Dalam pembuatan dan manipulasi konten digital, menghapus latar belakang gambar adalah tugas yang umum dan penting. Baik Anda sedang mengerjakan desain grafis, e-commerce, atau proyek visual lainnya, kemampuan untuk mengisolasi objek dari latar belakangnya akan memperluas kreativitas Anda. Dalam postingan blog ini, kita akan mempelajari cara menghapus latar belakang dari gambar secara terprogram di C#.

Perpustakaan C# untuk Menghapus Latar Belakang dari Gambar

Untuk menghapus latar belakang dari gambar, kita akan menggunakan Aspose.Imaging for .NET - perpustakaan canggih yang menyediakan berbagai fitur pemrosesan gambar untuk aplikasi .NET. Ini mendukung berbagai format gambar dan memungkinkan pengembang untuk melakukan operasi seperti mengubah ukuran, memotong, memutar, dan, tentu saja, menghapus latar belakang dengan mudah.

Anda dapat mengunduh API atau menginstalnya dari NuGet.

PM> Install-Package Aspose.Imaging

Menghapus Latar Belakang Gambar dengan Auto Masking di C#

Untuk menerima hasil penghapusan latar belakang yang lebih baik, metode penyembunyian otomatis lebih disukai. Tujuannya adalah untuk membuat topeng yang secara akurat mengidentifikasi piksel milik latar depan dan piksel milik latar belakang. Aspose.Imaging menyediakan tiga teknik penyembunyian otomatis untuk menghapus latar belakang dari gambar, seperti yang dijelaskan di bagian berikut.

Masking Otomatis Potong Grafik dengan Bulu

Dalam teknik ini, API melakukan masking gambar dengan bulu-bulu berdasarkan ukuran gambar dan menggunakan goresan default yang dihitung secara otomatis. Cuplikan kode berikut menunjukkan cara menggunakan masking otomatis pemotongan grafik dengan bulu. Properti Args dari AutoMaskingGraphCutOptions dapat dihilangkan karena goresan default ditempatkan di sana pada akhirnya.

using Aspose.Imaging;
using Aspose.Imaging.FileFormats.Png;
using Aspose.Imaging.ImageOptions;
using Aspose.Imaging.Masking;
using Aspose.Imaging.Masking.Options;
using Aspose.Imaging.Masking.Result;
using Aspose.Imaging.Sources;
using System;
using System.IO;

string templatesFolder = @"c:\Users\USER\Downloads\templates\";
string dataDir = templatesFolder;

MaskingResult results;
using (RasterImage image = (RasterImage)Image.Load(dataDir + "couple.jpg"))
{
    // Untuk menggunakan Pemotongan Grafik dengan goresan yang dihitung secara otomatis, AutoMaskingGraphCutOptions digunakan.
    AutoMaskingGraphCutOptions options = new AutoMaskingGraphCutOptions
    {
        // Menunjukkan bahwa perhitungan baru dari goresan default harus dilakukan selama dekomposisi gambar.
        CalculateDefaultStrokes = true,
        // Mengatur radius penghalusan pasca proses berdasarkan ukuran gambar.
        FeatheringRadius = (Math.Max(image.Width, image.Height) / 500) + 1,
        Method = SegmentationMethod.GraphCut,
        Decompose = false,
        ExportOptions =
                                                        new PngOptions()
                                                        {
                                                            ColorType = PngColorType.TruecolorWithAlpha,
                                                            Source = new FileCreateSource(dataDir + "result.png")
                                                        },
        BackgroundReplacementColor = Color.Transparent
    };

    results = new ImageMasking(image).Decompose(options);

    using (RasterImage resultImage = (RasterImage)results[1].GetImage())
    {
        resultImage.Save(dataDir + "result2.png", new PngOptions() { ColorType = PngColorType.TruecolorWithAlpha });
    }
}



File.Delete(dataDir + "result.png");
File.Delete(dataDir + "result2.png");

Tangkapan layar berikut menunjukkan gambar input dan output.

menghapus latar belakang gambar di C#

Menggunakan kembali Goresan Default dalam Masking Otomatis Berulang

Dalam teknik ini, penyembunyian gambar dilakukan menggunakan goresan default yang dihitung secara otomatis, namun API menggunakan kembali opsi penyembunyian untuk iterasi penyembunyian yang baru. Dalam cuplikan kode berikut, Anda dapat melihat bahwa data dari dua objek yang diasumsikan juga ditentukan dalam properti AssumedObjects dari AutoMaskingGraphCutOptions. Mengikuti hasil masking awal, penyesuaian dilakukan pada guratan latar belakang/latar depan yang diterapkan, dan iterasi masking selanjutnya dilakukan.

using Aspose.Imaging;
using Aspose.Imaging.FileFormats.Png;
using Aspose.Imaging.ImageOptions;
using Aspose.Imaging.Masking;
using Aspose.Imaging.Masking.Options;
using Aspose.Imaging.Masking.Result;
using Aspose.Imaging.Sources;
using System;
using System.Collections.Generic;
using System.IO;

string templatesFolder = @"c:\Users\USER\Downloads\templates\";
string dataDir = templatesFolder;

// Untuk meningkatkan hasil masking, data objek spesifik yang harus disertakan dalam hasil masking latar depan dapat disediakan.
List<AssumedObjectData> assumedObjects = new List<AssumedObjectData>();
// Jenis objek dan area yang berisi objek tersebut harus ditentukan.
assumedObjects.Add(new AssumedObjectData(DetectedObjectType.Human, new Rectangle(0, 0, 300, 300)));

MaskingResult results;
AutoMaskingGraphCutOptions options;
Point[] appliedBackgroundStrokes;
Point[] appliedForegroundStrokes;
Rectangle[] appliedObjectRectangles;

using (RasterImage image = (RasterImage)Image.Load(dataDir + "couple.jpg"))
{
    // Untuk menggunakan Pemotongan Grafik dengan goresan yang dihitung secara otomatis, AutoMaskingGraphCutOptions digunakan.
    options = new AutoMaskingGraphCutOptions
    {
        AssumedObjects = assumedObjects,
        // Menunjukkan bahwa perhitungan baru dari goresan default harus dilakukan selama dekomposisi gambar.
        CalculateDefaultStrokes = true,
        // Mengatur radius penghalusan pasca proses berdasarkan ukuran gambar.
        FeatheringRadius = (Math.Max(image.Width, image.Height) / 500) + 1,
        Method = SegmentationMethod.GraphCut,
        Decompose = false,
        ExportOptions = new PngOptions()
        {
            ColorType = PngColorType.TruecolorWithAlpha,
            Source = new FileCreateSource(dataDir + "result.png")
        },
        BackgroundReplacementColor = Color.Transparent
    };

    using (IMaskingSession maskingSession = new ImageMasking(image).CreateSession(options))
    {
        results = maskingSession.Decompose();

        // Menyimpan hasil masking antara.
        using (RasterImage resultImage = results[1].GetImage())
        {
            resultImage.Save(dataDir + "result2.png",
                new PngOptions() { ColorType = PngColorType.TruecolorWithAlpha });
        }

        // Pada titik ini guratan latar depan/latar belakang yang diterapkan dapat dianalisis dan didasarkan pada tambahannya 
        // guratan latar depan/latar belakang dapat diberikan secara manual.
        appliedBackgroundStrokes = options.DefaultBackgroundStrokes;
        appliedForegroundStrokes = options.DefaultForegroundStrokes;
        appliedObjectRectangles = options.DefaultObjectsRectangles;

        // Dengan menggunakan kembali AutoMaskingGraphCutOptions, tidak perlu melakukan penghitungan goresan default untuk kedua kalinya.
        // Ketika goresan default dan ObjectsPoints di properti Args dari AutoMaskingArgs disediakan, array Point akhirnya digabungkan.
        // Array ObjectsPoints pertama dianggap sebagai array titik latar belakang dan 
        // larik ObjectsPoints kedua dianggap sebagai larik titik latar depan.
        // Ketika DefaultObjectsRectangles dan ObjectsRectangles di properti Args AutoMaskingArgs disediakan, 
        // hanya array dari Args yang digunakan.
        AutoMaskingArgs newAutoMaskingArgs = new AutoMaskingArgs()
        {
            ObjectsPoints = new Point[][]
            {
                // Selain itu menentukan area yang ingin kami hapus.
                GetRectanglePoints(
                    new Rectangle(100, 100, 35, 90),
                    new Rectangle(300, 140, 95, 50)
                )
            },
        };

        results = maskingSession.ImproveDecomposition(newAutoMaskingArgs);

        using (RasterImage resultImage = results[1].GetImage())
        {
            resultImage.Save(dataDir +
                "result3.png",
                new PngOptions() { ColorType = PngColorType.TruecolorWithAlpha });
        }
    }
}
//Contoh - grafik - potong - berulang - masking - dengan - baru- poin.cs
// Untuk meningkatkan hasil masking, data objek spesifik yang harus disertakan dalam hasil masking latar depan dapat disediakan.
assumedObjects = new List<AssumedObjectData>();
// Jenis objek dan area yang berisi objek tersebut harus ditentukan.
assumedObjects.Add(new AssumedObjectData(DetectedObjectType.Human, new Rectangle(100, 100, 150, 300)));

// Iterasi masking pertama dilakukan untuk mendapatkan sapuan kuas latar depan/latar belakang yang dihitung secara otomatis.
using (RasterImage image = (RasterImage)Image.Load(dataDir + "couple.jpg"))
{
    // Untuk menggunakan Pemotongan Grafik dengan goresan yang dihitung secara otomatis, AutoMaskingGraphCutOptions digunakan.
    options = new AutoMaskingGraphCutOptions
    {
        AssumedObjects = assumedObjects,
        // Menunjukkan bahwa perhitungan baru dari goresan default harus dilakukan selama dekomposisi gambar.
        CalculateDefaultStrokes = true,
        // Mengatur radius bulu-bulu pasca proses.
        FeatheringRadius = 3,
        Method = SegmentationMethod.GraphCut,
        Decompose = false,
        ExportOptions =
                            new PngOptions()
                            {
                                ColorType = PngColorType.TruecolorWithAlpha,
                                Source = new FileCreateSource(dataDir + "result4.png")
                            },
        BackgroundReplacementColor = Color.Transparent
    };

    results = new ImageMasking(image).Decompose(options);

    // Pada titik ini guratan latar depan/latar belakang yang diterapkan dapat dianalisis dan didasarkan pada tambahannya 
    // guratan latar depan/latar belakang dapat diberikan secara manual.
    appliedBackgroundStrokes = options.DefaultBackgroundStrokes;
    appliedForegroundStrokes = options.DefaultForegroundStrokes;
    appliedObjectRectangles = options.DefaultObjectsRectangles;
    using (RasterImage resultImage = (RasterImage)results[1].GetImage())
    {
        resultImage.Save(dataDir + "result5.png", new PngOptions() { ColorType = PngColorType.TruecolorWithAlpha });
    }
}



// Iterasi masking kedua dilakukan untuk lebih meningkatkan kualitas masking dengan menambahkan titik latar depan/latar belakang baru yang dipilih secara manual.
using (RasterImage image = (RasterImage)Image.Load(dataDir + "couple.jpg"))
{
    // Dengan menggunakan kembali AutoMaskingGraphCutOptions, tidak perlu melakukan penghitungan goresan default untuk kedua kalinya.
    options.CalculateDefaultStrokes = false;
    // Ketika goresan default dan ObjectsPoints di properti Args dari AutoMaskingArgs disediakan, array Point akhirnya digabungkan.
    // Array ObjectsPoints pertama dianggap sebagai array titik latar belakang dan 
    // larik ObjectsPoints kedua dianggap sebagai larik titik latar depan.
    // Ketika DefaultObjectsRectangles dan ObjectsRectangles di properti Args AutoMaskingArgs disediakan, 
    // hanya array dari Args yang digunakan.
    options.Args = new AutoMaskingArgs()
    {
        ObjectsPoints = new Point[][]
                                                {
                                                    new Point[] { new Point(100, 100), new Point(150, 100) },
                                                    new Point[] { new Point(300, 200) },
                                                },
        ObjectsRectangles = new Rectangle[]
                                                    {
                                                        new Rectangle(100, 100, 300, 300),
                                                    }
    };

    results = new ImageMasking(image).Decompose(options);

    // Menyimpan hasil masking akhir.
    using (RasterImage resultImage = (RasterImage)results[1].GetImage())
    {
        resultImage.Save(dataDir + "result6.png", new PngOptions() { ColorType = PngColorType.TruecolorWithAlpha });
    }
}



///<summary>
/// Mengembalikan semua titik milik persegi panjang yang ditentukan.
///</summary>
///<param name="rectangles"> Susunan persegi panjang.</param>
///<returns> Semua titik persegi panjang.</returns>
static Point[] GetRectanglePoints(params Rectangle[] rectangles)
{
    int arraySize = 0;
    foreach (Rectangle rectangle in rectangles)
    {
        arraySize += rectangle.Width * rectangle.Height;
    }

    Point[] pointArray = new Point[arraySize];
    int arrayIndex = 0;
    foreach (Rectangle rectangle in rectangles)
    {
       for (int x = rectangle.Left; x < rectangle.Right; x++)
        {
           for (int y = rectangle.Top; y < rectangle.Bottom; y++)
            {
                pointArray[arrayIndex++] = new Point(x, y);
            }
        }
    }

    return pointArray;
}


File.Delete(dataDir + "result.png");
File.Delete(dataDir + "result2.png");
File.Delete(dataDir + "result3.png");
File.Delete(dataDir + "result4.png");
File.Delete(dataDir + "result5.png");
File.Delete(dataDir + "result6.png");

Tangkapan layar berikut menunjukkan gambar input dan output.

Penyembunyian otomatis berulang untuk menghapus latar belakang

Masking Otomatis Potong Grafik dengan Data Objek Asumsi Tertentu

Dalam teknik ini, data objek asumsi tertentu digunakan di properti AssumedObjects dari AutoMaskingGraphCutOptions, yang digunakan dalam iterasi masking berikutnya. Cuplikan kode berikut menunjukkan cara menggunakan masking otomatis pemotongan grafik dengan satu objek yang diasumsikan untuk menghapus latar belakang gambar.

using Aspose.Imaging;
using Aspose.Imaging.FileFormats.Png;
using Aspose.Imaging.ImageOptions;
using Aspose.Imaging.Masking;
using Aspose.Imaging.Masking.Options;
using Aspose.Imaging.Masking.Result;
using Aspose.Imaging.Sources;
using System;
using System.Collections.Generic;
using System.IO;

string templatesFolder = @"c:\Users\USER\Downloads\templates\";
string dataDir = templatesFolder;

// Untuk meningkatkan hasil masking, data objek spesifik yang harus disertakan dalam hasil masking latar depan dapat disediakan.
List<AssumedObjectData> assumedObjects = new List<AssumedObjectData>();
// Jenis objek dan area yang berisi objek tersebut harus ditentukan.
assumedObjects.Add(new AssumedObjectData(DetectedObjectType.Human, new Rectangle(0, 0, 256, 365)));

MaskingResult results;
using (RasterImage image = (RasterImage)Image.Load(dataDir + "couple.jpg"))
{
    // Untuk menggunakan Pemotongan Grafik dengan goresan yang dihitung secara otomatis, AutoMaskingGraphCutOptions digunakan.
    AutoMaskingGraphCutOptions options = new AutoMaskingGraphCutOptions
    {
        AssumedObjects = assumedObjects,
        // Menunjukkan bahwa perhitungan baru dari goresan default harus dilakukan selama dekomposisi gambar.
        CalculateDefaultStrokes = true,
        // Mengatur radius penghalusan pasca proses berdasarkan ukuran gambar.
        FeatheringRadius = (Math.Max(image.Width, image.Height) / 500) + 1,
        Method = SegmentationMethod.GraphCut,
        Decompose = false,
        ExportOptions =
                                                        new PngOptions()
                                                        {
                                                            ColorType = PngColorType.TruecolorWithAlpha,
                                                            Source = new FileCreateSource(dataDir + "result.png")
                                                        },
        BackgroundReplacementColor = Color.Transparent
    };

    results = new ImageMasking(image).Decompose(options);

    // Menyimpan hasil masking akhir.
    using (RasterImage resultImage = (RasterImage)results[1].GetImage())
    {
        resultImage.Save(dataDir + "result2.png", new PngOptions() { ColorType = PngColorType.TruecolorWithAlpha });
    }
}



File.Delete(dataDir + "result.png");
File.Delete(dataDir + "result2.png");

Tangkapan layar berikut menunjukkan gambar input dan output.

Masking Otomatis Potong Grafik dengan Objek yang Diasumsikan

Penghapusan Latar Belakang Gambar menggunakan Masking Manual

Jika Anda tidak tertarik dengan penyembunyian otomatis, Anda dapat menggunakan metode penyembunyian manual untuk menghapus latar belakang dari gambar. Cuplikan kode berikut menunjukkan cara menerapkan penyembunyian manual pada gambar raster untuk menghapus latar belakangnya.

using Aspose.Imaging;
using Aspose.Imaging.FileFormats.Png;
using Aspose.Imaging.ImageOptions;
using Aspose.Imaging.Masking;
using Aspose.Imaging.Masking.Options;
using Aspose.Imaging.Masking.Result;
using Aspose.Imaging.Shapes;
using Aspose.Imaging.Sources;
using System.IO;

string templatesFolder = @"c:\Users\USER\Downloads\templates\";
string dataDir = templatesFolder;

string sourceFileName = dataDir + "couple.png";
GraphicsPath manualMask = new GraphicsPath();
Figure firstFigure = new Figure();
firstFigure.AddShape(new EllipseShape(new RectangleF(100, 30, 40, 40)));
firstFigure.AddShape(new RectangleShape(new RectangleF(10, 200, 50, 30)));
manualMask.AddFigure(firstFigure);
GraphicsPath subPath = new GraphicsPath();
Figure secondFigure = new Figure();
secondFigure.AddShape(
    new PolygonShape(
     new PointF[]
     {
         new PointF(310, 100), new PointF(350, 200), new PointF(250, 200)

     }, true));

secondFigure.AddShape(new PieShape(new RectangleF(10, 10, 80, 80), 30, 120));
subPath.AddFigure(secondFigure);
manualMask.AddPath(subPath);
using (RasterImage image = (RasterImage)Image.Load(sourceFileName))
{
    MaskingOptions maskingOptions = new MaskingOptions()
    {
        Method = SegmentationMethod.Manual,
        Args = new ManualMaskingArgs
        {
            Mask = manualMask
        },
        Decompose = false,
        ExportOptions =
      new PngOptions()
      {
          ColorType = PngColorType.TruecolorWithAlpha,
          Source = new StreamSource(new MemoryStream())
      },
    };
    MaskingResult results = new ImageMasking(image).Decompose(maskingOptions);
    // Menyimpan hasil masking akhir.
    using (RasterImage resultImage = (RasterImage)results[1].GetImage())
    {
        resultImage.Save(dataDir + "result.png", new PngOptions() { ColorType = PngColorType.TruecolorWithAlpha });
    }
}       

File.Delete(dataDir + "result.png");

Tangkapan layar berikut menunjukkan gambar input dan output.

Masking Manual untuk Penghapusan Latar Belakang

Dapatkan API Penghapus Latar Belakang Gambar C#

Anda bisa mendapatkan lisensi sementara gratis dan menggunakan perpustakaan pengeditan gambar dan penghapusan latar belakang kami tanpa batasan apa pun.

Kesimpulan

Menghapus latar belakang dari gambar adalah keterampilan penting dalam pengeditan dan desain gambar. Aspose.Imaging for .NET memungkinkan pengembang menghapus latar belakang gambar secara tepat di aplikasi C#. Entri blog ini membahas dasar-dasar memuat gambar, menerapkan penghapusan latar belakang menggunakan berbagai metode penyembunyian otomatis dan manual, dan menyimpan gambar keluaran.

Dengan mengintegrasikan Aspose.Imaging ke dalam proyek C#, Anda dapat menyederhanakan alur kerja pemrosesan gambar dan membuka tingkat kreativitas baru dalam aplikasi Anda. Bereksperimenlah dengan berbagai fitur dan teknik untuk menemukan potensi penuh Aspose.Imaging for .NET. Juga, sampaikan pertanyaan Anda kepada kami melalui forum kami.

Lihat juga