mirror of
https://github.com/lleene/hugo-site.git
synced 2025-01-23 12:02:22 +01:00
162 lines
7.6 KiB
Markdown
162 lines
7.6 KiB
Markdown
|
---
|
|||
|
title: "Image Vectorization 🖇🍮"
|
|||
|
date: 2021-12-08T19:26:46+01:00
|
|||
|
draft: false
|
|||
|
toc: true
|
|||
|
tags:
|
|||
|
- svg
|
|||
|
- python
|
|||
|
- code
|
|||
|
- image
|
|||
|
---
|
|||
|
|
|||
|
|
|||
|
Automated vectorization and upscaling is useful in many scenarios particularly
|
|||
|
for drawn art that can be segmented and is generally structured using strokes
|
|||
|
and gradients. Here I will outline a methodology that is based around
|
|||
|
structural analysis and direct regression methods then evaluate error metrics
|
|||
|
for fine-tuning by comparing the output with non-vectorized up-scalers.
|
|||
|
|
|||
|
|
|||
|
## Observations
|
|||
|
|
|||
|
Regarding image segmentation, I suspect the most common approach is directly
|
|||
|
clustering the entire image using the colour and position. In
|
|||
|
most scenarios this feature-space will be separable and is a well understood
|
|||
|
problem statement. There result still poses some issues; first cluster enclosure
|
|||
|
is difficult to resolve (convexity is not guaranteed), second gradient
|
|||
|
components weaken the separability of the data. In addition we may need to
|
|||
|
sub-sample the image since clustering is computationally expensive given the
|
|||
|
mega-samples of image data.
|
|||
|
|
|||
|
## Outline
|
|||
|
|
|||
|
0. Coarse Analysis
|
|||
|
- Cluster based on colour-space and |∇×F| |∇·F| normalized components
|
|||
|
- Present image colour and segmentation complexity
|
|||
|
- Partition image in delta space using histogram method
|
|||
|
1. Pre-processing and edge thresholding
|
|||
|
- Compute the YCbCr equivalent representation
|
|||
|
- Map the input colour space based on k-means / SVM for maximum cluster separation
|
|||
|
- Compute edges in images and fit spline segments with grouping
|
|||
|
2. Fine image segmentation
|
|||
|
- Use edges to initialize segments and segment regions based on colour deltas
|
|||
|
- Complete segmentation by filling image
|
|||
|
- Regression to fit colour for each segment
|
|||
|
4. Image restructuring and grouping
|
|||
|
- Simplify structures by creating region hierarchy
|
|||
|
- SVG 2.0 supports mesh-gradients / Bezier surface composition
|
|||
|
- Detect regular patterns with auto correlation / parameter comparison
|
|||
|
3. Error evaluation and recalibration
|
|||
|
- Use upscaled reference to evaluate error
|
|||
|
- Identify segments that need to be restructured with more detail
|
|||
|
|
|||
|
|
|||
|
## Action Items
|
|||
|
|
|||
|
- Colour surface fitting
|
|||
|
- Given a set of samples, fit an appropriate colour gradient
|
|||
|
- Image normalization and pre-processing
|
|||
|
- Edge composition and image segmentation
|
|||
|
- Define a model for segments of the image
|
|||
|
- Define a model for closed and open edges
|
|||
|
- Evaluate segment coverage of the image
|
|||
|
- Heuristics for image hierarchy and optimizations
|
|||
|
|
|||
|
|
|||
|
## Pre-processing Engine
|
|||
|
|
|||
|
Currently histogram binning has proven to be very effective for generating
|
|||
|
initial clusters since it scales well with image size. This allows us to
|
|||
|
quickly gauge the complexity of an image in terms of content separability.
|
|||
|
These regions will be used to partition the image as edges are extracted
|
|||
|
before more accurate mapping is performed.
|
|||
|
|
|||
|
The main challenge here is colour gradients that washout what should be
|
|||
|
obvious centroids. Analysing the samples in batches can prevent this to some
|
|||
|
extent but a more robust approach is needed. We could use a localized grouping
|
|||
|
technique but accuracy may need be that important for this pre-processing step.
|
|||
|
Another technique is that the image can first be clustered using the histogram
|
|||
|
of derivative components followed by sub-classing a histogram for each gradient
|
|||
|
cluster.
|
|||
|
|
|||
|
This idea for histogram-binning is surprisingly efficiently for artificial
|
|||
|
images where the colour pallet is rich in features. A binary search for
|
|||
|
parameterizing the local maxima detection will very quickly segment a wide
|
|||
|
variety of images into 10 - 30 classifications.
|
|||
|
|
|||
|
## Edge extraction
|
|||
|
|
|||
|
At some point we will want to construct a model representing regions and shapes.
|
|||
|
The principle component here is identifying edges segmenting the image. Edge
|
|||
|
detection is relatively strait-forward as we only need look for extrema in the
|
|||
|
derivative components. In most scenarios this is actually quite noisy and
|
|||
|
it is not obvious how we should threshold for what is and what is not an edge.
|
|||
|
|
|||
|
Here we use the histogram-based clustering result for edge detection region to
|
|||
|
region transitions are discretized and no adaptive threshold is required.
|
|||
|
There will unavoidably be noisy regions where we see this boundary being spread
|
|||
|
out or possibly just a select few pixels appearing in some sub-section due to
|
|||
|
the clustering process. This can mostly be removed with a median filter if
|
|||
|
necessary.
|
|||
|
|
|||
|
If the initial segmentation are generated based on k-means in the colour space,
|
|||
|
two families of edges will be detected along segments: hard and soft edges.
|
|||
|
Hard edges will correspond to the intended edges seen in the image where as
|
|||
|
soft edges will arise due to the clustering technique. We can classify these
|
|||
|
two families by looking at the norm of the derivative component along such an
|
|||
|
edge. There will be more than one way to asses the correctness here but the
|
|||
|
significance here is that soft edges present boundary conditions during colour
|
|||
|
mapping while hard edges do not. Otherwise visual artefacts will arise are the
|
|||
|
interface of two segments that originally was a smooth transition.
|
|||
|
|
|||
|
|
|||
|
## Structural Variability
|
|||
|
|
|||
|
While we are targeting a-typical images for vectorization it is obvious that
|
|||
|
'sharpness' in the final result depends on a subjective style that is difficult
|
|||
|
to assess in terms of simple regress or interpolation. This problem however is
|
|||
|
central to upscaling algorithms so the methodology here will be that a external
|
|||
|
upscaling tool will guide the vectorization process. For example vectorizing
|
|||
|
a pixel-art image yields better results 'nearest-neighbour' methods opposed to
|
|||
|
Lanczos resampling.
|
|||
|
|
|||
|
|
|||
|
## Regression over SVG colour surfaces
|
|||
|
|
|||
|
The SVG standard supports three methods for specifying colour profiles or
|
|||
|
gradients: Flat, Linear, Radial. There are more advanced mechanisms through
|
|||
|
embedding or meshing multiple components the aforementioned three readily
|
|||
|
allow us to fit a first order colour contour through linear
|
|||
|
regression. This will be our first objective for parameterizing
|
|||
|
the colour for segments in our image. Another thing to note is that the gradient
|
|||
|
can be transformed after being parameterized. This means that the a circular
|
|||
|
gradient can be transformed to realize a family elliptical gradients.
|
|||
|
|
|||
|
Obviously this will not accommodate all colour contours that we find in images
|
|||
|
but in such scenarios we may adopt piece-wise approximations or more accurate
|
|||
|
masking of each component using the alpha channel. At some point we should
|
|||
|
also be able to resolve mixtures and decompose the contour from a non-linear
|
|||
|
or higher-order surface into multiple simpler contours. Again note that support
|
|||
|
for advanced colour profiles is not well supported so composition through
|
|||
|
these basic elements will yield the best support.
|
|||
|
|
|||
|
Using linear regression here with a second order polynomial kernel is a very
|
|||
|
efficient method for directly quantifying the focal point of the colour
|
|||
|
gradient if there is one.
|
|||
|
|
|||
|
|
|||
|
## Contour estimation
|
|||
|
|
|||
|
My initial attempt to estimate the contour given a set of points was based on
|
|||
|
using the convex-hull and recursively enclosing the outline in more detail
|
|||
|
by interpolating in between the current outline and finding the closest point
|
|||
|
orthogonal to the outline. This result yields a fast approximation of the
|
|||
|
enclosing outline without many requirements on the set of points other than
|
|||
|
having a dense outline. The drawback was that if it difficult to detect
|
|||
|
incorrect interpolation and only resolves the outline with pixel-level
|
|||
|
precision. If we pre-process the collection of points such that they
|
|||
|
represent detected edges at sub-pixel resolution the later draw-back can be
|
|||
|
addressed. Correctness or hypothesis testing could yield a more robust result
|
|||
|
at the cost of increased complexity.
|