Пример #1
0
        private Bitmap DisplayAndTrackDrawingTool(Bitmap image)
        {
            //grayscale the image
            AForge.Imaging.Filters.Grayscale grayscaling = new AForge.Imaging.Filters.Grayscale(
                0.2125, 0.7154, 0.0721);
            image = grayscaling.Apply(image);

            //mirror the image
            AForge.Imaging.Filters.Mirror mirrImg = new AForge.Imaging.Filters.Mirror(false, true);
            mirrImg.ApplyInPlace(image);

            //get biggest blob
            AForge.Imaging.BlobCounter blobCounter = new AForge.Imaging.BlobCounter(image);
            blobCounter.ProcessImage(image);

            Rectangle[] rectsInImage = blobCounter.GetObjectsRectangles();
            this.txtBoxInfo.Text = rectsInImage.Length + " blobs found.";

            AForge.Imaging.Filters.ExtractBiggestBlob biggestBlob = new AForge.Imaging.Filters.ExtractBiggestBlob();
            Bitmap   bigstBlobImage = biggestBlob.Apply(image);
            IntPoint posBiggBlob    = biggestBlob.BlobPosition;

            this.txtBoxInfo.Text = "Biggest Blob at: " + posBiggBlob.ToString();

            //SetCursor(posBiggBlob);

            GenerateGraphics(posBiggBlob);

            return(image);
        }
Пример #2
0
        static void Main(string[] args)
        {
            // 画像の取得
            var img = new Bitmap(@"src.jpg");
            // 画像の解像度が2のべき乗になるように調整
            var bitWidth  = Convert.ToString(img.Width - 1, 2).Length;
            var bitHeight = Convert.ToString(img.Height - 1, 2).Length;
            var width     = (int)Math.Pow(2, bitWidth);
            var height    = (int)Math.Pow(2, bitHeight);
            // 隙間の部分はゼロ埋め
            var imgPadded = new Bitmap(width, height, img.PixelFormat);
            var graphics  = Graphics.FromImage(imgPadded);

            graphics.DrawImage(img, 0, 0);
            graphics.Dispose();
            // グレースケール化
            var gray = new AForge.Imaging.Filters.Grayscale(0.2125, 0.7154, 0.0721).Apply(imgPadded);
            // 高速フーリエ変換
            var complex = AForge.Imaging.ComplexImage.FromBitmap(gray);

            complex.ForwardFourierTransform();
            // 保存
            Bitmap img2 = complex.ToBitmap();

            img2.Save(@"dst.jpg");
            img2.Dispose();
        }
Пример #3
0
 public static Bitmap ToBlackAndWhite(this Bitmap bitmap)
 {
     // create grayscale filter (BT709)
     AForge.Imaging.Filters.Grayscale filter = new AForge.Imaging.Filters.Grayscale(0.2125, 0.7154, 0.0721);
     // apply the filter
     return(filter.Apply(bitmap));
 }
Пример #4
0
 static void Main(string[] args)
 {
     // 入力画像
     var img = new Bitmap(@"src.jpg");
     // グレースケール化
     var gray = new AForge.Imaging.Filters.Grayscale(0.2125, 0.7154, 0.0721).Apply(img);
     gray.Save(@"dst.jpg");
     gray.Dispose();
 }
Пример #5
0
        static void Main(string[] args)
        {
            // 入力画像
            var img = new Bitmap(@"src.jpg");
            // グレースケール化
            var gray = new AForge.Imaging.Filters.Grayscale(0.2125, 0.7154, 0.0721).Apply(img);

            gray.Save(@"dst.jpg");
            gray.Dispose();
        }
Пример #6
0
        public static Bitmap ProcessDataSetImage(Bitmap bitmap)
        {
            //var uProcessed = AForge.Imaging.UnmanagedImage.FromManagedImage(bitmap);
            AForge.Imaging.Filters.Grayscale grayFilter = new AForge.Imaging.Filters.Grayscale(0.2125, 0.7154, 0.0721);
            //AForge.Imaging.Filters.Grayscale grayFilter = new AForge.Imaging.Filters.Grayscale(0.5, 0.5, 0.5);
            var uProcessed = grayFilter.Apply(AForge.Imaging.UnmanagedImage.FromManagedImage(bitmap));

            AForge.Imaging.Filters.BradleyLocalThresholding threshldFilter = new AForge.Imaging.Filters.BradleyLocalThresholding();
            threshldFilter.PixelBrightnessDifferenceLimit = 0.15f;
            //AForge.Imaging.Filters.Threshold threshldFilter = new AForge.Imaging.Filters.Threshold(95);
            threshldFilter.ApplyInPlace(uProcessed);

            processSample(ref uProcessed);

            return(uProcessed.ToManagedImage());
        }
Пример #7
0
        /// <summary>
        /// Здесь надо инициализировать изображения
        /// </summary>
        public MagicEye()
        {
            //  Инициализация изображений - предобработанных шаблонов
            powers[0] = 0;
            int pwr = 1;

            for (int i = 0; i < 17; ++i)
            {
                powers[pwr] = i;
                pwr        *= 2;
            }
            samples = new Dictionary <int, AForge.Imaging.UnmanagedImage>();

            AForge.Imaging.Filters.Grayscale GSfilter = new AForge.Imaging.Filters.Grayscale(0.2125, 0.7154, 0.0721);

            //  Загружаем образцы чисел
            for (int i = 1; i < 14; ++i)
            {
                string fname = "Images/" + i.ToString() + ".jpg";
                AForge.Imaging.UnmanagedImage tmp = AForge.Imaging.UnmanagedImage.FromManagedImage(new Bitmap(fname));
                samples.Add(i, tmp);
            }
        }
Пример #8
0
 static void Main(string[] args)
 {
     // 画像の取得
     var img = new Bitmap(@"src.jpg");
     // 画像の解像度が2のべき乗になるように調整
     var bitWidth = Convert.ToString(img.Width - 1, 2).Length;
     var bitHeight = Convert.ToString(img.Height - 1, 2).Length;
     var width = (int)Math.Pow(2, bitWidth);
     var height = (int)Math.Pow(2, bitHeight);
     // 隙間の部分はゼロ埋め
     var imgPadded = new Bitmap(width, height, img.PixelFormat);
     var graphics = Graphics.FromImage(imgPadded);
     graphics.DrawImage(img, 0, 0);
     graphics.Dispose();
     // グレースケール化
     var gray = new AForge.Imaging.Filters.Grayscale(0.2125, 0.7154, 0.0721).Apply(imgPadded);
     // 高速フーリエ変換
     var complex = AForge.Imaging.ComplexImage.FromBitmap(gray);
     complex.ForwardFourierTransform();
     // 保存
     Bitmap img2 = complex.ToBitmap();
     img2.Save(@"dst.jpg");
     img2.Dispose();
 }
Пример #9
0
        public void ProcessImage(Bitmap bitmap, bool justShow)
        {
            //  «Распиливаем» изображение на 16 фрагментов - по отдельной плитке каждый

            //  Минимальная сторона изображения (обычно это высота)
            if (bitmap.Height > bitmap.Width)
            {
                throw new Exception("К такой забавной камере меня жизнь не готовила!");
            }
            int side = bitmap.Height;

            //  Отпиливаем границы, но не более половины изображения
            if (side < 4 * settings.border)
            {
                settings.border = side / 4;
            }
            side -= 2 * settings.border;

            Rectangle cropRect = new Rectangle((bitmap.Width - bitmap.Height) / 2 + settings.border, settings.border, side, side);

            original = new Bitmap(cropRect.Width, cropRect.Height);

            //  Рисуем рамки на оригинале
            Graphics g = Graphics.FromImage(original);

            g.DrawImage(bitmap, new Rectangle(0, 0, original.Width, original.Height), cropRect, GraphicsUnit.Pixel); Pen p = new Pen(Color.Red);

            //  Проверяем значение полей из settings
            if (side < 10 * settings.margin)
            {
                settings.margin = side / 10;
            }

            //  Высчитываем сторону блока для извлечения
            int sz        = side / 4 - 2 * settings.margin;
            int blockSide = side / 4;

            for (int r = 0; r < 4; ++r)
            {
                for (int c = 0; c < 4; ++c)
                {
                    g.DrawRectangle(p, new Rectangle(settings.margin + c * blockSide, settings.margin + r * blockSide, sz, sz));
                }
            }

            //  Рисуем цифры, которые распознались на предыдущем шаге?
            if (justShow)
            {
                DrawNumbersOnOriginalBitmap(g, blockSide);
            }

            //  Конвертируем изображение в градации серого
            AForge.Imaging.Filters.Grayscale grayFilter = new AForge.Imaging.Filters.Grayscale(0.2125, 0.7154, 0.0721);
            processed = grayFilter.Apply(AForge.Imaging.UnmanagedImage.FromManagedImage(original));

            //  Масштабируем изображение до 500x500 - этого достаточно
            AForge.Imaging.Filters.ResizeBilinear scaleFilter = new AForge.Imaging.Filters.ResizeBilinear(500, 500);
            original = scaleFilter.Apply(original);

            //  Если распознавание не планируем – просто выход
            if (justShow)
            {
                return;
            }

            //  Обнуляем state
            for (int i = 0; i < 16; ++i)
            {
                currentDeskState[i] = 0;
            }

            //  Пороговый фильтр применяем. Величина порога берётся из настроек, и меняется на форме
            AForge.Imaging.Filters.BradleyLocalThresholding threshldFilter = new AForge.Imaging.Filters.BradleyLocalThresholding();
            threshldFilter.PixelBrightnessDifferenceLimit = settings.differenceLim;
            threshldFilter.ApplyInPlace(processed);

            for (int r = 0; r < 4; ++r)
            {
                for (int c = 0; c < 4; ++c)
                {
                    //  Берём очередной фрагмент - с дополнительными отступами (мы же там нарисовали прямоугольники)
                    AForge.Imaging.Filters.Crop cropFilter = new AForge.Imaging.Filters.Crop(new Rectangle(2 + settings.margin + c * blockSide, 2 + settings.margin + r * blockSide, sz - 4, sz - 4));
                    arrayPics[r, c] = cropFilter.Apply(processed);

                    //arrayPics[r, c] = processed.Clone(new Rectangle(2+settings.margin + c * blockSide, 2+settings.margin + r * blockSide, sz-4, sz-4), processed.PixelFormat);
                    //  И выполняем сопоставление
                    processSample(r, c);
                }
            }
            DrawNumbersOnOriginalBitmap(g, blockSide);
        }
Пример #10
0
        //główne operacje na obrazie
        public void ocr()
        {
            //otworzenie pliku
            FileStream srcstream = new FileStream(pic_file, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
            //stworzenie bitmapy
            Bitmap source = new Bitmap(srcstream);
            //zmiana ustawień webform

            Panel1.Visible = false;
            Image1.Dispose();

            Label2.Text = "Processing...";
            Panel3.Visible = true;

            //Preperation code
            Bitmap ext = source;

            //AForge.Imaging.Filters.
            //Przekształcenie obrazu na skalę odcieni szarości - testować dla obrazów o różnej kolorystyce(opracować system wyznaczania parametrów filtru na podstawie RGB zdjęcia)
            AForge.Imaging.Filters.Grayscale grScl = new AForge.Imaging.Filters.Grayscale(0.2125, 0.0154, 0.0721 );
            source = grScl.Apply(source);
            //Zwiększenie kontrastu
            AForge.Imaging.Filters.ContrastStretch conCor = new AForge.Imaging.Filters.ContrastStretch();

            source = conCor.Apply(source);
            //Wyostrzenie
            AForge.Imaging.Filters.Sharpen shp = new AForge.Imaging.Filters.Sharpen();
            source = shp.Apply(source);

            //Segmentation code
            bool procesed = false;
               // Image2.Width = 350;
               // Image2.Height = (int)((source.Height * 200) / source.Width);

            try
            {
                Emgu.CV.Image<Bgr, Byte> to_rec = new Emgu.CV.Image<Bgr, byte>(source);
                Do_ocr = new Tesseract("tessdata", "eng", Tesseract.OcrEngineMode.OEM_DEFAULT);
                try
                {
                    Do_ocr.Recognize<Bgr>(to_rec);
                    //recognizedText.Text = ocr.GetText();
                    PastOCRBox.Text = Do_ocr.GetText();
                   // StatusBox.Text = "Finished! Ready for next one...";
                    Do_ocr.Dispose();
                    to_rec.Dispose();
                }
                catch (Exception exp)
                {
                    Label2.Text = "Recognition error! " + exp.Message;
                    Do_ocr.Dispose();
                    return;
                }
            }
            catch (Exception exp)
            {
                Label2.Text = "OCR engine failed! " + exp.Message;
                return;
            }

            //czyszczenie z plików tymczasowych

              //  source.Save("D:\\test.bmp");
              //  ext.Save("D:\\testcor.bmp");
            source.Dispose();
            srcstream.Close();
            srcstream.Dispose();
            //System.IO.File.Delete(pic_file);
            System.IO.File.Delete(Server.MapPath("~/img/prev.bmp"));
            System.IO.File.Delete(Server.MapPath("~/img/tmp.bmp"));
            //przygotować wygląd strony po rozpoznawaniu
            Panel3.Visible = false;
            Label1.Visible = false;
            Panel0.Visible = false;
            Panel5.Visible = false;

            Panel4.Visible = true;
        }
        public Bitmap CreateMosaic(int grid_width, int grid_height, string sourceFolder, Bitmap original_img, bool ColourMosaic)
        {
            int original_width  = original_img.Width;
            int original_height = original_img.Height;

            //int grid_side = 30;
            int sub_image_width  = (int)(original_width / (double)grid_width);
            int sub_image_height = (int)(original_height / (double)grid_height);

            Console.WriteLine($"Sub image: {sub_image_width} x {sub_image_height}");
            Console.WriteLine($"Sub image pixels: {grid_width * sub_image_width} x {grid_height * sub_image_height} == {original_width} x {original_height}");

            AForge.Imaging.Filters.ResizeNearestNeighbor resize    = new AForge.Imaging.Filters.ResizeNearestNeighbor(sub_image_width, sub_image_height);
            AForge.Imaging.Filters.Grayscale             grayscale = new AForge.Imaging.Filters.Grayscale(1 / 3.0, 1 / 3.0, 1 / 3.0);

            string[] files = Directory.GetFiles(sourceFolder);

            Bitmap   combined_image = new Bitmap(original_width, original_height);
            Graphics g = Graphics.FromImage(combined_image);

            Bitmap original_gray = grayscale.Apply(original_img);

            Bitmap[] original_slices = new Bitmap[grid_width * grid_height];
            for (int i = 0; i < grid_width; i++)
            {
                for (int j = 0; j < grid_height; j++)
                {
                    if (CancelProcessing)
                    {
                        return(null);
                    }
                    Rectangle rect = new Rectangle(i * sub_image_width, j * sub_image_height, sub_image_width, sub_image_height);
                    AForge.Imaging.Filters.Crop crop_region = new AForge.Imaging.Filters.Crop(rect);
                    Bitmap slice = (ColourMosaic == true) ? crop_region.Apply(original_img) : crop_region.Apply(original_gray);
                    original_slices[i * grid_width + j] = slice;
                }
            }

            Bitmap[] candidates = new Bitmap[files.Length];
            for (int i = 0; i < candidates.Length; i++)
            {
                if (i % 100 == 0 || i + 100 > candidates.Length)
                {
                    int PercentComplete = (int)((100.0 * i) / candidates.Length);
                    Console.WriteLine($"Candidate preprocessing progress: {PercentComplete}%");
                    OnProcessingProgressChanged(new ProcessingProgressEventArgs()
                    {
                        PercentComplete = PercentComplete, ProcessingTask = "Preprocessing..."
                    });
                }

                if (CancelProcessing)
                {
                    return(null);
                }

                if (!IsImage(files[i]))
                {
                    continue;
                }

                Bitmap candidate_image = AForge.Imaging.Image.FromFile(files[i]);
                Bitmap candidate_gray;
                Bitmap resized_image;
                if (IsGrayScale(candidate_image) && false)
                {
                    if (ColourMosaic)
                    {
                        continue;
                    }

                    resized_image = resize.Apply(candidate_image);
                }
                else
                {
                    if (ColourMosaic)
                    {
                        resized_image = resize.Apply(candidate_image);
                    }
                    else
                    {
                        candidate_gray = grayscale.Apply(candidate_image);
                        resized_image  = resize.Apply(candidate_gray);
                    }
                }

                candidates[i] = resized_image;
            }

            List <int> used_indices = new List <int>();
            int        step         = 0;

            for (int i = 0; i < grid_width; i++)
            {
                for (int j = 0; j < grid_height; j++)
                {
                    if (CancelProcessing)
                    {
                        return(null);
                    }
                    int PercentComplete = (int)((100.0 * step) / (grid_width * grid_height - 1));
                    OnProcessingProgressChanged(new ProcessingProgressEventArgs()
                    {
                        PercentComplete = PercentComplete, ProcessingTask = "Creating mosaic..."
                    });
                    Console.WriteLine($"Finding best match to slice {step}/{grid_width * grid_height - 1}...");
                    int best_match_index = FindBestMatch(original_slices[step], candidates, used_indices);
                    used_indices.Add(best_match_index);
                    Bitmap sub_image = candidates[best_match_index];
                    int    cornerX   = i * sub_image_width;
                    int    cornerY   = j * sub_image_height;
                    g.DrawImage(sub_image, new Point(cornerX, cornerY));
                    step++;
                }
            }

            combined_image.Save("combined_image.jpg");

            return(combined_image);
        }
Пример #12
0
        void videoPlayer_NewFrame(object sender, ref System.Drawing.Bitmap image)
        {
            //do something, we got a new frame from the video source.
            lock (this)
            {
                if (bIsMotionDetectionOn)
                {
                    if (motionDetector != null)
                    {
                        float motionLevel = motionDetector.ProcessFrame(image);
                    }
                }

                if (bIsColorFilteringOn)
                {
                    //try filtering for a color

                    AForge.Imaging.Filters.HSLFiltering hslFilter = new AForge.Imaging.Filters.HSLFiltering();

                    // set color ranges to keep
                    if (this.userhslFilter != null)
                    {
                        //hslFilter = this.userhslFilter;

                        // apply the filter
                        //hslFilter.ApplyInPlace(image);



                        hslFilter.Hue = new IntRange(335, 0);//335,0 = nice saturated red
                        //hslFilter.Hue = new IntRange(45, 65);//yellow
                        //hslFilter.Hue = new IntRange(170, 190);//light blue
                        //hslFilter.Saturation = new DoubleRange(0.5, 1);
                        hslFilter.Saturation = new DoubleRange(0.5, 1).ToIntRange(false);
                        //hslFilter.Luminance = new DoubleRange(0.1, 1);
                        hslFilter.Luminance = new DoubleRange(0.1, 1).ToIntRange(false);
                        hslFilter.ApplyInPlace(image);

                        /*
                         * hslFilter.Hue.Max = Convert.ToInt32(selectedColor.GetHue());
                         * hslFilter.Hue.Min = Convert.ToInt32(selectedColor.GetHue());
                         * hslFilter.Luminance.Max = Convert.ToDouble(selectedColor.GetBrightness());
                         * hslFilter.Luminance.Min = 0.01;
                         * hslFilter.Saturation.Max = Convert.ToDouble(selectedColor.GetSaturation());
                         * hslFilter.Saturation.Min = 0.01;
                         */


                        /*
                         * AForge.Imaging.Filters.ColorFiltering colorFiltering = new AForge.Imaging.Filters.ColorFiltering();
                         * colorFiltering.Red = new IntRange(150,255);
                         * colorFiltering.Green = new IntRange(0, 70);
                         * colorFiltering.Blue = new IntRange(0, 70);
                         * colorFiltering.ApplyInPlace(image);
                         */
                        /*
                         * AForge.Imaging.Filters.EuclideanColorFiltering euclidClrFltr = new AForge.Imaging.Filters.EuclideanColorFiltering();
                         * //euclidClrFltr.CenterColor = Color.FromArgb(200, 0, 0);
                         * euclidClrFltr.CenterColor = Color.Empty;
                         * euclidClrFltr.CenterColor = Color.FromName(selectedColor.Name);
                         * euclidClrFltr.Radius = 100;
                         * euclidClrFltr.ApplyInPlace(image);
                         * */
                    }
                }

                if (this.bIsBlobCountingOn)
                {
                    //grayscale the filtered image.
                    AForge.Imaging.Filters.Grayscale grayscaling = new AForge.Imaging.Filters.Grayscale(
                        0.2125, 0.7154, 0.0721);
                    image = grayscaling.Apply(image);

                    //blob detection
                    ProcessBlobs(image);
                }
            }
        }
Пример #13
0
 /// <summary>
 /// Generates the filtered Image.
 /// </summary>
 public Bitmap process(Bitmap frame)
 {
     Bitmap grayImage;
     if (frame != null)
     {
         AForge.Imaging.Filters.Grayscale filter = new AForge.Imaging.Filters.Grayscale(redValue, greenValue, blueValue);
         grayImage = filter.Apply(frame);
     }
     else
     {
         grayImage = null;
     }
     return grayImage;
 }
Пример #14
0
        public bool ProcessImage(Bitmap bitmap)
        {
            // На вход поступает необработанное изображение с веб-камеры

            //  Минимальная сторона изображения (обычно это высота)
            if (bitmap.Height > bitmap.Width)
            {
                throw new Exception("К такой забавной камере меня жизнь не готовила!");
            }
            //  Можно было, конечено, и не кидаться эксепшенами в истерике, но идите и купите себе нормальную камеру!
            int side = bitmap.Height;

            //  Отпиливаем границы, но не более половины изображения
            if (side < 4 * settings.border)
            {
                settings.border = side / 4;
            }
            side -= 2 * settings.border;

            //  Мы сейчас занимаемся тем, что красиво оформляем входной кадр, чтобы вывести его на форму
            Rectangle cropRect = new Rectangle((bitmap.Width - bitmap.Height) / 2 + settings.left + settings.border, settings.top + settings.border, side, side);

            //  Тут создаём новый битмапчик, который будет исходным изображением
            original = new Bitmap(cropRect.Width, cropRect.Height);

            //  Объект для рисования создаём
            Graphics g = Graphics.FromImage(original);

            g.DrawImage(bitmap, new Rectangle(0, 0, original.Width, original.Height), cropRect, GraphicsUnit.Pixel);
            Pen p = new Pen(Color.Red);

            p.Width = 1;

            //  Теперь всю эту муть пилим в обработанное изображение
            AForge.Imaging.Filters.Grayscale grayFilter = new AForge.Imaging.Filters.Grayscale(0.2125, 0.7154, 0.0721);
            var uProcessed = grayFilter.Apply(AForge.Imaging.UnmanagedImage.FromManagedImage(original));


            int blockWidth  = original.Width / settings.blocksCount;
            int blockHeight = original.Height / settings.blocksCount;

            for (int r = 0; r < settings.blocksCount; ++r)
            {
                for (int c = 0; c < settings.blocksCount; ++c)
                {
                    //  Тут ещё обработку сделать
                    g.DrawRectangle(p, new Rectangle(c * blockWidth, r * blockHeight, blockWidth, blockHeight));
                }
            }


            //  Масштабируем изображение до 500x500 - этого достаточно
            AForge.Imaging.Filters.ResizeBilinear scaleFilter = new AForge.Imaging.Filters.ResizeBilinear(settings.orignalDesiredSize.Width, settings.orignalDesiredSize.Height);
            uProcessed = scaleFilter.Apply(uProcessed);
            original   = scaleFilter.Apply(original);
            g          = Graphics.FromImage(original);
            //  Пороговый фильтр применяем. Величина порога берётся из настроек, и меняется на форме
            AForge.Imaging.Filters.BradleyLocalThresholding threshldFilter = new AForge.Imaging.Filters.BradleyLocalThresholding();
            threshldFilter.PixelBrightnessDifferenceLimit = settings.differenceLim;
            threshldFilter.ApplyInPlace(uProcessed);


            if (settings.processImg)
            {
                string info = processSample(ref uProcessed);
                Font   f    = new Font(FontFamily.GenericSansSerif, 20);
                g.DrawString(info, f, Brushes.Black, 30, 30);
            }

            processed = uProcessed.ToManagedImage();

            return(true);
        }
Пример #15
0
        public Bitmap getProcessedImage(Bitmap bitmap)
        {
//            if (bitmap.Height > bitmap.Width)
//                throw new Exception("К такой забавной камере меня жизнь не готовила!");
            //  Можно было, конечено, и не кидаться эксепшенами в истерике, но идите и купите себе нормальную камеру!
            int side = bitmap.Height;

            //  Отпиливаем границы, но не более половины изображения
            if (side < 4 * settings.border)
            {
                settings.border = side / 4;
            }
            side -= 2 * settings.border;

            //  Мы сейчас занимаемся тем, что красиво оформляем входной кадр, чтобы вывести его на форму
            Rectangle cropRect = new Rectangle((bitmap.Width - bitmap.Height),
                                               0, side, side);

            //  Тут создаём новый битмапчик, который будет исходным изображением
            original = new Bitmap(cropRect.Width, cropRect.Height);

            //  Объект для рисования создаём
            Graphics g = Graphics.FromImage(original);

            g.DrawImage(bitmap, new Rectangle(0, 0, original.Width, original.Height), cropRect, GraphicsUnit.Pixel);
            Pen p = new Pen(Color.Red);

            p.Width = 1;

            //  Теперь всю эту муть пилим в обработанное изображение
            AForge.Imaging.Filters.Grayscale grayFilter = new AForge.Imaging.Filters.Grayscale(0.2125, 0.7154, 0.0721);
            var uProcessed = grayFilter.Apply(AForge.Imaging.UnmanagedImage.FromManagedImage(original));


            int blockWidth  = original.Width / settings.blocksCount;
            int blockHeight = original.Height / settings.blocksCount;

            for (int r = 0; r < settings.blocksCount; ++r)
            {
                for (int c = 0; c < settings.blocksCount; ++c)
                {
                    //  Тут ещё обработку сделать
                    g.DrawRectangle(p, new Rectangle(c * blockWidth, r * blockHeight, blockWidth, blockHeight));
                }
            }


            //  Масштабируем изображение до 500x500 - этого достаточно
            AForge.Imaging.Filters.ResizeBilinear scaleFilter =
                new AForge.Imaging.Filters.ResizeBilinear(settings.orignalDesiredSize.Width,
                                                          settings.orignalDesiredSize.Height);
            uProcessed = scaleFilter.Apply(uProcessed);
            original   = scaleFilter.Apply(original);
            g          = Graphics.FromImage(original);
            //  Пороговый фильтр применяем. Величина порога берётся из настроек, и меняется на форме
            AForge.Imaging.Filters.Threshold threshldFilter = new AForge.Imaging.Filters.Threshold();
            threshldFilter.ThresholdValue = settings.threshold;
            threshldFilter.ApplyInPlace(uProcessed);

            return(uProcessed.ToManagedImage());
        }