コード例 #1
0
        public Bitmap ColorToGrayScale(Bitmap src)
        {
            ImageUtils image  = new ImageUtils();
            var        buffer = image.BitmapToBytes(src);
            var        rgb    = 0.0;

            for (int i = 0; i < buffer.Length; i += 4)
            {
                rgb           = buffer[i] * .3f;
                rgb          += buffer[i + 1] * .6f;
                rgb          += buffer[i + 2] * .1f;
                buffer[i]     = (byte)rgb;
                buffer[i + 1] = buffer[i];
                buffer[i + 2] = buffer[i];
                buffer[i + 3] = 255;
            }
            return(image.BytesToBitmap(buffer));
        }
コード例 #2
0
        public Bitmap ApplyGabor(Bitmap sourceImage)
        {
            ImageUtils image  = new ImageUtils();
            var        width  = image.Width;
            var        height = image.Height;
            var        bytes  = image.Bytes;
            var        result = new byte[bytes];

            var mid    = (_size) / 2;
            var values = new double[width, height];

            var kernel0   = CreateGaborFilter(0);
            var kernel45  = CreateGaborFilter(45);
            var kernel135 = CreateGaborFilter(135);
            var kernel90  = CreateGaborFilter(90);

            for (var y = 0; y < height; ++y)
            {
                for (var x = 0; x < width; ++x)
                {
                    var gaborValue = 0.0;
                    for (var fy = 0; fy < _size; ++fy)
                    {
                        for (var fx = 0; fx < _size; ++fx)
                        {
                            var value = 0.0;
                            if (x + fx - mid >= 0 && x + fx - mid < width && y + fy - mid >= 0 && y + fy - mid < height)
                            {
                                value = HSV.HsvFromColor(sourceImage.GetPixel(x + fx - mid, y + fy - mid)).V;
                            }
                            else
                            {
                                value = HSV.HsvFromColor(sourceImage.GetPixel(x, y)).V;
                            }

                            gaborValue += kernel0[fy, fx] * value;
                            gaborValue += kernel45[fy, fx] * value;
                            gaborValue += kernel90[fy, fx] * value;
                            gaborValue += kernel135[fy, fx] * value;
                        }
                    }
                    values[x, y] = gaborValue;
                }
            }

            var max = values[0, 0];
            var min = values[0, 0];

            for (var y = 0; y < height; ++y)
            {
                for (var x = 0; x < width; ++x)
                {
                    if (values[x, y] > max)
                    {
                        max = values[x, y];
                    }
                    if (values[x, y] < min)
                    {
                        min = values[x, y];
                    }
                }
            }
            for (var y = 0; y < height; ++y)
            {
                for (var x = 0; x < width; ++x)
                {
                    if (min < 0)
                    {
                        if (max >= 0)
                        {
                            values[x, y] -= min;
                            values[x, y] /= -min + max;
                            values[x, y] *= 100;
                        }
                        else
                        {
                            values[x, y] -= min;
                            values[x, y] /= -min - max;
                            values[x, y] *= 100;
                        }
                    }
                    else
                    {
                        values[x, y] += min;
                        values[x, y] /= min + max;
                        values[x, y] *= 100;
                    }
                }
            }

            for (var i = 0; i < bytes; i += 4)
            {
                HSV hsv = new HSV {
                    H = 0, S = 0, V = values[(i / 4) % width, (i / 4) / width]
                };
                hsv.ToColor();
                result[i + 0] = hsv.ToColor().R;
                result[i + 1] = hsv.ToColor().G;
                result[i + 2] = hsv.ToColor().B;
                result[i + 3] = 255;
            }
            return(image.BytesToBitmap(result));
        }
コード例 #3
0
ファイル: Sodel.cs プロジェクト: viKartonis/computerVision
        public static Bitmap ApplySodel(Bitmap srcImage)
        {
            var xkernel = xSobel;
            var ykernel = ySobel;

            ImageUtils image  = new ImageUtils();
            var        buffer = image.BitmapToBytes(srcImage);
            var        width  = image.Width;
            var        height = image.Height;
            var        bytes  = image.Bytes;
            var        result = new byte[bytes];

            directions = new double[bytes / 4];
            resultBuf  = new byte[bytes / 4];
            xGradients = new double[bytes / 4];
            yGradients = new double[bytes / 4];

            var rgb = 0.0;

            for (int i = 0; i < buffer.Length; i += 4)
            {
                rgb           = buffer[i] * .3f;
                rgb          += buffer[i + 1] * .6f;
                rgb          += buffer[i + 2] * .1f;
                buffer[i]     = (byte)rgb;
                buffer[i + 1] = buffer[i];
                buffer[i + 2] = buffer[i];
                buffer[i + 3] = 255;
            }
            var x       = 0.0;
            var y       = 0.0;
            var results = 0.0;

            var filterOffset = 1;
            var calcOffset   = 0;
            var byteOffset   = 0;

            for (var offsetY = filterOffset; offsetY < height - filterOffset; ++offsetY)
            {
                for (var offsetX = filterOffset; offsetX < width - filterOffset; ++offsetX)
                {
                    x       = y = 0;
                    results = 0.0;

                    byteOffset = offsetY * 4 * width + offsetX * 4;

                    for (var filterY = -filterOffset; filterY <= filterOffset; filterY++)
                    {
                        for (var filterX = -filterOffset; filterX <= filterOffset; filterX++)
                        {
                            calcOffset = byteOffset + filterX * 4 + filterY * 4 * width;
                            x         += (double)(buffer[calcOffset]) * xkernel[filterY + filterOffset, filterX + filterOffset];
                            y         += (double)(buffer[calcOffset]) * ykernel[filterY + filterOffset, filterX + filterOffset];
                        }
                    }
                    xGradients[byteOffset / 4] = x;
                    yGradients[byteOffset / 4] = y;
                    results += Math.Sqrt((x * x) + (y * y));

                    if (results > 255)
                    {
                        results = 255;
                    }
                    else if (results < 0)
                    {
                        results = 0;
                    }

                    if (x != 0)
                    {
                        var dirNotNorm = 57.29 * 1.0 / Math.Tan(y / x);
                        if (Math.Tan(y / x) == 0)
                        {
                            directions[byteOffset / 4] = 0;
                        }
                        else
                        {
                            directions[byteOffset / 4] = NormalizeDirection(dirNotNorm);
                        }
                    }
                    else
                    {
                        directions[byteOffset / 4] = 0;
                    }

                    resultBuf[byteOffset / 4] = (byte)results;

                    result[byteOffset]     = (byte)(results);
                    result[byteOffset + 1] = (byte)(results);
                    result[byteOffset + 2] = (byte)(results);
                    result[byteOffset + 3] = 255;
                }
            }
            return(image.BytesToBitmap(result));
        }