예제 #1
0
        //double L, u, v;

        public Quantize()
        {
            for (int i = 0; i < 160; i++)
            {
                LuvIndex[i] = new LUVClass();
            }
        }
예제 #2
0
        public void createMatrix()
        {
            int N = 159;

            similarityMatrix = new double[N, N];
            Quantize q = new Quantize();

            for (int index1 = 0; index1 < N; index1++)
            {
                for (int index2 = 0; index2 < N; index2++)
                {
                    LUVClass luv1     = q.getLUVfromIndex(index1);
                    LUVClass luv2     = q.getLUVfromIndex(index2);
                    double   distance = getEuclideanDistance(luv1, luv2);
                    if (distance > tColor)
                    {
                        similarityMatrix[index1, index2] = 0;
                    }
                    else
                    {
                        similarityMatrix[index1, index2] = 1 - distance / tColor;
                    }
                }
            }
            //return similarityMatrix;
        }
예제 #3
0
 private LUVClass[,] getLuvMatrix(Bitmap img)
 {
     LUVClass[,] matrix = new LUVClass[img.Width, img.Height];
     for (int i = 0; i < img.Width; i++)
     {
         for (int j = 0; j < img.Height; j++)
         {
             Color pixel = img.GetPixel(i, j);
             var   myRgb = new Rgb {
                 R = pixel.R, G = pixel.G, B = pixel.B
             };
             var myLuv = myRgb.To <Luv>();
             matrix[i, j] = new LUVClass(myLuv.L, myLuv.U, myLuv.V);
         }
     }
     return(matrix);
 }
예제 #4
0
        private void initializeMaxDistance()
        {
            int      N   = 159;
            Quantize q   = new Quantize();
            double   max = 0;

            for (int index1 = 0; index1 < N; index1++)
            {
                for (int index2 = 0; index2 < N; index2++)
                {
                    LUVClass luv1     = q.getLUVfromIndex(index1);
                    LUVClass luv2     = q.getLUVfromIndex(index2);
                    double   distance = getEuclideanDistance(luv1, luv2);
                    if (distance > max)
                    {
                        max = distance;
                    }
                }
            }
            dMax   = max;
            tColor = p * dMax;
        }
예제 #5
0
        private LUVClass[,] blurredMatrix(LUVClass[,] luv)
        {
            LUVClass[,] result = new LUVClass[width, height];

            for (int i = 1; i < width - 1; i += 2)
            {
                for (int j = 1; j < height - 1; j += 2)
                {
                    double aveL = 0.0;
                    double aveU = 0.0;
                    double aveV = 0.0;

                    aveL += luv[i - 1, j - 1].L + luv[i, j - 1].L + luv[i + 1, j - 1].L +
                            luv[i - 1, j].L + luv[i, j].L + luv[i + 1, j].L +
                            luv[i - 1, j + 1].L + luv[i, j + 1].L + luv[i + 1, j + 1].L;
                    aveU += luv[i - 1, j - 1].u + luv[i, j - 1].u + luv[i + 1, j - 1].u +
                            luv[i - 1, j].u + luv[i, j].u + luv[i + 1, j].u +
                            luv[i - 1, j + 1].u + luv[i, j + 1].u + luv[i + 1, j + 1].u;
                    aveV += luv[i - 1, j - 1].v + luv[i, j - 1].v + luv[i + 1, j - 1].v +
                            luv[i - 1, j].v + luv[i, j].v + luv[i + 1, j].v +
                            luv[i - 1, j + 1].v + luv[i, j + 1].v + luv[i + 1, j + 1].v;

                    aveL /= 9;
                    aveU /= 9;
                    aveV /= 9;

                    LUVClass myLuv = new LUVClass(aveL, aveU, aveV);
                    //Console.WriteLine("ij" + i + "," + j);
                    result[i - 1, j - 1] = myLuv; result[i, j - 1] = myLuv; result[i + 1, j - 1] = myLuv;
                    result[i - 1, j]     = myLuv; result[i, j] = myLuv; result[i + 1, j] = myLuv;
                    result[i - 1, j + 1] = myLuv; result[i, j + 1] = myLuv; result[i + 1, j + 1] = myLuv;
                }
            }

            if (width % 2 == 0)
            {
                int hei = height;
                if (height % 2 == 0)
                {
                    hei -= 1;
                }
                for (int i = 0; i < hei; i++)
                {
                    result[width - 1, i] = result[width - 2, i];
                }
            }

            if (height % 2 == 0)
            {
                for (int j = 0; j < width; j++)
                {
                    result[j, height - 1] = result[j, height - 2];
                }
                if (width % 2 == 0)
                {
                    result[width - 1, height - 1] = result[width - 1, height - 2];
                }
            }
            //Console.WriteLine(result[125, 83]+ " "+ result[126, 83] + " " + result[127, 83]);
            //Console.WriteLine(result[125, 84] + " " + result[126, 84] + " " + result[127, 84]);
            return(result);
        }
예제 #6
0
        private double getEuclideanDistance(LUVClass l1, LUVClass l2)
        {
            double val = Math.Sqrt(Math.Pow(l1.L - l2.L, 2) + Math.Pow(l1.u - l2.u, 2) + Math.Pow(l1.v - l2.v, 2));

            return(val);
        }