TitleEdge-directional interpolation algorithm using structure tensor
Publication typeConference paper
Author(s)A.Nasonov, A.Krylov, X.Petrova, M.Rychagov
Publication date2016
Conference28th annual International Symposium on Electronic Imaging
AbstractThe paper presents a new low complexity edge-directed image interpolation algorithm. The algorithm uses structure tensor analysis to distinguish edges from textured areas and to find local structure direction vectors. The vectors are quantized into 6 directions. Individual adaptive interpolation kernels are used for each direction. Experimental results show high performance of the proposed method without introducing artifacts.
URLPDF
CommentFilter coefficients are:

res.s1_default = new float[] { 0.065f, -0.392f, 1.327f };
res.s1_ortho = new float[] { -0.068f, -0.182f, -0.025f, 1.275f };
res.s1_diag = new float[] { -0.062f, -0.161f, 0.075f, 0.013f, -0.020f, 1.065f, 0.177f, -0.087f };
res.s2_default = new float[] { 0.130f, -0.545f, 1.415f };
res.s2_ortho = new float[] { 0.185f, -0.303f, -0.286f, 1.404f };
res.s2_diag = new float[] { 0.078f, -0.053f, -0.188f, -0.026f, -0.124f, 0.457f, 0.922f, -0.066f };


s1[1][0] = s1[1][3] = s1[1][12] = s1[1][15] = s1_ortho[0] * 0.25f;
s1[1][1] = s1[1][2] = s1[1][13] = s1[1][14] = s1_ortho[1] * 0.25f;
s1[1][4] = s1[1][7] = s1[1][8] = s1[1][11] = s1_ortho[2] * 0.25f;
s1[1][5] = s1[1][6] = s1[1][9] = s1[1][10] = s1_ortho[3] * 0.25f;

s1[2][0] = s1[2][15] = s1_diag[0] * 0.5f;
s1[2][1] = s1[2][14] = s1_diag[1] * 0.5f;
s1[2][2] = s1[2][13] = s1_diag[2] * 0.5f;
s1[2][3] = s1[2][12] = s1_diag[3] * 0.5f;
s1[2][4] = s1[2][11] = s1_diag[4] * 0.5f;
s1[2][5] = s1[2][10] = s1_diag[5] * 0.5f;
s1[2][6] = s1[2][9] = s1_diag[6] * 0.5f;
s1[2][7] = s1[2][8] = s1_diag[7] * 0.5f;

s1[3][0] = s1[3][15] = s1_diag[0] * 0.5f;
s1[3][4] = s1[3][11] = s1_diag[1] * 0.5f;
s1[3][7] = s1[3][8] = s1_diag[2] * 0.5f;
s1[3][3] = s1[3][12] = s1_diag[3] * 0.5f;
s1[3][1] = s1[3][14] = s1_diag[4] * 0.5f;
s1[3][5] = s1[3][10] = s1_diag[5] * 0.5f;
s1[3][6] = s1[3][9] = s1_diag[6] * 0.5f;
s1[3][2] = s1[3][13] = s1_diag[7] * 0.5f;

s1[4][0] = s1[4][3] = s1[4][12] = s1[4][15] = s1_ortho[0] * 0.25f;
s1[4][4] = s1[4][7] = s1[4][8] = s1[4][11] = s1_ortho[1] * 0.25f;
s1[4][1] = s1[4][2] = s1[4][13] = s1[4][14] = s1_ortho[2] * 0.25f;
s1[4][5] = s1[4][6] = s1[4][9] = s1[4][10] = s1_ortho[3] * 0.25f;

s1[5][3] = s1[5][12] = s1_diag[0] * 0.5f;
s1[5][7] = s1[5][8] = s1_diag[1] * 0.5f;
s1[5][4] = s1[5][11] = s1_diag[2] * 0.5f;
s1[5][0] = s1[5][15] = s1_diag[3] * 0.5f;
s1[5][2] = s1[5][13] = s1_diag[4] * 0.5f;
s1[5][6] = s1[5][9] = s1_diag[5] * 0.5f;
s1[5][5] = s1[5][10] = s1_diag[6] * 0.5f;
s1[5][1] = s1[5][14] = s1_diag[7] * 0.5f;

s1[6][3] = s1[6][12] = s1_diag[0] * 0.5f;
s1[6][2] = s1[6][13] = s1_diag[1] * 0.5f;
s1[6][1] = s1[6][14] = s1_diag[2] * 0.5f;
s1[6][0] = s1[6][15] = s1_diag[3] * 0.5f;
s1[6][7] = s1[6][8] = s1_diag[4] * 0.5f;
s1[6][6] = s1[6][9] = s1_diag[5] * 0.5f;
s1[6][5] = s1[6][10] = s1_diag[6] * 0.5f;
s1[6][4] = s1[6][11] = s1_diag[7] * 0.5f;

s1[0][0] = s1[0][3] = s1[0][12] = s1[0][15] = s1_default[0] * 0.25f;
s1[0][1] = s1[0][2] = s1[0][13] = s1[0][14] = s1[0][4] = s1[0][7] = s1[0][8] = s1[0][11] = s1_default[1] * 0.125f;
s1[0][5] = s1[0][6] = s1[0][9] = s1[0][10] = s1_default[2] * 0.25f;



s2[1][0] = s2[1][3] = s2[1][12] = s2[1][15] = s2_ortho[0] * 0.25f;
s2[1][1] = s2[1][2] = s2[1][13] = s2[1][14] = s2_ortho[1] * 0.25f;
s2[1][4] = s2[1][7] = s2[1][8] = s2[1][11] = s2_ortho[2] * 0.25f;
s2[1][5] = s2[1][6] = s2[1][9] = s2[1][10] = s2_ortho[3] * 0.25f;

s2[2][0] = s2[2][15] = s2_diag[0] * 0.5f;
s2[2][1] = s2[2][14] = s2_diag[1] * 0.5f;
s2[2][2] = s2[2][13] = s2_diag[2] * 0.5f;
s2[2][3] = s2[2][12] = s2_diag[3] * 0.5f;
s2[2][4] = s2[2][11] = s2_diag[4] * 0.5f;
s2[2][5] = s2[2][10] = s2_diag[5] * 0.5f;
s2[2][6] = s2[2][9] = s2_diag[6] * 0.5f;
s2[2][7] = s2[2][8] = s2_diag[7] * 0.5f;

s2[3][3] = s2[3][12] = s2_diag[0] * 0.5f;
s2[3][2] = s2[3][13] = s2_diag[1] * 0.5f;
s2[3][1] = s2[3][14] = s2_diag[2] * 0.5f;
s2[3][0] = s2[3][15] = s2_diag[3] * 0.5f;
s2[3][7] = s2[3][8] = s2_diag[4] * 0.5f;
s2[3][6] = s2[3][9] = s2_diag[5] * 0.5f;
s2[3][5] = s2[3][10] = s2_diag[6] * 0.5f;
s2[3][4] = s2[3][11] = s2_diag[7] * 0.5f;


s2[4][0] = s2[4][3] = s2[4][12] = s2[4][15] = s2_ortho[0] * 0.25f;
s2[4][4] = s2[4][7] = s2[4][8] = s2[4][11] = s2_ortho[1] * 0.25f;
s2[4][1] = s2[4][2] = s2[4][13] = s2[4][14] = s2_ortho[2] * 0.25f;
s2[4][5] = s2[4][6] = s2[4][9] = s2[4][10] = s2_ortho[3] * 0.25f;

s2[5][3] = s2[5][12] = s2_diag[0] * 0.5f;
s2[5][7] = s2[5][8] = s2_diag[1] * 0.5f;
s2[5][4] = s2[5][11] = s2_diag[2] * 0.5f;
s2[5][0] = s2[5][15] = s2_diag[3] * 0.5f;
s2[5][2] = s2[5][13] = s2_diag[4] * 0.5f;
s2[5][6] = s2[5][9] = s2_diag[5] * 0.5f;
s2[5][5] = s2[5][10] = s2_diag[6] * 0.5f;
s2[5][1] = s2[5][14] = s2_diag[7] * 0.5f;

s2[6][0] = s2[6][15] = s2_diag[0] * 0.5f;
s2[6][4] = s2[6][11] = s2_diag[1] * 0.5f;
s2[6][7] = s2[6][8] = s2_diag[2] * 0.5f;
s2[6][3] = s2[6][12] = s2_diag[3] * 0.5f;
s2[6][1] = s2[6][14] = s2_diag[4] * 0.5f;
s2[6][5] = s2[6][10] = s2_diag[5] * 0.5f;
s2[6][6] = s2[6][9] = s2_diag[6] * 0.5f;
s2[6][2] = s2[6][13] = s2_diag[7] * 0.5f;

s2[0][0] = s2[0][3] = s2[0][12] = s2[0][15] = s2_default[0] * 0.25f;
s2[0][1] = s2[0][2] = s2[0][13] = s2[0][14] = s2[0][4] = s2[0][7] = s2[0][8] = s2[0][11] = s2_default[1] * 0.125f;
s2[0][5] = s2[0][6] = s2[0][9] = s2[0][10] = s2_default[2] * 0.25f;

Show BiBTeX entry