Page 1 of 1

### Mitchell interpolation definition

Posted: 2017-01-13T09:26:23-07:00
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
The source code is in resize.c.

### Re: Mitchell interpolation definition

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

### Re: Mitchell interpolation definition

Posted: 2017-01-16T05:39:09-07:00
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;
}
}``````