private Color Nearest(double x, double y)//最近邻插值 { if (x < 0 || y < 0 || x >= picWidth2 - 1 || y >= picHeight2 - 1) { return(Color.FromArgb(0, 0, 0));//越界返回黑色 } int x1 = (int)Math.Floor(x); int y1 = (int)Math.Floor(y); double u = x - x1; double v = y - y1; if (u >= 0.5) { x1 = x1 + 1; } if (v >= 0.5) { y1 = y1 + 1; } return(OriginalPic2.GetPixel(x1, y1)); }
private Color Bilinear(double x, double y)//双线性插值 { if (x < 0 || y < 0 || x >= picWidth2 - 1 || y >= picHeight2 - 1) { return(Color.FromArgb(0, 0, 0));//越界返回黑色 } double R, G, B; int x1 = (int)Math.Floor(x); int y1 = (int)Math.Floor(y); double u = x - x1; double v = y - y1; Matrix M1 = new Matrix(1, 2); M1[0, 0] = 1 - u; M1[0, 1] = u; Matrix M3 = new Matrix(2, 1); M3[0, 0] = 1 - v; M3[1, 0] = v; Matrix M2 = new Matrix(2, 2);//利用矩阵求出插值后像素点的R,G,B M2[0, 0] = OriginalPic2.GetPixel(x1, y1).R; M2[0, 1] = OriginalPic2.GetPixel(x1, y1 + 1).R; M2[1, 0] = OriginalPic2.GetPixel(x1 + 1, y1).R; M2[1, 1] = OriginalPic2.GetPixel(x1 + 1, y1 + 1).R; R = ((M1 * M2) * M3)[0, 0]; M2[0, 0] = OriginalPic2.GetPixel(x1, y1).G; M2[0, 1] = OriginalPic2.GetPixel(x1, y1 + 1).G; M2[1, 0] = OriginalPic2.GetPixel(x1 + 1, y1).G; M2[1, 1] = OriginalPic2.GetPixel(x1 + 1, y1 + 1).G; G = ((M1 * M2) * M3)[0, 0]; M2[0, 0] = OriginalPic2.GetPixel(x1, y1).B; M2[0, 1] = OriginalPic2.GetPixel(x1, y1 + 1).B; M2[1, 0] = OriginalPic2.GetPixel(x1 + 1, y1).B; M2[1, 1] = OriginalPic2.GetPixel(x1 + 1, y1 + 1).B; B = ((M1 * M2) * M3)[0, 0]; return(Color.FromArgb((int)R, (int)G, (int)B)); }
private void TPSchangeNegative(Matrix A)//TPS反变换变形 { Matrix T = new Matrix(1, 71); Matrix F = new Matrix(1, 2); double distance; for (int i = 0; i < picWidth2; i++) { for (int j = 0; j < picHeight2; j++) { for (int k = 0; k < 68; k++)//对新图像里的每个点构造矩形求取f(x,y)映射到2图中 { distance = Math.Pow(i - Pic1Cor[k, 0], 2) + Math.Pow(j - Pic1Cor[k, 1], 2); if (distance == 0) { T[0, k] = 0; } else { T[0, k] = distance * Math.Log(distance); } } T[0, 68] = 1; T[0, 69] = i; T[0, 70] = j; F = T * A; if ((int)F[0, 0] < 0 || (int)F[0, 1] < 0 || (int)F[0, 0] >= picWidth2 || (int)F[0, 1] >= picHeight2) { NewPic.SetPixel(i, j, Color.FromArgb(0, 0, 0)); } else { NewPic.SetPixel(i, j, OriginalPic2.GetPixel((int)F[0, 0], (int)F[0, 1])); } } } }
private Color Bicubic(double x, double y)//双三次插值 { if (x < 1 || y < 1 || x >= picWidth2 - 2 || y >= picHeight2 - 2) { return(Color.FromArgb(0, 0, 0));//越界返回黑色 } double R, G, B; int x1 = (int)Math.Floor(x); int y1 = (int)Math.Floor(y); double u = x - x1; double v = y - y1; Matrix M1 = new Matrix(1, 4); M1[0, 0] = S(1 + u); M1[0, 1] = S(u); M1[0, 2] = S(u - 1); M1[0, 3] = S(u - 2); Matrix M3 = new Matrix(1, 4); M3[0, 0] = S(1 + v); M3[0, 1] = S(v); M3[0, 2] = S(v - 1); M3[0, 3] = S(v - 2); Matrix M2_R = new Matrix(4, 4); Matrix M2_G = new Matrix(4, 4); Matrix M2_B = new Matrix(4, 4); for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { M2_R[i, j] = OriginalPic2.GetPixel(x1 - 1 + i, y1 - 1 + j).R; M2_G[i, j] = OriginalPic2.GetPixel(x1 - 1 + i, y1 - 1 + j).G; M2_B[i, j] = OriginalPic2.GetPixel(x1 - 1 + i, y1 - 1 + j).B; } } R = (M1 * M2_R * (M3.Transpose()))[0, 0]; G = (M1 * M2_G * (M3.Transpose()))[0, 0]; B = (M1 * M2_B * (M3.Transpose()))[0, 0]; if (R < 0) { R = 0; } else if (R > 255) { R = 255; } if (G < 0) { G = 0; } else if (G > 255) { G = 255; } if (B < 0) { B = 0; } else if (B > 255) { B = 255; } return(Color.FromArgb((int)R, (int)G, (int)B)); }