Пример #1
0
        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));
        }
Пример #2
0
        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));
        }
Пример #3
0
        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]));
                    }
                }
            }
        }
Пример #4
0
        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));
        }