If you know the term *bicubic resampling*,
you probably assume that it is a specific
algorithm used to resize images. Unfortunately, that’s not the case.
In this document, I’ll try to get to the bottom of what it
really is.

The analysis in this document was done with the help of ResampleScope.

If some of this doesn’t make sense, it may help to read my document about resampling.

Let’s get the “bi” part of the name out of the way first. “Bi” is supposed to mean that you apply the algorithm in two dimensions: horizontally and vertically.

One problem is that the terminology is used inconsistently. If you apply, for example, Lanczos or Mitchell resampling in two dimensions, their names don’t change to “Bilanczos” or “Bimitchell”. For some reason, only cubic and linear get their names changed.

Another reason that “bi” seems unnecessary is that the number of dimensions does not really affect the algorithm. It’s exactly the same; the only difference is how many times you apply it.

I suggest ignoring the “bi”, and just thinking of it as “cubic” resampling. Some applications do use this terminology.

Broadly speaking, *cubic resampling* means little
more than “any algorithm in which the most sophisticated
mathematical operation is to take the cube of a number”.

More strictly, we only consider cubic filters which have a
certain maximum width (a radius of 2), and which are
symmetric, unbiased, continuous and smooth, etc.
Fortunately, there are only a limited number of filters
which meet all the requirements.
In a 1988 paper, Mitchell and Netravali
showed that, given these constraints, there are only
two free parameters remaining,
which are usually named *B* and *C*.
Here’s the general formula for this entire family
of cubic filters:

So, we have a two-dimensional space containing all
the interesting cubic resampling algorithms.
I will use the notation *cubic(B,C)* to refer to a
specific algorithm in this space.

The cubics for which C=0 are called the “B-spline” cubics.
They are the ones that do not produce any
ringing artifacts. If “B-spline” is used to refer to a specific
algorithm, it means *cubic(1,0)*.

The cubics for which B=0 are known as the cardinal cubics. They are the ones that do not have any inherent blurring. By that, I mean if you apply a cardinal cubic to an image without changing the image size, it will leave the image pixels completely unchanged.

Suppose your imaging software offers a resampling filter named “cubic” or “bicubic”. What exactly is it?

The only way to know is to try it and see. You could take a small image of a thin line: , enlarge it by a large factor, and graph a cross-section of it.

In the cases below, I’ll also enlarge this sample image: , to give you a better idea of what the filter does.

*Technical note:
Gamma correction
was used when resizing the smiley
image, but not the thin line test pattern, to make it simpler to graph.*

In some applications, “bicubic” means *cubic(1,0)*.
Other applications don’t call this filter “bicubic”,
and instead use the
less-ambiguous name “B-spline.”
Though it’s sometimes useful, it’s very blurry,
so it’s usually not the best choice.

*Examples of software which may use this for “bicubic”
(or “cubic”): ImageMagick, Paint.NET*

It’s also common for “bicubic” to be
a Mitchell filter, which is *cubic(1/3,1/3)*.

*Examples of software which may use this for “bicubic”: FreeImage, Imagine*

Some applications use a Catmull-Rom filter when you ask for
“bicubic”. This is *cubic(0,1/2)*.

*Example of software which may use this for “bicubic”: GIMP*

I’ve only seen one application that uses *cubic(0,0.75)*,
but it’s a popular application, so I include it in this list.
It’s not clear to me why one would choose this over Catmull-Rom.

*Example of software which may use this for “bicubic”: Photoshop*

*See also:
Notes on Photoshop’s image resize algorithms*

I’ve seen several applications and code samples
in which “bicubic” is *cubic(0,1)*.
If this filter has a common name, I’m not aware of it.
This is a rather poor filter, so when I see it implemented,
I tend to assume that it was selected by someone who didn’t
realize there were other options.

*Example of software which may use this for “bicubic”: FastStone*

Some applications might not use anything in
*cubic(B,C)* space.
They may use a blurred or sharpened cubic, or something
else entirely.

Some applications may be optimized for speed, and use only an approximation of a cubic filter.

Some applications may not use a fixed cubic filter, but instead vary the parameters depending on the scaling factor.

Note that it’s common for an application to use a different algorithm when downscaling than it does when upscaling. Downscaling algorithms are more varied than upscaling algorithms, and more difficult to analyze.

Some applications may post-process the image after resizing it. I’m referring especially to the practice of sharpening an image after downscaling it.