ลบพื้นหลังรูปภาพ C#

ในการสร้างและจัดการเนื้อหาดิจิทัล การลบพื้นหลังออกจากรูปภาพถือเป็นงานทั่วไปและจำเป็น ไม่ว่าคุณจะทำงานเกี่ยวกับการออกแบบกราฟิก อีคอมเมิร์ซ หรือโปรเจ็กต์ภาพอื่นๆ ความสามารถในการแยกวัตถุออกจากพื้นหลังจะช่วยเพิ่มความคิดสร้างสรรค์ของคุณ ในบล็อกโพสต์นี้ เราจะสำรวจวิธีลบพื้นหลังออกจากรูปภาพโดยทางโปรแกรมใน C#

ไลบรารี C # เพื่อลบพื้นหลังออกจากรูปภาพ

หากต้องการลบพื้นหลังออกจากรูปภาพ เราจะใช้ Aspose.Imaging for .NET - ไลบรารีอันทรงพลังที่ให้คุณสมบัติการประมวลผลรูปภาพที่หลากหลายสำหรับแอปพลิเคชัน .NET รองรับรูปแบบรูปภาพที่หลากหลาย และช่วยให้นักพัฒนาสามารถดำเนินการต่างๆ เช่น การปรับขนาด การครอบตัด การหมุน และแน่นอนว่าการลบพื้นหลังได้อย่างง่ายดาย

คุณสามารถ ดาวน์โหลด API หรือติดตั้งจาก NuGet

PM> Install-Package Aspose.Imaging

การลบพื้นหลังรูปภาพด้วยการมาสก์อัตโนมัติใน C#

เพื่อให้ได้ผลลัพธ์การลบพื้นหลังที่ดีขึ้น ควรใช้วิธีมาสก์อัตโนมัติ เป้าหมายคือการสร้างมาสก์ที่ระบุพิกเซลที่อยู่เบื้องหน้าและพิกเซลที่อยู่ในพื้นหลังได้อย่างแม่นยำ Aspose.Imaging มีเทคนิคการมาสก์อัตโนมัติสามเทคนิคเพื่อลบพื้นหลังออกจากรูปภาพ ดังที่อธิบายไว้ในส่วนต่อไปนี้

กราฟคัทการมาสก์อัตโนมัติด้วยขนนก

ในเทคนิคนี้ API ทำการมาสก์รูปภาพด้วยขนนกตามขนาดรูปภาพ และใช้ลายเส้นเริ่มต้นที่คำนวณโดยอัตโนมัติ ข้อมูลโค้ดต่อไปนี้แสดงวิธีใช้การมาสก์อัตโนมัติแบบตัดกราฟด้วยขนนก คุณสมบัติ Args ของ AutoMaskingGraphCutOptions สามารถละเว้นได้ เนื่องจากจังหวะเริ่มต้นจะถูกวางไว้ที่ส่วนท้าย

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"))
{
    // หากต้องการใช้ Graph Cut กับจังหวะที่คำนวณอัตโนมัติ จะใช้ AutoMaskingGraphCutOptions
    AutoMaskingGraphCutOptions options = new AutoMaskingGraphCutOptions
    {
        // บ่งชี้ว่าควรทำการคำนวณจังหวะเริ่มต้นใหม่ในระหว่างการสลายตัวของรูปภาพ
        CalculateDefaultStrokes = true,
        // การตั้งค่ารัศมีขนนกหลังกระบวนการตามขนาดภาพ
        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");

ภาพหน้าจอต่อไปนี้แสดงรูปภาพอินพุตและเอาต์พุต

การลบพื้นหลังรูปภาพใน C#

นำจังหวะเริ่มต้นกลับมาใช้ใหม่ในการมาสก์อัตโนมัติซ้ำๆ

ในเทคนิคนี้ การมาสก์รูปภาพทำได้โดยใช้ลายเส้นเริ่มต้นที่คำนวณโดยอัตโนมัติ อย่างไรก็ตาม API จะนำตัวเลือกการมาสก์กลับมาใช้ซ้ำสำหรับการมาสก์ซ้ำครั้งใหม่ ในตัวอย่างโค้ดต่อไปนี้ คุณจะสังเกตได้ว่าข้อมูลของออบเจ็กต์ที่สันนิษฐานทั้งสองนั้นยังระบุอยู่ในคุณสมบัติ AssumedObjects ของ AutoMaskingGraphCutOptions หลังจากผลการมาสก์เบื้องต้น จะมีการปรับเปลี่ยนกับลายเส้นพื้นหลัง/เบื้องหน้าที่ใช้ และทำการมาสก์ซ้ำในภายหลัง

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;

// เพื่อปรับปรุงผลลัพธ์การมาสก์ สามารถให้ข้อมูลของออบเจ็กต์เฉพาะที่ควรรวมไว้ในผลลัพธ์การมาสก์เบื้องหน้าได้
List<AssumedObjectData> assumedObjects = new List<AssumedObjectData>();
// ควรระบุประเภทวัตถุและพื้นที่ที่มีวัตถุนั้น
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"))
{
    // หากต้องการใช้ Graph Cut กับจังหวะที่คำนวณอัตโนมัติ จะใช้ AutoMaskingGraphCutOptions
    options = new AutoMaskingGraphCutOptions
    {
        AssumedObjects = assumedObjects,
        // บ่งชี้ว่าควรทำการคำนวณจังหวะเริ่มต้นใหม่ในระหว่างการสลายตัวของรูปภาพ
        CalculateDefaultStrokes = true,
        // การตั้งค่ารัศมีขนนกหลังกระบวนการตามขนาดภาพ
        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();

        // กำลังบันทึกผลการมาสก์ระดับกลาง
        using (RasterImage resultImage = results[1].GetImage())
        {
            resultImage.Save(dataDir + "result2.png",
                new PngOptions() { ColorType = PngColorType.TruecolorWithAlpha });
        }

        // ณ จุดนี้ จะสามารถวิเคราะห์จังหวะพื้นหน้า/พื้นหลังที่ใช้และอิงเพิ่มเติมได้ 
        // สามารถระบุจังหวะพื้นหน้า/พื้นหลังได้ด้วยตนเอง
        appliedBackgroundStrokes = options.DefaultBackgroundStrokes;
        appliedForegroundStrokes = options.DefaultForegroundStrokes;
        appliedObjectRectangles = options.DefaultObjectsRectangles;

        // การใช้ AutoMaskingGraphCutOptions อีกครั้ง ไม่จำเป็นต้องคำนวณเส้นขีดเริ่มต้นเป็นครั้งที่สอง
        // เมื่อมีการระบุทั้งจังหวะเริ่มต้นและ ObjectsPoints ในคุณสมบัติ Args ของ AutoMaskingArgs อาร์เรย์ของ Point จะถูกรวมเข้าด้วยกัน
        // อาร์เรย์ ObjectsPoints แรกถือเป็นอาร์เรย์จุดพื้นหลังและ 
        // อาร์เรย์ ObjectsPoints ที่สองถือเป็นอาร์เรย์จุดเบื้องหน้า
        // เมื่อมีการระบุทั้ง DefaultObjectsRectangles และ ObjectsRectangles ในคุณสมบัติ Args ของ AutoMaskingArgs 
        // มีการใช้เฉพาะอาร์เรย์จาก Args เท่านั้น
        AutoMaskingArgs newAutoMaskingArgs = new AutoMaskingArgs()
        {
            ObjectsPoints = new Point[][]
            {
                // ระบุพื้นที่ที่เราต้องการลบเพิ่มเติม
                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 });
        }
    }
}
//ตัวอย่าง - กราฟ - ตัด - ซ้ำ - กำบัง - ด้วย - ใหม่ - point.cs
// เพื่อปรับปรุงผลลัพธ์การมาสก์ สามารถให้ข้อมูลของออบเจ็กต์เฉพาะที่ควรรวมไว้ในผลลัพธ์การมาสก์เบื้องหน้าได้
assumedObjects = new List<AssumedObjectData>();
// ควรระบุประเภทวัตถุและพื้นที่ที่มีวัตถุนั้น
assumedObjects.Add(new AssumedObjectData(DetectedObjectType.Human, new Rectangle(100, 100, 150, 300)));

// การมาสก์ซ้ำครั้งแรกจะดำเนินการเพื่อรับฝีแปรงส่วนหน้า/พื้นหลังที่คำนวณโดยอัตโนมัติ
using (RasterImage image = (RasterImage)Image.Load(dataDir + "couple.jpg"))
{
    // หากต้องการใช้ Graph Cut กับจังหวะที่คำนวณอัตโนมัติ จะใช้ AutoMaskingGraphCutOptions
    options = new AutoMaskingGraphCutOptions
    {
        AssumedObjects = assumedObjects,
        // บ่งชี้ว่าควรทำการคำนวณจังหวะเริ่มต้นใหม่ในระหว่างการสลายตัวของรูปภาพ
        CalculateDefaultStrokes = true,
        // การตั้งค่ารัศมีขนนกหลังกระบวนการ
        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);

    // ณ จุดนี้ จะสามารถวิเคราะห์จังหวะพื้นหน้า/พื้นหลังที่ใช้และอิงเพิ่มเติมได้ 
    // สามารถระบุจังหวะพื้นหน้า/พื้นหลังได้ด้วยตนเอง
    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 });
    }
}



// การมาสก์ซ้ำครั้งที่สองจะดำเนินการเพื่อปรับปรุงคุณภาพการมาสก์เพิ่มเติมโดยการเพิ่มจุดพื้นหน้า/พื้นหลังที่เลือกด้วยตนเองใหม่
using (RasterImage image = (RasterImage)Image.Load(dataDir + "couple.jpg"))
{
    // การใช้ AutoMaskingGraphCutOptions อีกครั้ง ไม่จำเป็นต้องคำนวณเส้นขีดเริ่มต้นเป็นครั้งที่สอง
    options.CalculateDefaultStrokes = false;
    // เมื่อมีการระบุทั้งจังหวะเริ่มต้นและ ObjectsPoints ในคุณสมบัติ Args ของ AutoMaskingArgs อาร์เรย์ของ Point จะถูกรวมเข้าด้วยกัน
    // อาร์เรย์ ObjectsPoints แรกถือเป็นอาร์เรย์จุดพื้นหลังและ 
    // อาร์เรย์ ObjectsPoints ที่สองถือเป็นอาร์เรย์จุดเบื้องหน้า
    // เมื่อมีการระบุทั้ง DefaultObjectsRectangles และ ObjectsRectangles ในคุณสมบัติ Args ของ AutoMaskingArgs 
    // มีการใช้เฉพาะอาร์เรย์จาก Args เท่านั้น
    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);

    // กำลังบันทึกผลการมาสก์ขั้นสุดท้าย
    using (RasterImage resultImage = (RasterImage)results[1].GetImage())
    {
        resultImage.Save(dataDir + "result6.png", new PngOptions() { ColorType = PngColorType.TruecolorWithAlpha });
    }
}



///<summary>
/// คืนคะแนนทั้งหมดที่เป็นของสี่เหลี่ยมที่ระบุ
///</summary>
///<param name="rectangles"> อาร์เรย์ของสี่เหลี่ยม</param>
///<returns> จุดสี่เหลี่ยมทั้งหมด</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");

ภาพหน้าจอต่อไปนี้แสดงรูปภาพอินพุตและเอาต์พุต

การมาสก์อัตโนมัติซ้ำๆ เพื่อลบพื้นหลัง

การมาสก์กราฟตัดอัตโนมัติด้วยข้อมูลวัตถุที่ระบุ

ในเทคนิคนี้ ข้อมูลของออบเจ็กต์ที่สันนิษฐานเฉพาะเจาะจงจะถูกใช้ในคุณสมบัติ AssumedObjects ของ AutoMaskingGraphCutOptions ซึ่งใช้ในการมาสก์ซ้ำครั้งต่อๆ ไป ข้อมูลโค้ดต่อไปนี้แสดงวิธีใช้การมาสก์อัตโนมัติแบบตัดกราฟด้วยวัตถุสมมุติเพื่อลบพื้นหลังของรูปภาพ

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;

// เพื่อปรับปรุงผลลัพธ์การมาสก์ สามารถให้ข้อมูลของออบเจ็กต์เฉพาะที่ควรรวมไว้ในผลลัพธ์การมาสก์เบื้องหน้าได้
List<AssumedObjectData> assumedObjects = new List<AssumedObjectData>();
// ควรระบุประเภทวัตถุและพื้นที่ที่มีวัตถุนั้น
assumedObjects.Add(new AssumedObjectData(DetectedObjectType.Human, new Rectangle(0, 0, 256, 365)));

MaskingResult results;
using (RasterImage image = (RasterImage)Image.Load(dataDir + "couple.jpg"))
{
    // หากต้องการใช้ Graph Cut กับจังหวะที่คำนวณอัตโนมัติ จะใช้ AutoMaskingGraphCutOptions
    AutoMaskingGraphCutOptions options = new AutoMaskingGraphCutOptions
    {
        AssumedObjects = assumedObjects,
        // บ่งชี้ว่าควรทำการคำนวณจังหวะเริ่มต้นใหม่ในระหว่างการสลายตัวของรูปภาพ
        CalculateDefaultStrokes = true,
        // การตั้งค่ารัศมีขนนกหลังกระบวนการตามขนาดภาพ
        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");

ภาพหน้าจอต่อไปนี้แสดงรูปภาพอินพุตและเอาต์พุต

กราฟตัดการปิดบังอัตโนมัติด้วยวัตถุที่สันนิษฐาน

การลบพื้นหลังรูปภาพโดยใช้การปิดบังด้วยตนเอง

หากคุณไม่สนใจการมาสก์อัตโนมัติ คุณสามารถใช้วิธีการมาสก์ด้วยตนเองเพื่อลบพื้นหลังออกจากรูปภาพได้ ข้อมูลโค้ดต่อไปนี้แสดงวิธีใช้การมาสก์ด้วยตนเองกับภาพแรสเตอร์เพื่อลบพื้นหลัง

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);
    // กำลังบันทึกผลการมาสก์ขั้นสุดท้าย
    using (RasterImage resultImage = (RasterImage)results[1].GetImage())
    {
        resultImage.Save(dataDir + "result.png", new PngOptions() { ColorType = PngColorType.TruecolorWithAlpha });
    }
}       

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

ภาพหน้าจอต่อไปนี้แสดงรูปภาพอินพุตและเอาต์พุต

การมาสก์ด้วยตนเองสำหรับการลบพื้นหลัง

รับ API ตัวลบพื้นหลังรูปภาพ C

คุณสามารถ รับใบอนุญาตชั่วคราวฟรี และใช้ไลบรารีการแก้ไขรูปภาพและการลบพื้นหลังของเราได้โดยไม่มีข้อจำกัดใดๆ

บทสรุป

การลบพื้นหลังออกจากรูปภาพเป็นทักษะสำคัญในการแก้ไขและออกแบบรูปภาพ Aspose.Imaging for .NET ช่วยให้นักพัฒนาสามารถลบพื้นหลังออกจากรูปภาพในแอปพลิเคชัน C# ได้อย่างแม่นยำ โพสต์ในบล็อกนี้ครอบคลุมถึงพื้นฐานของการโหลดภาพ การนำการลบพื้นหลังออกโดยใช้วิธีการต่างๆ ของการมาสก์แบบอัตโนมัติและแบบแมนนวล และการบันทึกภาพที่ส่งออก

ด้วยการผสานรวม Aspose.Imaging เข้ากับโปรเจ็กต์ C# ของคุณ คุณสามารถปรับปรุงเวิร์กโฟลว์การประมวลผลรูปภาพและปลดล็อกความคิดสร้างสรรค์ระดับใหม่ในแอปพลิเคชันของคุณ ทดลอง คุณสมบัติและเทคนิคต่างๆ เพื่อค้นหาศักยภาพทั้งหมดของ Aspose.Imaging for .NET แบ่งปันคำถามของคุณกับเราผ่านทาง ฟอรั่ม ของเรา

ดูสิ่งนี้ด้วย