Exemple #1
0
        /// <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));
        }
Exemple #3
0
 /// <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());
     }
 }
Exemple #4
0
        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());
     }
 }
Exemple #6
0
        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();
            }
        }
Exemple #8
0
		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;
		}
Exemple #9
0
		/// <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;
            }
        }