Görüntü Arka Planını Kaldır C#

Dijital içerik oluşturma ve işlemede, görüntülerden arka planı kaldırmak yaygın ve önemli bir görevdir. İster grafik tasarım, e-ticaret veya başka herhangi bir görsel proje üzerinde çalışıyor olun, nesneleri arka planlarından ayırma yeteneğine sahip olmak, yaratıcılığınızı genişletir. Bu blog yazısında, C#’ta programlı olarak görüntülerden arka planın nasıl kaldırılacağını inceleyeceğiz.

Görüntülerden Arka Planı Kaldırmak için C# Kitaplığı

Görüntülerden arka planı kaldırmak için, .NET uygulamaları için çok çeşitli görüntü işleme özellikleri sağlayan güçlü bir kitaplık olan Aspose.Imaging for .NET‘i kullanacağız. Çeşitli görüntü formatlarını destekler ve geliştiricilerin yeniden boyutlandırma, kırpma, döndürme ve elbette arka planları kolaylıkla kaldırma gibi işlemleri gerçekleştirmesine olanak tanır.

API’yi indirebilir veya NuGet’ten yükleyebilirsiniz.

PM> Install-Package Aspose.Imaging

C#’ta Otomatik Maskeleme ile Görüntü Arka Planını Kaldırma

Daha iyi arka plan kaldırma sonuçları elde etmek için otomatik maskeleme yöntemi tercih edilir. Amaç, ön plana ait pikselleri ve arka plana ait pikselleri doğru bir şekilde tanımlayan bir maske oluşturmaktır. Aspose.Imaging, aşağıdaki bölümlerde açıklandığı gibi, görüntüden arka planı kaldırmak için üç otomatik maskeleme tekniği sağlar.

Geçiş Yumuşatma ile Grafik Kesim Otomatik Maskeleme

Bu teknikte API, görüntü boyutuna göre geçiş yumuşatmayla görüntü maskeleme gerçekleştirir ve otomatik olarak hesaplanan varsayılan konturları kullanır. Aşağıdaki kod parçacığı, geçiş yumuşatmayla grafik kesme otomatik maskelemenin nasıl kullanılacağını gösterir. AutoMaskingGraphCutOptions‘ın Args özelliği, varsayılan konturların sonuna yerleştirildiği için atlanabilir.

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"))
{
    // Otomatik olarak hesaplanan vuruşlarla Grafik Kesimi kullanmak için AutoMaskingGraphCutOptions kullanılır.
    AutoMaskingGraphCutOptions options = new AutoMaskingGraphCutOptions
    {
        // Görüntü ayrıştırma sırasında varsayılan vuruşların yeni bir hesaplamasının yapılması gerektiğini belirtir.
        CalculateDefaultStrokes = true,
        // Görüntü boyutuna göre işlem sonrası geçiş yumuşatma yarıçapını ayarlama.
        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");

Aşağıdaki ekran görüntüsü giriş ve çıkış görüntülerini göstermektedir.

C #'da görüntü arka planını kaldırma

Tekrarlanan Otomatik Maskelemede Varsayılan Konturları Yeniden Kullanma

Bu teknikte görüntü maskeleme, otomatik olarak hesaplanan varsayılan konturlar kullanılarak yapılır, ancak API, yeni maskeleme yinelemesi için maskeleme seçeneklerini yeniden kullanır. Aşağıdaki kod parçacığında, varsayılan iki nesnenin verilerinin, AutoMaskingGraphCutOptions’ın AssumedObjects özelliğinde de belirtildiğini fark edebilirsiniz. İlk maskeleme sonuçlarının ardından, uygulanan arka plan/ön plan vuruşlarında ayarlamalar yapılır ve ardından maskeleme yinelemesi gerçekleştirilir.

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;

// Maskeleme sonuçlarını iyileştirmek için, ön plan maskeleme sonucuna dahil edilmesi gereken belirli nesnelere ilişkin veriler sağlanabilir.
List<AssumedObjectData> assumedObjects = new List<AssumedObjectData>();
// Nesne türü ve o nesneyi içeren alan belirtilmelidir.
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"))
{
    // Grafik Kesimini otomatik olarak hesaplanan vuruşlarla kullanmak için AutoMaskingGraphCutOptions kullanılır.
    options = new AutoMaskingGraphCutOptions
    {
        AssumedObjects = assumedObjects,
        // Görüntü ayrıştırma sırasında varsayılan vuruşların yeni bir hesaplamasının yapılması gerektiğini belirtir.
        CalculateDefaultStrokes = true,
        // Görüntü boyutuna göre işlem sonrası geçiş yumuşatma yarıçapını ayarlama.
        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();

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

        // Bu noktada uygulanan ön plan/arka plan vuruşları analiz edilebilir ve buna göre ilaveler yapılabilir. 
        // ön plan/arka plan vuruşları manuel olarak sağlanabilir.
        appliedBackgroundStrokes = options.DefaultBackgroundStrokes;
        appliedForegroundStrokes = options.DefaultForegroundStrokes;
        appliedObjectRectangles = options.DefaultObjectsRectangles;

        // AutoMaskingGraphCutOptions'ın yeniden kullanılması, varsayılan vuruş hesaplamalarını ikinci kez gerçekleştirmeye gerek yoktur.
        // AutoMaskingArgs'ın Args özelliğinde hem varsayılan konturlar hem de ObjectsPoints sağlandığında, Nokta dizileri birleştirilir.
        // İlk ObjectsPoints dizisi bir arka plan noktaları dizisi olarak kabul edilir ve 
        // ikinci ObjectsPoints dizisinin bir ön plan noktaları dizisi olduğu kabul edilir.
        // AutoMaskingArgs'ın Args özelliğinde hem DefaultObjectsRectangles hem de ObjectsRectangles sağlandığında, 
        // yalnızca Args'daki dizi kullanılıyor.
        AutoMaskingArgs newAutoMaskingArgs = new AutoMaskingArgs()
        {
            ObjectsPoints = new Point[][]
            {
                // Ek olarak kaldırılmasını istediğimiz alanları da belirtiyoruz.
                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 });
        }
    }
}
//Örnekler - grafik - kesme - tekrarlanan - maskeleme - ile - yeni noktalar.cs
// Maskeleme sonuçlarını iyileştirmek için, ön plan maskeleme sonucuna dahil edilmesi gereken belirli nesnelere ilişkin veriler sağlanabilir.
assumedObjects = new List<AssumedObjectData>();
// Nesne türü ve o nesneyi içeren alan belirtilmelidir.
assumedObjects.Add(new AssumedObjectData(DetectedObjectType.Human, new Rectangle(100, 100, 150, 300)));

// Otomatik olarak hesaplanan ön plan/arka plan fırça darbelerini elde etmek için ilk maskeleme yinelemesi gerçekleştirilir.
using (RasterImage image = (RasterImage)Image.Load(dataDir + "couple.jpg"))
{
    // Grafik Kesimini otomatik olarak hesaplanan vuruşlarla kullanmak için AutoMaskingGraphCutOptions kullanılır.
    options = new AutoMaskingGraphCutOptions
    {
        AssumedObjects = assumedObjects,
        // Görüntü ayrıştırma sırasında varsayılan vuruşların yeni bir hesaplamasının yapılması gerektiğini belirtir.
        CalculateDefaultStrokes = true,
        // İşlem sonrası geçiş yumuşatma yarıçapını ayarlama.
        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);

    // Bu noktada uygulanan ön plan/arka plan vuruşları analiz edilebilir ve buna göre ilaveler yapılabilir. 
    // ön plan/arka plan vuruşları manuel olarak sağlanabilir.
    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 });
    }
}



// Manuel olarak seçilen yeni ön plan/arka plan noktalarının eklenmesiyle maskeleme kalitesinin daha da artırılması için ikinci maskeleme yinelemesi gerçekleştirilir.
using (RasterImage image = (RasterImage)Image.Load(dataDir + "couple.jpg"))
{
    // AutoMaskingGraphCutOptions'ın yeniden kullanılması, varsayılan vuruş hesaplamalarını ikinci kez gerçekleştirmeye gerek yoktur.
    options.CalculateDefaultStrokes = false;
    // AutoMaskingArgs'ın Args özelliğinde hem varsayılan konturlar hem de ObjectsPoints sağlandığında, Nokta dizileri birleştirilir.
    // İlk ObjectsPoints dizisi bir arka plan noktaları dizisi olarak kabul edilir ve 
    // ikinci ObjectsPoints dizisinin bir ön plan noktaları dizisi olduğu kabul edilir.
    // AutoMaskingArgs'ın Args özelliğinde hem DefaultObjectsRectangles hem de ObjectsRectangles sağlandığında, 
    // yalnızca Args'daki dizi kullanılıyor.
    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);

    // Nihai maskeleme sonucu kaydediliyor.
    using (RasterImage resultImage = (RasterImage)results[1].GetImage())
    {
        resultImage.Save(dataDir + "result6.png", new PngOptions() { ColorType = PngColorType.TruecolorWithAlpha });
    }
}



///<summary>
/// Belirtilen dikdörtgenlere ait tüm noktaları döndür.
///</summary>
///<param name="rectangles"> Dikdörtgenler dizisi.</param>
///<returns> Tüm dikdörtgen noktalar.</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");

Aşağıdaki ekran görüntüsü giriş ve çıkış görüntülerini göstermektedir.

Arka planı kaldırmak için tekrarlanan otomatik maskeleme

Belirtilen Varsayılan Nesne Verileriyle Grafik Kesim Otomatik Maskeleme

Bu teknikte, belirli bir varsayılan nesnenin verileri, sonraki maskeleme yinelemelerinde kullanılan AutoMaskingGraphCutOptions’ın AssumedObjects özelliğinde kullanılır. Aşağıdaki kod parçacığı, bir görüntünün arka planını kaldırmak için varsayılan bir nesneyle grafik kesme otomatik maskelemesinin nasıl kullanılacağını gösterir.

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;

// Maskeleme sonuçlarını iyileştirmek için, ön plan maskeleme sonucuna dahil edilmesi gereken belirli nesnelere ilişkin veriler sağlanabilir.
List<AssumedObjectData> assumedObjects = new List<AssumedObjectData>();
// Nesne türü ve o nesneyi içeren alan belirtilmelidir.
assumedObjects.Add(new AssumedObjectData(DetectedObjectType.Human, new Rectangle(0, 0, 256, 365)));

MaskingResult results;
using (RasterImage image = (RasterImage)Image.Load(dataDir + "couple.jpg"))
{
    // Otomatik olarak hesaplanan vuruşlarla Grafik Kesimi kullanmak için AutoMaskingGraphCutOptions kullanılır.
    AutoMaskingGraphCutOptions options = new AutoMaskingGraphCutOptions
    {
        AssumedObjects = assumedObjects,
        // Görüntü ayrıştırma sırasında varsayılan vuruşların yeni bir hesaplamasının yapılması gerektiğini belirtir.
        CalculateDefaultStrokes = true,
        // Görüntü boyutuna göre işlem sonrası geçiş yumuşatma yarıçapını ayarlama.
        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);

    // Nihai maskeleme sonucu kaydediliyor.
    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");

Aşağıdaki ekran görüntüsü giriş ve çıkış görüntülerini göstermektedir.

Varsayılan Nesneyle Grafik Kesim Otomatik Maskeleme

Manuel Maskelemeyi Kullanarak Görüntü Arka Planını Kaldırma

Otomatik maskeleme ile ilgilenmiyorsanız görsellerden arka planı kaldırmak için manuel maskeleme yöntemini kullanabilirsiniz. Aşağıdaki kod parçacığı, arka planını kaldırmak için taramalı görüntüye manuel maskelemenin nasıl uygulanacağını gösterir.

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);
    // Nihai maskeleme sonucu kaydediliyor.
    using (RasterImage resultImage = (RasterImage)results[1].GetImage())
    {
        resultImage.Save(dataDir + "result.png", new PngOptions() { ColorType = PngColorType.TruecolorWithAlpha });
    }
}       

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

Aşağıdaki ekran görüntüsü giriş ve çıkış görüntülerini göstermektedir.

Arka Planı Kaldırmak için Manuel Maskeleme

C# Görüntü Arka Plan Sökücü API’sini edinin

Ücretsiz bir geçici lisans alabilir ve resim düzenleme ve arka plan kaldırma kitaplığımızı hiçbir sınırlama olmaksızın kullanabilirsiniz.

Çözüm

Resimlerden arka planları kaldırmak, resim düzenleme ve tasarımda çok önemli bir beceridir. Aspose.Imaging for .NET, geliştiricilerin C# uygulamalarındaki görüntülerden arka planları hassas bir şekilde kaldırmasına olanak tanır. Bu blog yazısında görsellerin yüklenmesi, farklı otomatik ve manuel maskeleme yöntemleri kullanılarak arka planın kaldırılması ve çıktı görselinin kaydedilmesi ile ilgili temel bilgiler yer alıyordu.

Aspose.Imaging’i C# projelerinize entegre ederek görüntü işleme iş akışını kolaylaştırabilir ve uygulamalarınızda yeni bir yaratıcılık düzeyinin kilidini açabilirsiniz. Aspose.Imaging for .NET’in tam potansiyelini keşfetmek için farklı özellikler ve teknikler ile denemeler yapın. Ayrıca sorularınızı forum aracılığıyla bizimle paylaşın.

Ayrıca bakınız