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); }
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)); }
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()); }
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); }
//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); }
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); } } }
/// <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; }
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); }
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()); }