Рабочий процесс векторизации изображения – .NET

Aspose.SVG предлагает бесплатный онлайн Векторизатор изображений, работающий на любой платформе. Используя это приложение, вы можете применить набор опций для получения идеального результата. Сэкономьте свое время и воспользуйтесь этим бесплатным векторизатором изображений, чтобы получить все преимущества векторной графики!

Text “Баннер для Векторизатор изображений”

Что такое векторизация изображения?

Задача векторизации – преобразовать 2D-изображение в 2D-векторное представление изображения. Двумерная векторная графика представляет собой изображения компьютерной графики, представленные в виде математических кривых. Такие векторные изображения определяются как декартовы точки, соединенные линиями и кривыми для формирования необходимых фигур. Растровое изображение представляет собой набор пикселей. Если это изображение RGB, его можно представить в виде таблицы цветных пикселей. Каждый пиксель представляет собой тройку 8-битных целочисленных значений, где каждое значение представляет количество красного, зеленого и синего цвета.

Векторизация изображений – это процесс преобразования растровых изображений в векторную графику – кривые Безье, сплайны и линии.

Исходное изображение для преобразования растрового изображения в векторное может принимать такие растровые форматы, как JPG, TIFF, BMP, GIF и PNG. Выходное изображение представляет собой файл векторного формата, например, формат файла SVG. Для векторизации подходят такие изображения, как карты, значки, логотипы, технические чертежи и картинки. Эти изображения основаны на геометрических фигурах и нарисованы простыми кривыми.

Для чего нужна векторизация изображений?

Масштабирование и размер. Растровые изображения основаны на пикселях, поэтому они зависят от разрешения. Качество изображения зависит от количества пикселей, составляющих изображение, и значения разрешения, которое определяет, сколько пикселей отображается на дюйм. Следовательно, чем больше пикселей в изображении и чем выше разрешение, тем выше качество изображения. Например, масштабирование растрового изображения для его увеличения без изменения разрешения приведет к потере качества и появлению размытых или пиксельных изображений. Это связано с тем, что пиксели растягиваются на большую площадь, что делает их менее резкими. В отличие от растровой графики, векторные изображения можно изменять по размеру и масштабировать без потери качества, и они по-прежнему будут отображаться так же четко. Другими словами, векторная графика имеет уникальное преимущество перед растровой графикой, заключающееся в том, что точки, линии и кривые можно масштабировать вверх или вниз без потери качества.

Безопасность и конфиденциальность. Иногда необходимо защитить изображения от методов распознавания изображений, таких как распознавание лиц. Векторизованные изображения более устойчивы к таким атакам, поскольку распознаватели изображений обычно ориентированы на пиксели.

Восстановление изображений. Векторизацию можно использовать для обновления или восстановления изображений.

Процесс векторизации изображения

Процесс векторизации изображения включает в себя следующие этапы:

Квантование цвета и изменение размера. Квантование цвета или квантование цветного изображения – это квантование, применяемое к цветовым пространствам. Это процесс, который уменьшает количество различных цветов, используемых в изображении, с целью сделать новое изображение максимально визуально похожим на исходное изображение. В нашем процессе векторизации изображений квантование цвета играет важную роль, поскольку оно уменьшает количество используемых цветов, которые существенно влияют на размер и качество векторизованного SVG. Если изображение огромно или содержит множество маленьких пятен или пикселей одинакового цвета, мы изменяем его размер, чтобы документ SVG не был слишком большим.

Трассировка контуров. Трассировка контуров или трассировка границ – это метод, который применяется к цифровым изображениям для выделения их границы или границ для немонохромных изображений. Существует несколько таких методов, таких как Сузуки-Абе, сосед Мура, алгоритм квадратичной трассировки, алгоритм Тео Павлидиса и т. д. К сожалению, эти алгоритмы работают с монохромными изображениями и неоптимально с многоцветными изображениями. Поэтому мы разработали новый алгоритм отслеживания контуров, который быстро и точно работает с многоцветными изображениями и значительно сокращает количество контуров.

Сглаживание трассировки (этот шаг не является обязательным). Иногда фрагменты контуров выглядят как пилообразные волны из-за недостаточно высокого разрешения векторизованных изображений или наличия шума на изображении. Для сглаживания этих кривых можно использовать множество подходов, таких как локальная линейная регрессия, локальная полиномиальная регрессия, ядро ​​Гаусса и т. д. Мы обнаружили, что идеальных результатов можно достичь с помощью подхода ближайшего соседа, который был реализован в ImageTraceSmoother классе.

Упрощение трассировки (необязательно). На этом этапе необходимо преобразовать кривую трассировки, состоящую из сегментов прямых, в аналогичную кривую с меньшим количеством точек. Существуют различные алгоритмы, такие как Рамер-Дуглас-Пойкер, Висвалингам-Уятт, Ройманн-Виткам и т. д., которые можно использовать для решения этой задачи. Мы реализовали подход Рамера-Дугласа-Пойкера в классе ImageTraceSimplifier, поскольку в наших экспериментах он показал лучший результат, чем другие, но мы объявили интерфейс IImageTraceSimplifier для реализации любых других подходов.

Создание элементов пути SVG на основе трассировок. Последний шаг – преобразовать точки трассировки в линии пути SVG и кривые Безье и добавить их в документ SVG. Чтобы подогнать кривые, проходящие через каждую точку трассировки, мы используем сплайн Катмулла-Ромы, который преобразуется в кривые Безье.

Параметры векторизации

Вы можете преобразовать растровое изображение в векторную графику, используя параметры конфигурации по умолчанию или пользовательские. Вы сможете применить пользовательские настройки для получения наилучшего результата преобразования изображения в вектор и сохранить выходной файл SVG на свой компьютер. Обработка предполагает управление следующими свойствами:

PropertyDescription
ColorsLimitThis property gets or sets the maximum number of colors used to quantize an image. The default value is 25.
ImageSizeLimitGets or sets maximal dimension of an image determined by multiplication image width and height. The size of the image will be scaled based on this property. The default value is 1800000.
PathBuilderThis property sets the SVG path segments builder and affects how sharply the curve bends at the control points.
TraceSimplifierThe property sets the trace simplified. As a result, the trace curve will be built composed of line segments with fewer (or bigger) points.
TraceSmootherThis property sets the trace smoother. It is used to smooth out fragments of contours.

Пример С#

API Aspose.HTML предоставляет пространство имен ImageVectorization, которое реализует различные классы, позволяющие использовать набор алгоритмов для процесса векторизации изображений. Предоставленные классы и методы могут работать с несколькими вариантами векторизации для предварительной обработки изображений перед сохранением их в векторный формат.

Примечание. API Aspose.SVG предназначен для реализации задач векторизации изображений, поэтому исходное изображение для преобразования растрового изображения в векторное может принимать такие растровые форматы, как JPG, PNG , BMP, TIFF, GIF и т. д. Выходное изображение представляет собой файл векторного формата SVG.

Чтобы векторизовать изображение с помощью Aspose.SVG, вам необходимо выполнить несколько шагов:

  1. Инициализируйте экземпляр класса ImageVectorizer. Используйте один из конструкторов ImageVectorizer() и укажите свойства конфигурации.
  2. Векторизовать растровое изображение из указанного файла. Используйте метод Vectorize(), который возвращает SVGDocument.
  3. Сохраните SVGDocument (векторизованное изображение) как файл SVG.

Вот пример C# того, как векторизовать PNG-изображение с помощью API Aspose.SVG.

 1using System.IO;
 2using Aspose.Svg.ImageVectorization;
 3using Aspose.Svg.Saving;
 4...
 5
 6    // Initialize an instance of the ImageVectorizer class
 7    var vectorizer = new ImageVectorizer
 8    {
 9        // Optionally set configuration
10        Configuration =
11        {
12            // Optionally set path builder
13            PathBuilder = new BezierPathBuilder {
14            // Optionally set trace smoother
15            TraceSmoother = new ImageTraceSmoother(2),
16            },
17            ColorsLimit = 10,
18            LineWidth = 1
19        }
20    };
21    // Vectorize image from the specified file
22    using var document = vectorizer.Vectorize(Path.Combine(DataDir, "png-to-svg.png"));
23
24    // Save vectorized Image as SVG file 
25    document.Save(Path.Combine(OutputDir, "png-to-svg.svg"));

Посмотреть исходный файл и конечный результат можно по ссылкам – png-to-svg.png, png-to-svg.svg.

Описание и примеры C# вариантов векторизации, применяемых в статье Примеры векторизации изображений.

Пример реализации IImageTraceSimplifier

Пространство имен ImageVectorization включает интерфейсы IImageTraceSimplifier, IImageTraceSmoother и IPathBuilder для реализации любых ваших подходов и алгоритмов. Рассмотрим реализацию IImageTraceSimplifier на основе алгоритма Висвалингама:

  1	struct Point3
  2    {
  3        public float X { get; set; }
  4        public float Y { get; set; }
  5        public float? Z { get; set; }
  6        public Point3(float x, float y, float? z)
  7        {
  8            X = x;
  9            Y = y;
 10            Z = z;
 11        }
 12    }
 13
 14    internal class Visvalingam: IImageTraceSimplifier
 15    {
 16        Point3[] line;
 17        List<int> indizes;
 18        bool enriched;
 19        float tolerance;
 20
 21        public Visvalingam(float tolerance)
 22        {
 23            this.tolerance = tolerance;
 24        }
 25
 26        // Calculate the area of one triangle
 27        private float GetTriangleArea(Point3 a, Point3 b, Point3 c)
 28		{
 29            return Math.Abs((a.X * (b.Y - c.Y) + b.X * (c.Y - a.Y) + c.X * (a.Y - b.Y)) / 2f);
 30        }
 31
 32        // Add the area of the triangle to each point
 33        private float EnrichPoints()
 34		{
 35            var minArea = float.PositiveInfinity;
 36
 37            for (var i = 1; i < indizes.Count() - 1; i++)
 38            {
 39                var @this = indizes[i];
 40                var prev = indizes[i - 1];
 41                var next = indizes[i + 1];
 42
 43                var area = GetTriangleArea(line[prev], line[@this], line[next]);
 44
 45                // Reset minim value for area, if current is smaller than all previous
 46                if (area < minArea)
 47
 48                    minArea = area;
 49
 50                // Save the area of the triangle as 3rd coordinate
 51                // Replace if it does exist already
 52                line[@this].Z = area;
 53            }
 54            return minArea;
 55        }
 56
 57        // Check for the smallest triangles and remove corresponding points from the index
 58        private void RemoveSmallestAreaIndex(float minArea)
 59        {
 60            var newIndizes = new List<int>();
 61            newIndizes.Add(indizes[0]);
 62
 63            for (var i = 1; i < indizes.Count - 1; i++)
 64            {
 65                var index = indizes[i];
 66
 67                if (line[index].Z > minArea)
 68
 69                    newIndizes.Add(index);
 70            }
 71
 72            newIndizes.Add(indizes[indizes.Count - 1]);
 73            indizes = newIndizes;
 74
 75            // Return newIndizes
 76        }
 77
 78        // Do Visvalingam-Calculations until only start-& endpoint are left
 79        private void EnrichLineString()
 80        {
 81            while (indizes.Count > 2)
 82
 83                RemoveSmallestAreaIndex(EnrichPoints());
 84
 85            enriched = true;
 86        }
 87
 88        // Simplify a linestring corresponding to a given tolerance (depends on projection of data)
 89
 90        public IEnumerable<PointF> Simplify(IEnumerable<PointF> trace)
 91        {
 92            line = trace.Select(pt => new Point3(pt.X, pt.Y, null)).ToArray();
 93            indizes = line.Select((v, i) => i).ToList();
 94            enriched = false;
 95
 96            // It is enough to enrich the line once
 97            if (enriched == false)
 98
 99                EnrichLineString();
100
101            // Build the new line
102            return line.Where(p => p.Z != null && (p.Z > tolerance) || p.Z == null)
103
104                .Select(p => new PointF(p.X, p.Y));
105        }
106    }

Полные примеры C# и файлы данных можно загрузить с сайта GitHub. О загрузке с GitHub и запуске примеров вы узнаете из раздела Как запускать примеры.

Subscribe to Aspose Product Updates

Get monthly newsletters & offers directly delivered to your mailbox.