ImageMagick Examples --
Resampling by Nicolas Robidoux
Index
The following has been provided by Nicolas
Robidoux, now a Senior Research Scientist at Phase One A/S. He has been of great help
in improving image processing in ImageMagick, especially the development of Cylindrical Filters as used by the EWA resampling
of the General Distortion Operator.
The following are his views on image filters and the best techniques to
either shrink (down sample) or enlarge (up sample) different types of
images for different requirements. Note that Nicolas is a very active
researcher, and as such the following views do change over time.
WARNING: Some of the techniques may only work with recent versions of
ImageMagick, and many of the filters do not (and may never) have
'named' filters within ImageMagick "
If you want to use one single filter for everything and would rather avoid complications like color space manipulations and fancy parameters, use the LanczosSharp EWA (Elliptical Weighted Averaging) Filter. It produces images that are slightly blurry, with no jaggies to speak of and reasonably mild halos.
The above command resizes by 200 percent, that is, it doubles the
width and height of the original image. Change "
For much sharper results, use the tensor (orthogonal or 2-pass resize) Lanczos Filter.
For certain types of images and operations, tensor Lanczos is
the default
EWA Lanczos Radius 3 (
EWA LanczosSharp, tensor Lanczos, and EWA Lanczos Radius 3 add two halo rings to sharp interfaces and lines. To make the second halo unnoticeable, use EWA Quadratic-windowed Jinc 3-lobe, nicknamed "QuadraticJinc". (One "fancy parameter" is needed to generate this filter.)
To eliminate the second halo completely, use the EWA Robidoux Filter.
Robidoux is the default
"
Mitchell is the default
If you do not want to introduce any halo, use the EWA Quadratic B-spline Filter.
The quadratic B-spline filter is quite blurry, although less so than
the better known, and even smoother, tensor cubic B-spline smoothing filter.
Here is a list of the above filters in decreasing order of sharpness (more is good) and halo (more is bad): tensor Lanczos (sharpest, with the most halo), EWA LanczosRadius, EWA LanczosSharp, EWA QuadraticJinc, tensor Mitchell, EWA Robidoux, and finally EWA Quadratic (very blurry, with no halo). Of course, halo and blur are not the whole story: Most importantly, there are also moiré, tonal drift and "jaggies" to worry about. If you are willing to add just one bell and whistle to your toolchain, it should be to downsample (shrink, or reduce) images through linear light. When downsampling (for example, making a thumbnail), you really should filter through the linear RGB or XYZ color spaces, as discussed in Colorspace Correction. Although this is less of an issue with blurry images and images without dense color patterns, not downsampling through linear light can cause great damage, as documented in Eric Brasseur's Gamma Error in Picture Scaling (which unfortunately presents outdated ImageMagick commands). On the other hand, I do not recommend upsampling (enlarging) through linear light. That is: You generally should not use standard linear light Colorspace Correction when enlarging images, at least when using filters with significant negative lobes (any filter that introduces haloing, which means most of them). Compare the RGB and XYZ (linear light) enlargements to the sRGB (not color corrected) and sigmoidized (custom color corrected) enlargements shown in the Enlarge with sRGB, RGB, LAB, LUV, XYZ, sigmoidal...? ImageMagick Forum thread. The linear light enlargements (RGB and XYZ) are almost always significantly worse. The sigmoidized elargements generally look best, although enlargements through Lab are sometimes even better. Enlargements through linear light often look so bad that you are better off ignoring color space issues and filtering sRGB pixel values directly (using commands like the above).
You would get nearly identical results with the built-in LanczosSharp
filter, which is obtained by replacing "
As discussed at the end of the Short Answer,
enlargements of sRGB images through linear RGB generally look worse
than enlargements that are performed by filtering sRGB pixel values
directly. In any case, you should omit the
two
The last three commands show how to use one single filter (my favorite
EWA LanczosSharp variant, specified by "
If you want sharper results, use sigmoidized EWA with another modified "Cylindrical Lanczos 3" filter, namely EWA Lanczos Radius 3.
The above command does not work with ImageMagick older than version
6.8.0-2. You can reproduce this EWA Lanczos Radius 3 by manually
setting the
The Blur Expert Control can be used to adjust
the sharpness of the scheme. Decreasing
If you want something even sharper, use a sigmoidized tensor (orthogonal or 2-pass resize) "Ginseng 3-lobe" filter.
"Ginseng" refers to "Jinc-windowed Sinc" filter: it is a pun based on
the similarity of the pronunciations of "Jinc-Sinc" and "Ginseng".
Unlike almost all EWA filters, as well as the commonly used
tensor Mitchell-Netravali
(
If the second halo of the above filters bothers you, try sigmoidized EWA Jinc 3-lobe windowed with quadratic B-spline ("QuadraticJinc").
You can eliminate the second halo completely using sigmoidized
If you do not want to add any haloing whatsoever, use sigmoidized EWA quadratic B-spline smoothing. It is blurry, but it strikes a pretty good balance between sharpness and jaggedness for a monotone filter. Because it is smoothing, higher values of the contrast are recommended.
If your image contains lines that are perfectly vertical or
horizontal, or contains synthetic linear color gradients, you may want
to use sigmoidized tensor quadratic
B-spline smoothing filter instead of the EWA version. The tensor
version is obtained by replacing "
If you want neither halos nor jaggies and are willing to live with a lot of blur, use sigmoidized EWA cubic B-spline smoothing.
Again, you may want to try the tensor
(
The same test image and enlargement ratio was used in the enlargement
section of the Filter Comparison.
First, enlargements performed with sigmoidization.
The
For sharper results, use linear light EWA Lanczos Radius 3.
You can increase sharpness by decreasing the
Tensor Lanczos is sharper than tensor
Ginseng but softer than tensor Cosine. They give similar results. I
actually prefer the Ginseng results, but many people want very sharp
results when downsampling. Recommending tensor Cosine is consistent
with this common preference. (Remember to use HDRI with such
Another annoying artifact is haloing (ringing). The above filters all have noticeable second halos. The following filter, EWA quadratic B-spline-windowed Jinc 3-lobe ("QuadraticJinc"), has a very mild second halo and yet manages fairly strong moiré suppression without being too blurry.
To eliminate the second halo completely, use linear light Robidoux EWA Filtering.
The Robidoux Filter is a member of
the Keys family of BC-splines. You can
dial the sharpness and haloing of the result by adjusting the B
parameter. "
From blurry (less halo) to sharp (more halo), the named Keys cubics
are Spline, Robidoux, Mitchell, RobidouxSharp, and CatRom. See
Cubic B,C Expert Controls for a table of the
B values of these filters. Without setting the B value, the named Keys
cubics can be obtained using
"
If you do not want any haloing, use linear light EWA or tensor Quadratic or Spline filtering (see the upsampling section). You may also get good results with linear light EWA Triangle filtering.
Linear light tensor Triangle (a.k.a. bilinear) is obtained by replacing
"
With the exception of EWA Triangle, tensor Triangle and EWA Lanczos3Sharpest, the above filters also work well when enlarging. (Tensor Triangle is actually recommended if you are enlarging just a little bit.) Adjusting the
Created: 10 October 2012
Updated: 21 October 2012
Author: Nicolas Robidoux, <nicolas.robidoux@gmail.com>
Formatting: Anthony Thyssen, <Anthony.Thyssen@gmail.com>
Examples Generated with:
URL:
ImageMagick Examples Preface and Index | |
Resampling Filters | |
-filter
" setting, so require the use
of Expert Filter Controls.
Short Answer
When resizing, I (Nicolas Robidoux) generally stick to either a tensor (orthogonal, or 2-pass) Resize (-resize
) Operator filter, or an EWA (Elliptical
Weighted Averaging) Distort
Resize (-distort Resize
) operator. Although the
filter kernels used with tensor and EWA operations are built using the
same families of mathematical functions, they give very different
results when used with -resize
and when used
with -distort Resize
.
If you want to use one single filter for everything and would rather avoid complications like color space manipulations and fancy parameters, use the LanczosSharp EWA (Elliptical Weighted Averaging) Filter. It produces images that are slightly blurry, with no jaggies to speak of and reasonably mild halos.
magick {input} -filter LanczosSharp -distort Resize 200% {output} |
200%
" to
the desired size specification.
In addition, "{input}
" and
"{output}
" should be replaced by the full names of
the original and resized images.
For much sharper results, use the tensor (orthogonal or 2-pass resize) Lanczos Filter.
magick {input} -filter Lanczos -resize 200% {output} |
-resize
filter and you can omit "-filter Lanczos
".
I do not recommend tensor (-resize
) Lanczos filtering
unless you use an HDRI Version of
ImageMagick. This has nothing to do with any flaw of the tensor
Lanczos filter. It has to do with the ImageMagick implementation of
tensor filters, which saves memory by clamping intermediate results as
a side effect of storing them into 8 or 16-bit unsigned integers (HDRI
saved them as doubles, so are unaffected). In other words, the generally
mild artifacts that arise when using tensor Lanczos without HDRI result
from an "engineering decision" that allows -resize
filters
to run significantly faster than EWA ones. The present recommendations
focus on quality, not speed.
(To find out whether you are running a Q8, Q16 or HDRI version of the
magick command, run magick -version
. If "HDRI" appears
somewhere in the output text message, it's HDRI. If "Q8" appears, it's
Q8. Otherwise, it's Q16, the most commonly installed version. If you
don't know what version you have installed, chances are it's
Q16.)
If you want something about as sharp as tensor Lanczos with a Q8
(8-bit) or Q16 (16-bit) ImageMagick, use EWA Lanczos Radius 3.
magick {input} -filter LanczosRadius -distort Resize 200% {output} |
-filter LanczosRadius
) is a recent
addition to ImageMagick (version 6.8.0-2). See the
Recommended Upsampling Methods (Enlarging)
section below for code (with one "fancy parameter") that reproduces
this filter with older ImageMagick releases.
EWA LanczosSharp, tensor Lanczos, and EWA Lanczos Radius 3 add two halo rings to sharp interfaces and lines. To make the second halo unnoticeable, use EWA Quadratic-windowed Jinc 3-lobe, nicknamed "QuadraticJinc". (One "fancy parameter" is needed to generate this filter.)
magick {input} -define filter:window=Quadratic -distort Resize 200% {output} |
To eliminate the second halo completely, use the EWA Robidoux Filter.
magick {input} -distort Resize 200% {output} |
-distort Resize
" filter. This is why the above command
does not contain "-filter Robidoux
".
With HDRI ImageMagick, I recommend tensor Mitchell (the Mitchell-Netravali filter) over EWA
Robidoux. Tensor Mitchell and EWA Robidoux are very similar. Although
both have no second halo, EWA Robidoux has less of it, and its halo is
"smoother". However, tensor Mitchell manages to be slightly sharper
without usually being more jaggy.
magick {input} -filter Mitchell -resize 200% {output} |
-resize
filter for some types of images and
operations. For this reason, "-filter Mitchell
" can
often be omitted.
If you do not want to introduce any halo, use the EWA Quadratic B-spline Filter.
magick {input} -filter Quadratic -distort Resize 200% {output} |
Here is a list of the above filters in decreasing order of sharpness (more is good) and halo (more is bad): tensor Lanczos (sharpest, with the most halo), EWA LanczosRadius, EWA LanczosSharp, EWA QuadraticJinc, tensor Mitchell, EWA Robidoux, and finally EWA Quadratic (very blurry, with no halo). Of course, halo and blur are not the whole story: Most importantly, there are also moiré, tonal drift and "jaggies" to worry about. If you are willing to add just one bell and whistle to your toolchain, it should be to downsample (shrink, or reduce) images through linear light. When downsampling (for example, making a thumbnail), you really should filter through the linear RGB or XYZ color spaces, as discussed in Colorspace Correction. Although this is less of an issue with blurry images and images without dense color patterns, not downsampling through linear light can cause great damage, as documented in Eric Brasseur's Gamma Error in Picture Scaling (which unfortunately presents outdated ImageMagick commands). On the other hand, I do not recommend upsampling (enlarging) through linear light. That is: You generally should not use standard linear light Colorspace Correction when enlarging images, at least when using filters with significant negative lobes (any filter that introduces haloing, which means most of them). Compare the RGB and XYZ (linear light) enlargements to the sRGB (not color corrected) and sigmoidized (custom color corrected) enlargements shown in the Enlarge with sRGB, RGB, LAB, LUV, XYZ, sigmoidal...? ImageMagick Forum thread. The linear light enlargements (RGB and XYZ) are almost always significantly worse. The sigmoidized elargements generally look best, although enlargements through Lab are sometimes even better. Enlargements through linear light often look so bad that you are better off ignoring color space issues and filtering sRGB pixel values directly (using commands like the above).
Quality Control
Use the Expert Filter Option "-define filter:verbose=1
" to make ImageMagick give
detailed information on the selected filter for a resize or distort
operation.
Do not use an IM Q8 (8-bit) version of ImageMagick with
Colorspace Correction
(-colorspace
),
or Sigmoidal Colorspace
(-sigmoidal-contrast
) resize techniques.
Do use a HDRI Version of IM when
using a tensor (2-pass) Resize
Operator (-resize
) with a filter with one or more negative
lobes. HDRI prevents internal clipping of "between resize passes"
intermediate values. This clipping leaves small artifacts, especially
when enlarging. HDRI is not necessary with the Triangle, Quadratic and
Spline filters, because they don't have negative
lobes. HDRI is also unnecessary with -distort Resize
.
Almost always downsample (shrink) through linear light (provided you
do not use a Q8 (8-bit) version of ImageMagick), and almost never
upsample (enlarge) through linear light. Working with the wrong
colorspace can have as much impact as a bad filter choice. (The real
solution may be to choose filters that work well with linear light
even when enlarging, but it is more expedient to change color
space.)
The chosen conversions into and out of linear RGB assume sRGB input
and output images. Other color spaces may require different
conversions (into and out of the XYZ color space, for example).
You may want to navigate color spaces using color profiles instead of
the built-in conversion utility (-colorspace
).
These recommendations have not been carefully checked with an active
transparency channel.
Detailed Answer
Downsampling (reducing the image's pixel count, for example, producing thumbnails) and upsampling (enlarging or, more generally, resampling without downsampling much) produce different artifact mixes. For this reason, different techniques are recommended for each type of geometrical operation.Recommended Upsampling Methods (Enlarging)
Results of resizing using the LanczosSharp EWA Filter through a Sigmoidized Colorspace are fairly artifact free, if a bit blurry. The built-in LanczosSharp, discussed in the Short Answer, works well, but I prefer a version with slightly less de-blur, obtained with the "-filter Lanczos -define filter:blur=.9891028367558475
".
magick {input} -colorspace RGB +sigmoidal-contrast 7.5 \ -filter Lanczos -define filter:blur=.9891028367558475 \ -distort Resize 500% \ -sigmoidal-contrast 7.5 -colorspace sRGB {output} |
-filter Lanczos -define
filter:blur=.9891028367558475
" by "-filter
LanczosSharp
".
"Sigmoidization" has to do with the pair
of Sigmoidal Contrast
operators. Basically, the
"+sigmoidal-contrast
" operator (with a "+
")
converts the linear RGB version of the image created
by -colorspace
RGB
to a custom RGB color space that has a S-shaped
"intensity curve" instead of a linear one. This "intensity curve" is
a bit like piecing together two sRGB gamma curves (one using negated
images) to make a symmetrical S curve. The
"-sigmoidal-contrast
" operator (with a "-
")
converts the result of filtering back to a normal linear RGB result,
which is converted back to the sRGB colorspace for the final
save.
You may decrease halos and increase perceptual sharpness by increasing
the sigmoidal contrast (up to 11.5, say). Higher contrasts are
especially recommended with greyscale images (even "false RGB
greyscale" that have three proportional color channels). The downside
of sigmoidization is that it sometimes produces "color bleed"
artifacts that look a bit like cheap flexographic ("gummidruck")
printing or chromatic aberration. In addition, sigmoidization's
"fattening" of extreme light and dark values may not work for your
image content. If such artifacts are obvious, push the contrast value
down from 7.5 (to 5, for example, or even lower). Setting the contrast
to 0 is equivalent to enlarging through linear RGB.
WARNING: The two sigmoidal contrast values must match. That is: If you
change the first "7.5" to "5", you must do the same with the second
"7.5" as well. Likewise, if you remove one of
the -colorspace
commands, also remove the other one
unless, of course, you actually intend to magick to another color
space. The commands shown in these recommendations assume that the
input and output color spaces are both sRGB.
You may skip sigmoidization altogether, by omitting the two
"+/-sigmoidal-contrast
" commands, in which case I recommend
converting into and out of the Lab color space instead of linear RGB.
magick {input} -colorspace Lab \ -filter Lanczos -define filter:blur=.9891028367558475 \ -distort Resize 500% -colorspace sRGB {output} |
-colorspace
commands is you use a Q8 version of
ImageMagick.
magick {input} -filter Lanczos -define filter:blur=.9891028367558475 \ -distort Resize 500% {output} |
-filter Lanczos -define
filter:blur=.9891028367558475 -distort Resize
") three different
ways, defined by the color space in which the "mixing of pixel values"
is done: sigmoidal, Lab, and sRGB. Every filter can be used
with every one of the recommended color spaces. In the remainder of
this section, I only show the sigmoidized version.
If you want sharper results, use sigmoidized EWA with another modified "Cylindrical Lanczos 3" filter, namely EWA Lanczos Radius 3.
magick {input} -colorspace RGB +sigmoidal-contrast 7.5 \ -filter LanczosRadius -distort Resize 500% \ -sigmoidal-contrast 7.5 -colorspace sRGB {output} |
blur
variable.
magick {input} -colorspace RGB +sigmoidal-contrast 7.5 \ -filter Lanczos -define filter:blur=.9264075766146068 \ -distort Resize 500% \ -sigmoidal-contrast 7.5 -colorspace sRGB {output} |
blur
increases
sharpness, mostly at the expense of increasing jaggies (when
downsampling, increasing moiré). Setting
"blur=.9264075766146068
" scales the EWA disc so it has a
radius equal to exactly 3, hence the name "EWA Lanczos Radius
3". (Setting "blur=.9812505644269356
" reproduces the
built-in EWA LanczosSharp filter.)
If you want something even sharper, use a sigmoidized tensor (orthogonal or 2-pass resize) "Ginseng 3-lobe" filter.
magick {input} -colorspace RGB +sigmoidal-contrast 7.5 \ -define filter:window=Jinc -define filter:lobes=3 \ -resize 500% -sigmoidal-contrast 7.5 -colorspace sRGB {output} |
Mitchell
) filter), the Ginseng tensor filter, like
the tensor Lanczos Filter, is
interpolatory, usually a good thing as far as sharpness is concerned.
With HDRI turned on, tensor Ginseng is actually recommended over EWA
Lanczos Radius 3.
If the second halo of the above filters bothers you, try sigmoidized EWA Jinc 3-lobe windowed with quadratic B-spline ("QuadraticJinc").
magick {input} -colorspace RGB +sigmoidal-contrast 7.5 \ -define filter:window=Quadratic -distort Resize 500% \ -sigmoidal-contrast 7.5 -colorspace sRGB {output} |
You can eliminate the second halo completely using sigmoidized
-distort Resize
and -resize
with Keys cubics. These filters are
discussed further in the downsampling section below. I recommend them
more for downsampling than upsampling. Nonetheless, they are easy to
adjust to taste, and give pretty good results. Start with tensor
Mitchell (-filter Mitchell -resize
) and EWA Robidoux
(-distort Resize
), and give a try to EWA RobidouxSharp
(-filter RobidouxSharp -distort Resize
) and tensor
Catmull-Rom (-filter CatRom -resize
) if you want
something sharper. (Only use -resize
with HDRI.)
If you do not want to add any haloing whatsoever, use sigmoidized EWA quadratic B-spline smoothing. It is blurry, but it strikes a pretty good balance between sharpness and jaggedness for a monotone filter. Because it is smoothing, higher values of the contrast are recommended.
magick {input} -colorspace RGB +sigmoidal-contrast 9.5 \ -filter Quadratic -distort Resize 500% \ -sigmoidal-contrast 9.5 -colorspace sRGB {output} |
-distort Resize
" by
"-resize
". It is blurrier, by a minuscule amount, than
the EWA one. Because it has no negative lobe, tensor Quadratic works
fine without HDRI.
If you want neither halos nor jaggies and are willing to live with a lot of blur, use sigmoidized EWA cubic B-spline smoothing.
magick {input} -colorspace RGB +sigmoidal-contrast 10.75 \ -filter Spline -distort Resize 500% \ -sigmoidal-contrast 10.75 -colorspace sRGB {output} |
-resize
) version; it preserves horizontal and
vertical features well, and is very slightly more blurry. It works
fine without HDRI.
Upsampling Examples
In this section, I show the results of enlarging a minuscule image produced by the following code, 10 times (from 10x6 to 100x60).magick -size 10x6 xc:grey20 +antialias \ -draw 'fill white line 4,0 5,5' line.png |
Point
enlargement, which uses nearest neighbor pixel
replication, is there to show the tiny 10x6 image, unprocessed. The
other filters are ordered based on the amount of halo and blur they
introduce.
Besides nearest neighbour (Point), the comparison includes four
interpolatory filters: tensor Cosine-windowed Sinc 3-lobe
a.k.a. Cosine (-filter Cosine -resize
), tensor
Sinc-windowed Sinc 3-lobe a.k.a. Lanczos (-filter Lanczos
-resize
), tensor Jinc-windowed Sinc 3-lobe a.k.a. Ginseng
(-define filter:window=Jinc -define filter:lobes=3
-resize
), and tensor filtering with the Catmull-Rom Keys
bicubic a.k.a. Catrom (-filter CatRom -resize
). The
interpolatory filters are among the sharpest and most jaggy, with deep
halos. Indeed, sharpness is approximately proportional to the amount
of haloing and jaggedness when using a high quality filter.
Here are the results of enlarging through the Lab color space (without
sigmoidization).
Here are the results of enlarging without the colorspace
and sigmoidal-contrast
commands, that is, filtering sRGB
pixel values directly. They are quite similar to the results of
enlarging through the Lab color space.
Finally, here are the results of enlarging through linear RGB (without
sigmoidization). Such results are the basis for the "don't enlarge
through linear light" recommendation.
Recommended Methods for Downsampling (Shrinking)
Basically, the filters recommended for upsampling are also recommended for downsampling. Downsampling, however, should almost always be done using a linear light Colorspace Correction technique. ImageMagick has two linear light color spaces built in: RGB and XYZ. With sRGB images, the RGB color space, which stands for linear RGB with sRGB primary colors in ImageMagick, is the obvious choice. In some situations (jarringly obvious dark halos, sharp images without dense pixel patterns), it may be preferable to use mild (contrast<4) sigmoidization. In general, however, you should stick to linear light downsampling. This is what is done in the remainder of this section. (Of course, downsample without color space conversions when using Q8 ImageMagick.) First, try downsizing through linear RGB with the LanczosSharp EWA Filter variant discussed in the upsampling section.magick {input} -colorspace RGB \ -filter Lanczos -define filter:blur=.9891028367558475 \ -distort Resize 20% -colorspace sRGB {output} |
magick {input} -colorspace RGB -filter LanczosRadius \ -distort Resize 20% -colorspace sRGB {output} |
blur
value.
For example, "blur=0.88549061701764
" generates a decent
strongly sharpening filter called "EWA Lanczos3Sharpest" in the
ImageMagick Forums and in Adam Turcotte's forthcoming Masters thesis.
Very sharp results are obtained with tensor
Cosine-windowed Sinc 3-lobe, a.k.a. Cosine
.
magick {input} -colorspace RGB -filter Cosine \ -resize 20% -colorspace sRGB {output} |
-resize
filters.)
You can decrease moiré by increasing the blur value, by
increasing the number of lobes, and/or by changing window function.
Increasing the blur value is safe, although it also decreases
sharpness. I generally do not recommend using more than three lobes,
because I do not like seeing more than two halos, and I find the
benefits of using more than four lobes to be small. This being said,
if your original image is blurry, the additional halos may be
invisible, and increasing the number of lobes may be worth a try.
I do not recommend changing window functions if you don't really know
what you are doing. (This being said, the Hann window function is a
solid general purpose window, and Parzen works well with four
lobes.)
Another annoying artifact is haloing (ringing). The above filters all have noticeable second halos. The following filter, EWA quadratic B-spline-windowed Jinc 3-lobe ("QuadraticJinc"), has a very mild second halo and yet manages fairly strong moiré suppression without being too blurry.
magick {input} -colorspace RGB -define filter:window=Quadratic \ -distort Resize 20% -colorspace sRGB {output} |
To eliminate the second halo completely, use linear light Robidoux EWA Filtering.
magick {input} -colorspace RGB \ -distort Resize 20% -colorspace sRGB {output} |
B=1.0
" reproduces EWA cubic B-spline
filtering, a halo-free but very blurry filter; "B=0.0
"
reproduces EWA Catmull-Rom filtering, a very strongly sharpening
filter; and linear light EWA Robidoux can be reproduced with the
following command.
magick {input} -colorspace RGB \ -filter Cubic -define filter:B=.37821575509399867 \ -distort Resize 20% -colorspace sRGB {output} |
-filter {filtername}
" instead of
"-filter Cubic -define filter:B={value}
".
Although, with Keys cubics, I prefer linear light EWA filtering when
downsampling, linear light tensor filtering with Keys cubics is also
recommended (provided you use HDRI). This is obtained by replacing
"-distort Resize
" by "-resize
". Tensor
filtering with the Mitchell cubic (-filter Mitchell
-resize
) is particularly good.
If you do not want any haloing, use linear light EWA or tensor Quadratic or Spline filtering (see the upsampling section). You may also get good results with linear light EWA Triangle filtering.
magick {input} -colorspace RGB -filter Triangle \ -distort Resize 20% -colorspace sRGB {output} |
-distort -resize
" by "-resize
". Tensor
Triangle is slightly blurrier and shows less moiré than its EWA
version, and it preserves perfectly horizontal and vertical features
better as well. It works fine without HDRI. Both EWA and tensor Triangle
filtering are interpolatory.
With the exception of EWA Triangle, tensor Triangle and EWA Lanczos3Sharpest, the above filters also work well when enlarging. (Tensor Triangle is actually recommended if you are enlarging just a little bit.) Adjusting the
blur
(between 0.7 and 1.0)
or B
parameters (between 0.0 and 1.0) should obviate the
need for USM (Unsharp)
Sharpening, a common final step when downsampling, or allow you to
use less of it. Note however that low values of the blur
and B
parameters generally lead to considerable
artifacts; high values, to blur.
Downsampling Examples
These examples use the Smaller Rings Image image also used in the Aliasing and Moiré Effects section. Instead of resizing this 200x200 image down to 100x100, using sRGB values directly, we downsize to 101x101 through linear RGB. Ideally, many concentric rings should be preserved, without the appearance of features which are not in the original. There is no such thing as a free lunch: The filters that lose the fewest rings have the most obvious artifacts. Nonetheless, some of the filters manage a pretty good balance between sharpness and aliasing, namely EWA QuadraticJinc, tensor Mitchell, and tensor Triangle. EWA LanczosSharp, EWA Quadratic, EWA Lanczos Radius 3 and EWA Robidoux also do well in this test. Generally, EWA methods have good moiré suppression.Borderline Cases
If you are changing the aspect ratio to the extent that you upsample (enlarge) in one direction and downsample (reduce) in the other, use a technique that works well in both situations, like linear light EWA LanczosSharp, tensor Ginseng, EWA Lanczos Radius 3, or EWA quadratic B-spline-windowed Jinc 3-lobe ("QuadraticJinc"). If you are both downsampling and upsampling, downsampling considerations should dominate your choice. For example, resize through linear light, as if you are downsampling in both directions. The same prescription basically holds if the resizing ratio is close to 1 in both directions, for example if you are resizing a 100x100 image to 102x102, 95x95 or 102x95 (or rotating the image). First, try interpolatory filters like tensor Ginseng or tensor Triangle. The usual EWA Lanczos Radius 3, EWA LanczosSharp and EWA QuadraticJinc work well too. Sigmoidization should be used sparingly (constrast<5.5), if at all. In other words, you probably should stick to linear light when barely resizing, although the "should" is weaker than if you are shrinking a lot in one or both directions.Feedback
I read positive and negative comments with interest. These recommendations are a work in progress, and consequently examples in which they fall short of expectations are particularly valuable. Sigmoidization and resizing through the Lab color space, in particular, are recent additions to my tool kit and their strengths and limitations have not been carefully established. Consequently, I am particularly interested in hearing about good and bad experiences with these techniques. For example, it appears that sigmoidization is not so good with "defective" images which already contain significant ringing and haloing, or have been heavily manipulated somehow (that are far from "natural"), although it seems to do fine at enlarging CG art, line drawings and text-like images. Sending NicolasRobidoux a message through the ImageMagick Forums System is a good way to point me to a relevant post. Otherwise, try <nicolas.robidoux@gmail.com>.Thanks
I (Nicolas Robidoux) thank John Cupitt, Henry HO, Bryant Moore, Mathias Rauen, Adam Turcotte, Dane Vandeputte, Luiz E. Vasconcellos and Fred Weinhaus for useful comments, with special thanks to Anthony Thyssen on whose shoulders I stood when developing EWA methods. Anthony and Cristy built quite a nice platform for image processing research.Created: 10 October 2012
Updated: 21 October 2012
Author: Nicolas Robidoux, <nicolas.robidoux@gmail.com>
Formatting: Anthony Thyssen, <Anthony.Thyssen@gmail.com>
Examples Generated with:
URL:
https://imagemagick.org/Usage/filter/nicolas/