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."); }
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.") }
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; }
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); } }
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); }