/// <summary> /// generates a normal map from a height map calculating it with a sobel filter /// </summary> /// <returns>The sobel filter.</returns> /// <param name="image">Image.</param> /// <param name="normalStrength">Normal strength.</param> public static Texture2D createNormalMap( Texture2D image, EdgeDetectionFilter filter, float normalStrength = 1f, bool invertX = false, bool invertY = false) { var resultTex = new Texture2D(Core.graphicsDevice, image.Width, image.Height, false, SurfaceFormat.Color); var srcData = new Color[image.Width * image.Height]; image.GetData <Color>(srcData); var destData = createNormalMap( srcData, filter, image.Width, image.Height, normalStrength, invertX, invertY); resultTex.SetData(destData); return(resultTex); }
private Bitmap EdgeDetection(Bitmap bitmap, FilterType filterType) { ConvolutionFilterBase filter = null; if (filterType == FilterType.EdgeDetection) { filter = new EdgeDetectionFilter(); } else if (filterType == FilterType.EdgeDetection45Degree) { filter = new EdgeDetection45DegreeFilter(); } else if (filterType == FilterType.EdgeDetectionHorizontal) { filter = new EdgeDetectionHorizontalFilter(); } else if (filterType == FilterType.EdgeDetectionTopLeft) { filter = new EdgeDetectionTopLeftFilter(); } else if (filterType == FilterType.EdgeDetectionVertical) { filter = new EdgeDetectionVerticalFilter(); } if (filter is null) { return(bitmap); } return(bitmap.ConvolutionFilter(filter)); }
/// <summary> /// Creates the bump map /// </summary> public virtual Bitmap Create(Bitmap Image) { Image.ThrowIfNull("Image"); CreateFilter(); using (Bitmap TempImage = EdgeDetectionFilter.ApplyFilter(Image)) { return(TempImage.BlackAndWhite()); } }
public static Color[] CreateNormalMap(Color[] srcData, EdgeDetectionFilter filter, int width, int height, float normalStrength = 1f, bool invertX = false, bool invertY = false) { // TODO: why does teh scharr algorithm require us to flip the y axis? if (filter == EdgeDetectionFilter.Scharr) { invertY = !invertY; } var invertR = invertX ? -1f : 1f; var invertG = invertY ? -1f : 1f; var destData = new Color[width * height]; for (var i = 1; i < width - 1; i++) { for (var j = 1; j < height - 1; j++) { var c = srcData[i + j * width].Grayscale().B / 255f; var r = srcData[i + 1 + j * width].Grayscale().B / 255f; var l = srcData[i - 1 + j * width].Grayscale().B / 255f; var t = srcData[i + (j - 1) * width].Grayscale().B / 255f; var b = srcData[i + (j + 1) * width].Grayscale().B / 255f; var bl = srcData[i - 1 + (j + 1) * width].Grayscale().B / 255f; var tl = srcData[i - 1 + (j - 1) * width].Grayscale().B / 255f; var br = srcData[i + 1 + (j + 1) * width].Grayscale().B / 255f; var tr = srcData[i + 1 + (j - 1) * width].Grayscale().B / 255f; float dX = 0f, dY = 0f; switch (filter) { case EdgeDetectionFilter.Sobel: dX = tl + l * 2 + bl - tr - r * 2 - br; dY = bl + 2 * b + br - tl - 2 * t - tr; break; case EdgeDetectionFilter.Scharr: dX = tl * 3 + l * 10 + bl * 3 - tr * 3 - r * 10 - br * 3; dY = tl * 3 + t * 10 + tr * 3 - bl * 3 - b * 10 - br * 3; break; case EdgeDetectionFilter.FiveTap: dX = ((l - c) + (c - r)) * 0.5f; dY = ((b - c) + (c - t)) * 0.5f; break; } var normal = Vector3.Normalize(new Vector3(dX * invertR, dY * invertG, 1 / normalStrength)); normal = normal * 0.5f + new Vector3(0.5f); destData[i + j * width] = new Color(normal.X, normal.Y, normal.Z, srcData[i + j * width].A / 255.0f); } } return(destData); }
/// <summary> /// Creates the bump map /// </summary> public virtual Bitmap Create(Bitmap Image) { if (Image == null) { throw new ArgumentNullException("Image"); } CreateFilter(); using (Bitmap TempImage = EdgeDetectionFilter.ApplyFilter(Image)) { return(TempImage.BlackAndWhite()); } }
public async void EdgeDetectionFilterButton() { var metroWindow = Application.Current.MainWindow as MetroWindow; var controller = await metroWindow.ShowProgressAsync("Proszę czekać...", "Trwa przetwarzanie obrazu"); controller.SetCancelable(false); controller.SetIndeterminate(); var edgeDetectionFilter = new EdgeDetectionFilter(); var newBitmap = edgeDetectionFilter.ExecuteFilter(this.ConvertFromBitmapImageToBitmap(this.DisplayedImage)); this.DisplayedImage = this.ConvertFromBitmapToBitmapImage(newBitmap); await controller.CloseAsync(); }
private void edgeDetectionFilter_Click(object sender, RoutedEventArgs e) { if (imageHandler != null) { // TODO Background worker new Thread(() => { EdgeDetectionFilter filter = new EdgeDetectionFilter(); imageHandler.ApplyFilter(image => filter.ApplyFilter(image)); Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.ApplicationIdle, new Action(() => { filteredImage.Source = BitmapLoader.loadBitmap(imageHandler.getFiltered()); })); }).Start(); } }
public static Color[] createNormalMap( Color[] srcData, EdgeDetectionFilter filter, int width, int height, float normalStrength = 1f, bool invertX = false, bool invertY = false ) { // TODO: why does teh scharr algorithm require us to flip the y axis? if( filter == EdgeDetectionFilter.Scharr ) invertY = !invertY; var invertR = invertX ? -1f : 1f; var invertG = invertY ? -1f : 1f; var destData = new Color[width * height]; for( var i = 1; i < width - 1; i++ ) { for( var j = 1; j < height - 1; j++ ) { var c = srcData[i + j * width].grayscale().B / 255f; var r = srcData[i + 1 + j * width].grayscale().B / 255f; var l = srcData[i - 1 + j * width].grayscale().B / 255f; var t = srcData[i + ( j - 1 ) * width].grayscale().B / 255f; var b = srcData[i + ( j + 1 ) * width].grayscale().B / 255f; var bl = srcData[i - 1 + ( j + 1 ) * width].grayscale().B / 255f; var tl = srcData[i - 1 + ( j - 1 ) * width].grayscale().B / 255f; var br = srcData[i + 1 + ( j + 1 ) * width].grayscale().B / 255f; var tr = srcData[i + 1 + ( j - 1 ) * width].grayscale().B / 255f; float dX = 0f, dY = 0f; switch( filter ) { case EdgeDetectionFilter.Sobel: dX = tl + l * 2 + bl - tr - r * 2 - br; dY = bl + 2 * b + br - tl - 2 * t - tr; break; case EdgeDetectionFilter.Scharr: dX = tl * 3 + l * 10 + bl * 3 - tr * 3 - r * 10 - br * 3; dY = tl * 3 + t * 10 + tr * 3 - bl * 3 - b * 10 - br * 3; break; case EdgeDetectionFilter.FiveTap: dX = ( ( l - c ) + ( c - r ) ) * 0.5f; dY = ( ( b - c ) + ( c - t ) ) * 0.5f; break; } var normal = Vector3.Normalize( new Vector3( dX * invertR, dY * invertG, 1 / normalStrength ) ); normal = normal * 0.5f + new Vector3( 0.5f ); destData[i + j * width] = new Color( normal.X, normal.Y, normal.Z, srcData[i + j * width].A ); } } return destData; }
/// <summary> /// generates a normal map from a height map calculating it with a sobel filter /// </summary> /// <returns>The sobel filter.</returns> /// <param name="image">Image.</param> /// <param name="normalStrength">Normal strength.</param> public static Texture2D createNormalMap( Texture2D image, EdgeDetectionFilter filter, float normalStrength = 1f, bool invertX = false, bool invertY = false ) { var resultTex = new Texture2D( Core.graphicsDevice, image.Width, image.Height, false, SurfaceFormat.Color ); var srcData = new Color[image.Width * image.Height]; image.GetData<Color>( srcData ); var destData = createNormalMap( srcData, filter, image.Width, image.Height, normalStrength, invertX, invertY ); resultTex.SetData( destData ); return resultTex; }
private void ApplayFilter(object sender, RoutedEventArgs e) { Button pickedFilter = sender as Button; System.Drawing.Bitmap bitmapCanvas = CanvasTool.getBitmapFromCanvas(); System.Drawing.Bitmap afterFilter; System.Windows.Controls.Image MyImg = new System.Windows.Controls.Image(); IntPtr hBitmap; FilterBase filter; switch (pickedFilter.Name) { case "EdgeDetection_Btn": filter = new EdgeDetectionFilter(); afterFilter = bitmapCanvas.ConvolutionFilter(filter); hBitmap = afterFilter.GetHbitmap(); MyImg.Source = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(hBitmap, IntPtr.Zero, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions()); main_canvas.Children.Clear(); main_canvas.Children.Add(MyImg); break; case "GaussianBlur_Btn": filter = new Gaussian3x3BlurFilter(); afterFilter = bitmapCanvas.ConvolutionFilter(filter); hBitmap = afterFilter.GetHbitmap(); MyImg.Source = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(hBitmap, IntPtr.Zero, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions()); main_canvas.Children.Clear(); main_canvas.Children.Add(MyImg); break; case "Soften_Btn": filter = new SoftenFilter(); afterFilter = bitmapCanvas.ConvolutionFilter(filter); hBitmap = afterFilter.GetHbitmap(); MyImg.Source = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(hBitmap, IntPtr.Zero, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions()); main_canvas.Children.Clear(); main_canvas.Children.Add(MyImg); break; case "HighPass_Btn": filter = new HighPass3x3Filter(); afterFilter = bitmapCanvas.ConvolutionFilter(filter); hBitmap = afterFilter.GetHbitmap(); MyImg.Source = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(hBitmap, IntPtr.Zero, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions()); main_canvas.Children.Clear(); main_canvas.Children.Add(MyImg); break; case "Median_Btn": afterFilter = MedianFilter.CalculateMedianFilter(bitmapCanvas, 3, 0, false); hBitmap = afterFilter.GetHbitmap(); MyImg.Source = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(hBitmap, IntPtr.Zero, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions()); main_canvas.Children.Clear(); main_canvas.Children.Add(MyImg); break; default: break; } }