blob: a43d596611265e24a9b77088019395e3b1a7033f [file] [log] [blame]
/** This is a modified version of serial/bicubicInterpolation.cpp of
* https://github.com/srijanmishra/parallel-bicubic-interpolation
*
* Modified by
* Pankaj Kukreja (github.com/proton0001)
* Indian Institute of Technology Hyderabad
*/
#include "interpolation.h"
void bicubicKernel(int height, int width, int inputImage[HEIGHT][WIDTH],
int outputImage[ZOOM * height][ZOOM * width]) {
int f = ZOOM;
int newheight = f * height;
int newwidth = f * width;
double arr[4][4];
for (int i = 0; i < newheight - 3 * f; i++) {
for (int j = 0; j < newwidth - 3 * f; j++) {
// for row offset
for (int l = 0; l < 4; l++) {
// for column offset
for (int k = 0; k < 4; k++) {
arr[l][k] = inputImage[i / f + l][j / f + k];
}
}
double x = (double)(i % f) / f;
double y = (double)(j % f) / f;
double arr2[4];
arr2[0] = arr[0][1] + 0.5 * y *
(arr[0][2] - arr[0][0] +
y * (2.0 * arr[0][0] - 5.0 * arr[0][1] +
4.0 * arr[0][2] - arr[0][3] +
y * (3.0 * (arr[0][1] - arr[0][2]) +
arr[0][3] - arr[0][0])));
arr2[1] = arr[1][1] + 0.5 * y *
(arr[1][2] - arr[1][0] +
y * (2.0 * arr[1][0] - 5.0 * arr[1][1] +
4.0 * arr[1][2] - arr[1][3] +
y * (3.0 * (arr[1][1] - arr[1][2]) +
arr[1][3] - arr[1][0])));
arr2[2] = arr[2][1] + 0.5 * y *
(arr[2][2] - arr[2][0] +
y * (2.0 * arr[2][0] - 5.0 * arr[2][1] +
4.0 * arr[2][2] - arr[2][3] +
y * (3.0 * (arr[2][1] - arr[2][2]) +
arr[2][3] - arr[2][0])));
arr2[3] = arr[3][1] + 0.5 * y *
(arr[3][2] - arr[3][0] +
y * (2.0 * arr[3][0] - 5.0 * arr[3][1] +
4.0 * arr[3][2] - arr[3][3] +
y * (3.0 * (arr[3][1] - arr[3][2]) +
arr[3][3] - arr[3][0])));
outputImage[i][j] =
arr2[1] +
0.5 * x *
(arr2[2] - arr2[0] +
x * (2.0 * arr2[0] - 5.0 * arr2[1] + 4.0 * arr2[2] - arr2[3] +
x * (3.0 * (arr2[1] - arr2[2]) + arr2[3] - arr2[0])));
}
}
}