Page **1** of **1**

### Mitchell interpolation definition

Posted: **2017-01-13T09:26:23-07:00**

by **gubach**

Hello,

I want to define the Mitchell function as a custom interpolation kernel in Matlabs imresize (examples in

http://stackoverflow.com/questions/8036 ... ion-kernel). First step would be the definition of the Mitchel filter and in

http://www.imagemagick.org/Usage/filter/#mitchell I read „IM uses the same internal function to generate all cubic filters, only with different B,C settings“ which is super because this whole kernel class could be covered then in imresize. Has someone the used function definition or point me to the used code? Thank you very much!

### Re: Mitchell interpolation definition

Posted: **2017-01-13T09:45:20-07:00**

by **snibgo**

The source code is in resize.c.

### Re: Mitchell interpolation definition

Posted: **2017-01-13T11:06:05-07:00**

by **fmw42**

### Re: Mitchell interpolation definition

Posted: **2017-01-16T05:39:09-07:00**

by **gubach**

Thanks snibgo and fmw42!

Found this in resize.c and

http://http.developer.nvidia.com/GPUGem ... _ch24.html :

Code: Select all

```
static double CubicBC(const double x,const ResizeFilter *resize_filter)
{
/*
Cubic Filters using B,C determined values:
Mitchell-Netravali B = 1/3 C = 1/3 "Balanced" cubic spline filter
Catmull-Rom B = 0 C = 1/2 Interpolatory and exact on linears
Spline B = 1 C = 0 B-Spline Gaussian approximation
Hermite B = 0 C = 0 B-Spline interpolator
See paper by Mitchell and Netravali, Reconstruction Filters in Computer
Graphics Computer Graphics, Volume 22, Number 4, August 1988
http://www.cs.utexas.edu/users/fussell/courses/cs384g/lectures/mitchell/
Mitchell.pdf.
Coefficents are determined from B,C values:
P0 = ( 6 - 2*B )/6 = coeff[0]
P1 = 0
P2 = (-18 +12*B + 6*C )/6 = coeff[1]
P3 = ( 12 - 9*B - 6*C )/6 = coeff[2]
Q0 = ( 8*B +24*C )/6 = coeff[3]
Q1 = ( -12*B -48*C )/6 = coeff[4]
Q2 = ( 6*B +30*C )/6 = coeff[5]
Q3 = ( - 1*B - 6*C )/6 = coeff[6]
which are used to define the filter:
P0 + P1*x + P2*x^2 + P3*x^3 0 <= x < 1
Q0 + Q1*x + Q2*x^2 + Q3*x^3 1 <= x < 2
which ensures function is continuous in value and derivative (slope).
*/
if (x < 1.0)
return(resize_filter->coefficient[0]+x*(x*
(resize_filter->coefficient[1]+x*resize_filter->coefficient[2])));
if (x < 2.0)
return(resize_filter->coefficient[3]+x*(resize_filter->coefficient[4]+x*
(resize_filter->coefficient[5]+x*resize_filter->coefficient[6])));
return(0.0);
}
```

Code: Select all

```
// Mitchell Netravali Reconstruction Filter
// B = 1, C = 0 - cubic B-spline
// B = 1/3, C = 1/3 - recommended
// B = 0, C = 1/2 - Catmull-Rom spline
float MitchellNetravali(float x, float B, float C)
{
float ax = fabs(x);
if (ax < 1) {
return ((12 - 9 * B - 6 * C) * ax * ax * ax +
(-18 + 12 * B + 6 * C) * ax * ax + (6 - 2 * B)) / 6;
} else if ((ax >= 1) && (ax < 2)) {
return ((-B - 6 * C) * ax * ax * ax +
(6 * B + 30 * C) * ax * ax + (-12 * B - 48 * C) *
ax + (8 * B + 24 * C)) / 6;
} else {
return 0;
}
}
```