Estou tentando implementar o algoritmo de interpolação bicubica mas estou tendo muita dificuldade com o acerto dos valores interpolados( não é relacionado a pegar os valores da matriz original e sim o relacionamento dos pesos das distâncias).
Seguindo a ideia desse rapaz aqui (esse caso é para a interpolação bilinear mas ajuda a entender a ideia dos pesos) :
https://stackoverflow.com/questions/16341167/bilinear-interpolation
Nesse caso, os pesos para uma imagem de ampliação de fator 2 ficaria : 0 0.5 1
( aqui mudaria para próximo pixel da imagem original).
Mas em uma interpolação bicubica são usados 16 pixels como mostrado na imagem a seguir :
O que cria tipo uma " mascara 4x4 " dos pixels originais, ou seja só mudaria o index quando x ou y passar de 3. Fiz uma lógica para esse index e funciona mas a minha duvida está relacionado ao dx e ao dy pois eles terão que ir de 0 a 3 ( pois é a distância horizontal e vertical ) ponderados entre 0 e 1 certo ? ou seja, para uma ampliação de fator 2 eles terão que ir de 0 0.5 1 1.5 2 2.5 3
( ponderado seria 0 0.1666 0.25 0.5 0.666 0.83 1
) ?
Estou fazendo com esses pesos e jogando no polinômio, que pode ser visto aqui : http://www.paulinternet.nl/?page=bicubic
Mas os valores estão muito a quem do desejado ( embora esteja pegando os pixels certinho e fazendo o algoritmo certo).
A ideia da manipulação dos pesos ponderados é assim mesmo ? Ou está incorreto ?
Se puder explicar de forma mais exemplificada esse algoritmo para ver se estou pensando da forma correta eu agradeceria.
EDITADO :
Por exemplo, considere a matriz a seguir :
Se formos aumentá-la em ordem 2 ficaria com seus respectivos pesos ficaria algo do tipo :
Se fizermos
P= Cubo(pixel[index],pixel[index+1],pixel[index+2],pixel[index+3],dx);
Q= Cubo(pixel[index+4],pixel[index+5],pixel[index+6],pixel[index+7],dx);
R= Cubo(pixel[index+8],pixel[index+9],pixel[index+10],pixel[index+11],dx);
S= Cubo(pixel[index+12],pixel[index+13],pixel[index+14],pixel[index+15],dx);
matriz[i][j] =Cubo(P,Q,R,S,dy);
onde o cubo seria essa função :
Cubo(double[] p, double x) {
return p[1] + 0.5 * x*(p[2] - p[0] + x*(2.0*p[0] - 5.0*p[1] + 4.0*p[2] - p[3] + x*(3.0*(p[1] - p[2]) + p[3] - p[0])));
}
Se fizermos isso para o valor da linha 0 e coluna 1 ( dx = 0.1666 e dy=0) vai gerar { 5.04 ,1.98, 1.69, 3.02}
e o resultado disso matriz[i][j] =Cubo(5.04 ,1.98, 1.69, 3.02, dy)
vai ser 1.98
enquanto que deveria dar algo entre 8 e 5
.
Alguém sabe o que está acontecendo de errado ?