示例#1
0
        public void CountArrayOf2DPoints()
        {
            Point[]        arrayp2d = Load2DPointTestData();
            HoughTransform _ht      = new HoughTransform(arrayp2d);

            var result = _ht.NumberOfInputPoints();

            Assert.True(result == 3, "The array of 2D Points has not been properly loaded.");
        }
示例#2
0
        public void HoughTransformOfOneLine()
        {
            Point[] arrayp2D   = PointsOfRect();
            double  Square2By2 = 2.82842712474619;

            HoughTransform _ht    = new HoughTransform(arrayp2D);
            var            result = _ht.FindLines();

            Assert.True(result.NumberOfLines == 1, "The number of lines is greater tha 1.");
            Assert.True(result[0].AngularAngle == 45, "The rect Angle is not 45 degree");
            Assert.True(result[0].Distance == Square2By2, "The Distance is not 2 * SquareRoot 2.")
        }
示例#3
0
        private async void ExtractParts(Bitmap bitmap, Bitmap originalBitmap)
        {
            var binarizedImage = BitmapBinarizer.Process(bitmap);
            var linesTask      = HoughTransform.GetLines(binarizedImage);
            var circlesTask    = HoughTransform.GetCircles(binarizedImage);
            var strip          = DoPerformStrip.IsChecked;

            var viewModel = (ImagesGrid.DataContext) as ImageViewModel;

            if (viewModel == null)
            {
                return;
            }
            viewModel.Clear();

            var rectanglesBitmapsTask = RectanglesExtractor.Extract(bitmap, originalBitmap, binarizedImage, await linesTask, strip);

            pbStatus.Value = 40;
            var trianglesBitmapsTask = TrianglesExtractor.Extract(bitmap, originalBitmap, binarizedImage, await linesTask, strip);

            pbStatus.Value = 60;
            var circleBitmapsTask = CirclesExtractor.Extract(bitmap, originalBitmap, await circlesTask, strip);

            pbStatus.Value = 80;

            var rectanglesBitmaps = await rectanglesBitmapsTask;

            foreach (var rectangleBitmap in rectanglesBitmaps[0])
            {
                viewModel.Rectangles.Add(new ImageModel(BitmapConverter.GetBitmapSource(rectangleBitmap)));
            }

            var trianglesBitmaps = await trianglesBitmapsTask;

            foreach (var triangleBitmap in trianglesBitmaps[0])
            {
                viewModel.Triangles.Add(new ImageModel(BitmapConverter.GetBitmapSource(triangleBitmap)));
            }

            var circleBitmaps = await circleBitmapsTask;

            foreach (var circlesBitmap in circleBitmaps[0])
            {
                viewModel.Circles.Add(new ImageModel(BitmapConverter.GetBitmapSource(circlesBitmap)));
            }
            PerformClassification(circleBitmaps, trianglesBitmaps, rectanglesBitmaps, viewModel);
            pbStatus.Value = 100;
        }
示例#4
0
        private async void ProcessFolder_Click(object sender, RoutedEventArgs e)
        {
            var dialog = new FolderBrowserDialog
            {
                SelectedPath = Environment.GetFolderPath(Environment.SpecialFolder.MyPictures)
            };
            var result = dialog.ShowDialog(this.GetIWin32Window());

            var storage = new Dictionary <string, Bitmap>();

            if (result == System.Windows.Forms.DialogResult.OK)
            {
                foreach (var path in Directory.EnumerateFiles(dialog.SelectedPath, "*.*", SearchOption.AllDirectories)
                         .Where(file => _imageFileExtensions.Any(x => file.EndsWith(x, StringComparison.OrdinalIgnoreCase))))
                {
                    var bitmap = BitmapConverter.GetBitmap(new BitmapImage(new Uri(path)));
                    bitmap = (from object filterObject in FiltersMenu.ItemsSource
                              select(filterObject as FilterModel) into filterModel
                              where filterModel.Enabled
                              select filterModel.Filter)
                             .Aggregate(bitmap, (current, filter) => filter.Process(current));

                    var binarizedImage = BitmapBinarizer.Process(bitmap);
                    var linesTask      = HoughTransform.GetLines(binarizedImage);
                    var circlesTask    = HoughTransform.GetCircles(binarizedImage);

                    var rectanglesBitmaps = await RectanglesExtractor.Extract(bitmap, bitmap, binarizedImage, await linesTask, true);

                    var trianglesBitmaps = await TrianglesExtractor.Extract(bitmap, bitmap, binarizedImage, await linesTask, true);

                    var circleBitmaps = await CirclesExtractor.Extract(bitmap, bitmap, await circlesTask, true);

                    bitmap =
                        rectanglesBitmaps[0].Concat(trianglesBitmaps[0])
                        .Concat(circleBitmaps[0])
                        .OrderBy(b => b.Width * b.Height).Last();
                    storage.Add(path, bitmap);
                }
            }

            foreach (var element in storage)
            {
                BilinearInterpolation.Resize(element.Value, ResizeWidth, ResizeHeight)
                .Save(element.Key + ".processed.bmp", ImageFormat.Bmp);
            }
        }
示例#5
0
        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            bitmap = new BitmapImage(new Uri(@"D:\Pictures\VLPR\沪KR9888.png"));
            //bitmap = new BitmapImage(new Uri(@"D:\Pictures\VLPR\苏B79999.jpg"));
            //bitmap = new BitmapImage(new Uri(@"D:\Users\zzq\Desktop\PIC\沪KR9888.png"));
            //bitmap = new BitmapImage(new Uri(@"D:\Users\zzq\Desktop\PIC\京N8P8F8.jpg"));
            //bitmap = new BitmapImage(new Uri(@"D:\Users\zzq\Desktop\PIC\贵C99999.jpg"));

            //image.Source = bitmap;



            var bytes = new byte[bitmap.PixelWidth * bitmap.PixelHeight * 4];

            var stride = bitmap.PixelWidth * bitmap.Format.BitsPerPixel / 8;

            bitmap.CopyPixels(bytes, stride, 0);

            imageRGB = new ImageMatRGB(bytes, bitmap.PixelWidth, bitmap.PixelHeight, ImageMatRGB.PixelBytesFormat.BGRA);
            imageHSV = imageRGB.ToImageHSV();

            //image.Source = imageRGB.ToWriteableBitmap();

            var bwImage       = imageHSV.ToImageBlackWhite((x, y, p) => p.H >= 200 && p.S >= 0.90 && p.V >= 100).Closing().Opening();
            var raw_regions   = bwImage.SearchConnectedRegion(8);
            var erase_regions = raw_regions.Where(kv => kv.Value.Count < 1000).Select(kv => kv.Value);
            var save_regions  = raw_regions.Where(kv => kv.Value.Count > 1000).Select(kv => kv.Value);

            //foreach (var region in erase_regions)
            //{
            //    foreach (var p in region)
            //    {
            //        bwImage[p.y][p.x] = false;
            //    }
            //}
            bwImage = bwImage.ToImageBlackWhite((x, y, p) =>
            {
                if (!p)
                {
                    return(false);
                }

                bool flag = false;


                for (int i = -1; i <= 1; i++)
                {
                    for (int j = -1; j <= 1; j++)
                    {
                        if (!bwImage[y + j][x + i])
                        {
                            flag = true;
                            break;
                        }
                    }
                }
                return(flag);
            });
            var bwImage2 = bwImage.ToImageBlackWhite((x, y, p) => false);

            for (int i = 0; i < bwImage.Width; i++)
            {
                for (int j = 0; j < bwImage.Height; j++)
                {
                    if (bwImage[j, i])
                    {
                        bwImage2[j, i] = true;
                        break;
                    }
                }
                for (int j = bwImage.Height - 1; j >= 0; j--)
                {
                    if (bwImage[j, i])
                    {
                        bwImage2[j, i] = true;
                        break;
                    }
                }
            }

            for (int i = 0; i < bwImage.Height; i++)
            {
                for (int j = 0; j < bwImage.Width; j++)
                {
                    if (bwImage[i, j])
                    {
                        bwImage2[i, j] = true;
                        break;
                    }
                }
                for (int j = bwImage.Width - 1; j >= 0; j--)
                {
                    if (bwImage[i, j])
                    {
                        bwImage2[i, j] = true;
                        break;
                    }
                }
            }

            bwImage = bwImage2;

            //image.Width = bitmap.PixelWidth;
            //image.Height = bitmap.PixelHeight;
            //image.Source = bwImage.ToWriteableBitmap();

            //return;
            HoughTransform houghTransform = new HoughTransform(bwImage, 500);

            houghTransform.Calculate();
            //ShowImage(houghTransform.SelectLines(40));


            var lines = houghTransform.SelectLines(30);
            //lines.Sort((a, b) => (int)(a.Distance - b.Distance));


            var showImage = imageRGB;

            foreach (var line in lines)
            {
                double cos = Math.Cos(line.Theta);
                double sin = Math.Sin(line.Theta);
                for (int i = 0; i < bwImage.Width; i++)
                {
                    int y = (int)((line.Distance - i * cos) / sin);
                    //Debug.WriteLine($"x:{i},y:{y}");
                    if (y >= bwImage.Height || y < 0)
                    {
                        continue;
                    }
                    showImage[y, i].R = 255;
                    showImage[y, i].G = 0;
                    showImage[y, i].B = 0;
                }

                for (int i = 0; i < bwImage.Height; i++)
                {
                    int x = (int)((line.Distance - i * sin) / cos);
                    if (x >= bwImage.Width || x < 0)
                    {
                        continue;
                    }
                    showImage[i, x].R = 255;
                    showImage[i, x].G = 0;
                    showImage[i, x].B = 0;
                }
            }
            //ShowImage(showImage);
            //image.Source = showImage.ToWriteableBitmap();
            //var k = bwImage.ToImageMatRGB();
            //image_HoughTransform(imageBW, k);
            //image.Source = k.ToWriteableBitmap();
            var img = InversePerspectiveHelper <ImageMatRGB, PixelRGB> .InversePerspective(imageRGB, lines);

            ShowImage(img);
        }