示例#1
0
        public override double Distance(Color3d circleColor, Color3d pixelColor, int distX, int distY)
        {
            if (circleColor.GetType() != pixelColor.GetType())
            {
                throw new Exception("Can't compare colors in different color spaces");
            }

            var circleColorRgb = circleColor.ConvertTo <ColorRgb>();
            var pixelColorRgb  = pixelColor.ConvertTo <ColorRgb>();

            var mineCircleColor = new ColorMine.ColorSpaces.Rgb
            {
                R = circleColorRgb.R,
                G = circleColorRgb.G,
                B = circleColorRgb.B
            };

            var minePixelColor = new ColorMine.ColorSpaces.Rgb
            {
                R = pixelColorRgb.R,
                G = pixelColorRgb.G,
                B = pixelColorRgb.B
            };

            var ciede2000diff = mineCircleColor.Compare(minePixelColor, new ColorMine.ColorSpaces.Comparisons.CieDe2000Comparison());
            int distFromPoint = (int)Math.Sqrt(distX * distX + distY * distY);

            return(ciede2000diff + distFromPoint);
        }
        private double CalculateIdf(Color3d color3d, int clusterMaxDiffInOneColor = 30)
        {
            var color = color3d.ConvertTo <ColorRgb>();

            int minR = Math.Max(color.R - clusterMaxDiffInOneColor, 0);
            int minG = Math.Max(color.G - clusterMaxDiffInOneColor, 0);
            int minB = Math.Max(color.B - clusterMaxDiffInOneColor, 0);
            int maxR = Math.Min(color.R + clusterMaxDiffInOneColor, 255);
            int maxG = Math.Min(color.G + clusterMaxDiffInOneColor, 255);
            int maxB = Math.Min(color.B + clusterMaxDiffInOneColor, 255);

            int totalOfThisColor = 1;

            for (int r = minR; r < maxR; r++)
            {
                for (int g = minG; g < maxG; g++)
                {
                    for (int b = minB; b < maxB; b++)
                    {
                        totalOfThisColor += colorOccurences[r, g, b];
                    }
                }
            }

            return(Math.Log(totalPixelsInDataset / (double)totalOfThisColor));
        }
        public override double Distance(ColorRgb queryCircle, Color3d targetColor, int distX, int distY)
        {
            var queryCircleConverted = queryCircle.ConvertTo <ColorType>();
            var targetColorConverted = targetColor.ConvertTo <ColorType>();

            return(targetColorConverted.Get4dDistanceL2(queryCircleConverted, 0));
        }
        public override double Distance(ColorRgb queryCircle, Color3d targetColor, int distX, int distY)
        {
            LoadColorOccurences();

            var l2dist = base.Distance(queryCircle, targetColor, distX, distY);

            return(l2dist * CalculateIdf(queryCircle));
        }
示例#5
0
        public override double Distance(ColorRgb queryCircle, Color3d targetColor, int distX, int distY)
        {
            var queryCircleConverted = queryCircle.ConvertTo <ColorType>();
            var targetColorConverted = targetColor.ConvertTo <ColorType>();

            var distFromPoint = (int)Math.Sqrt(distX * distX + distY * distY);

            return(targetColorConverted.Get4dDistanceL2(queryCircleConverted, distFromPoint));
        }
示例#6
0
        public override double Distance(ColorRgb queryCircle, Color3d targetColor, int distX, int distY)
        {
            var queryCircleConverted = queryCircle.ConvertTo <ColorType>();
            var targetColorConverted = targetColor.ConvertTo <ColorType>();

            var dist = distX * distX + distY * distY;

            for (int i = 0; i < queryCircle.Spectrums.Length; i++)
            {
                var spectDiff = targetColorConverted.Spectrums[i] - queryCircleConverted.Spectrums[i];
                dist += spectDiff * spectDiff;
            }

            return(Math.Sqrt(dist));
        }
        public override double Distance(Color3d circleColor, Color3d pixelColor, int distX, int distY)
        {
            if (circleColor.GetType() != pixelColor.GetType())
            {
                throw new Exception("Can't compare colors in different color spaces");
            }

            double colorDist = 0;

            for (int i = 0; i < circleColor.Spectrums.Length; i++)
            {
                var dist = circleColor.Spectrums[i] - pixelColor.Spectrums[i];
                colorDist += dist * dist;
            }

            return(Math.Sqrt(colorDist));
        }
示例#8
0
        public override unsafe Color3d[,] Preprocess(Bitmap bitmap)
        {
            var targetHeight = (int)(bitmap.Height / ((double)bitmap.Width / TargetWidth));
            var smallBitmap  = GetImageHiQualityResized(bitmap, TargetWidth, targetHeight);

            Color3d[,] img = new Color3d[TargetWidth, targetHeight];

            for (int x = 0; x < TargetWidth; x++)
            {
                for (int y = 0; y < targetHeight; y++)
                {
                    var pixel = smallBitmap.GetPixel(x, y);

                    img[x, y] = new ColorType();
                    img[x, y].SetFromRgb(pixel.R, pixel.G, pixel.B);
                }
            }

            return(img);
        }
 public abstract double Distance(Color3d circleColor, Color3d pixelColor, int distX, int distY);
示例#10
0
 public static void GetDoublev(uint pname, out Color3d data)
 {
     m_GetDoublev_6(pname, out data);
     if(m_debug) CheckError("GetDoublev");
 }