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;
}
}