ในการสร้างและจัดการเนื้อหาดิจิทัล การลบพื้นหลังออกจากรูปภาพถือเป็นงานทั่วไปและจำเป็น ไม่ว่าคุณจะทำงานเกี่ยวกับการออกแบบกราฟิก อีคอมเมิร์ซ หรือโปรเจ็กต์ภาพอื่นๆ ความสามารถในการแยกวัตถุออกจากพื้นหลังจะช่วยเพิ่มความคิดสร้างสรรค์ของคุณ ในบล็อกโพสต์นี้ เราจะสำรวจวิธีลบพื้นหลังออกจากรูปภาพโดยทางโปรแกรมใน 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");
ภาพหน้าจอต่อไปนี้แสดงรูปภาพอินพุตและเอาต์พุต
นำจังหวะเริ่มต้นกลับมาใช้ใหม่ในการมาสก์อัตโนมัติซ้ำๆ
ในเทคนิคนี้ การมาสก์รูปภาพทำได้โดยใช้ลายเส้นเริ่มต้นที่คำนวณโดยอัตโนมัติ อย่างไรก็ตาม 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 แบ่งปันคำถามของคุณกับเราผ่านทาง ฟอรั่ม ของเรา