Example #1
0
        /// <summary>
        /// Performs the Canny edge detection algorithm given a color image.
        /// The output is a texture that stores edge gradients in Red-Green
        ///     and edge strengths in Blue.
        /// Note that edge strength is equal to the length of the edge gradient.
        /// </summary>
        public static void FullCannyEdgeFilter(
            Texture inputTex, RenderTexture outputTex,
            GaussianBlurQuality blurQuality, GreyscaleTypes greyscaleMode, EdgeFilters edgeFilter,
            float weakEdgeThreshold, float strongEdgeThreshold,
            TextureWrapMode samplingWrapMode = TextureWrapMode.Clamp)
        {
            RenderTexture out_gaussian = RenderTexture.GetTemporary(
                inputTex.width, inputTex.height, 0,
                RenderTextureFormat.ARGB32, RenderTextureReadWrite.Linear),
                          out_greyscale = RenderTexture.GetTemporary(
                outputTex.width, outputTex.height, 0,
                RenderTextureFormat.RInt, RenderTextureReadWrite.Linear),
                          out_edgeDetect = RenderTexture.GetTemporary(
                outputTex.width, outputTex.height, 0,
                RenderTextureFormat.RGFloat, RenderTextureReadWrite.Linear);

            out_gaussian.filterMode   = FilterMode.Point;
            out_gaussian.wrapMode     = samplingWrapMode;
            out_greyscale.filterMode  = FilterMode.Point;
            out_greyscale.wrapMode    = samplingWrapMode;
            out_edgeDetect.filterMode = FilterMode.Point;
            out_edgeDetect.wrapMode   = samplingWrapMode;

            Blur(blurQuality, inputTex, out_gaussian, samplingWrapMode);
            Greyscale(greyscaleMode, out_gaussian, out_greyscale);
            EdgeFilter(edgeFilter, out_greyscale, out_edgeDetect, samplingWrapMode);
            CannyEdgeFilter(out_edgeDetect, outputTex,
                            weakEdgeThreshold, strongEdgeThreshold,
                            samplingWrapMode);

            RenderTexture.ReleaseTemporary(out_edgeDetect);
            RenderTexture.ReleaseTemporary(out_greyscale);
            RenderTexture.ReleaseTemporary(out_gaussian);
        }
 public void CopyToSquareCanvas_PropertiesAreNullOrEmpty_ReturnException()
 {
     // Arrange
     Bitmap sourceBitmap = null;
     // Act
     var result = EdgeFilters.CopyToSquareCanvas(sourceBitmap, -20);
 }
 public void ConvolutionFilter_ImageIsNull_ReturnsException()
 {
     // Arrange
     Bitmap sourceBitmap = null;
     // Act
     var result = EdgeFilters.ConvolutionFilter(sourceBitmap, Matrix.Laplacian3x3, new double[1, 0], 0, 0);
 }
        public void Laplacian3x3Filter_CompareBitmapSize_ReturnsBitmapSizeAfterTransformation()
        {
            // Arrange
            var sourceBitmap = new Bitmap(Properties.Resources.unitTestPropImage1);
            // Act
            var resultBitmap = EdgeFilters.Laplacian3x3Filter(sourceBitmap);

            // Assert
            Assert.AreEqual(sourceBitmap.Size, resultBitmap.Size);
        }
        public void Laplacian3x3Filter_CompareImageWithExistingResultFromOtherSoftware_ReturnsBitmapFiltered()
        {
            // Arrange
            var sourceBitmap   = new Bitmap(Properties.Resources.square);
            var existingResult = new Bitmap(Properties.Resources.square_laplacian);
            var resultBitmap   = EdgeFilters.LaplacianOfGaussianFilter(sourceBitmap);
            // Act
            var result = CompareImageWithPixel(existingResult, resultBitmap);

            // Assert
            Assert.IsTrue(result);
        }
        public void Sobel3x3FilterTest()
        {
            // Custom image used for test
            Bitmap TestImg = Properties.Resources.cherry;
            // Method result for comparison
            Bitmap Result;
            // Reference image for comparison
            Bitmap Reference = Properties.Resources.cherry_sobel;

            Result = EdgeFilters.Sobel3x3Filter(TestImg, false);

            Assert.IsTrue(CompareBitmap(Result, Reference));
        }
Example #7
0
        public static RenderTexture EdgeFilter(EdgeFilters type, Texture inputTex,
                                               RenderTextureFormat outFormat = RenderTextureFormat.RGFloat,
                                               TextureWrapMode wrapMode      = TextureWrapMode.Clamp)
        {
            var outTex = new RenderTexture(inputTex.width, inputTex.height, 0, outFormat,
                                           RenderTextureReadWrite.Linear);

            outTex.filterMode = FilterMode.Point;
            outTex.wrapMode   = wrapMode;

            EdgeFilter(type, inputTex, outTex, wrapMode);

            return(outTex);
        }
Example #8
0
        /// <summary>
        /// Performs the Canny edge detection algorithm given a color image.
        /// </summary>
        public static RenderTexture FullCannyEdgeFilter(
            Texture inputTex,
            GaussianBlurQuality blurQuality, GreyscaleTypes greyscaleMode, EdgeFilters edgeFilter,
            float weakEdgeThreshold, float strongEdgeThreshold,
            TextureWrapMode samplingWrapMode = TextureWrapMode.Clamp,
            RenderTextureFormat outFormat    = RenderTextureFormat.ARGBFloat)
        {
            var outTex = new RenderTexture(inputTex.width, inputTex.height, 0,
                                           outFormat, RenderTextureReadWrite.Linear);

            outTex.filterMode = FilterMode.Point;
            outTex.wrapMode   = samplingWrapMode;

            FullCannyEdgeFilter(inputTex, outTex,
                                blurQuality, greyscaleMode, edgeFilter,
                                weakEdgeThreshold, strongEdgeThreshold,
                                samplingWrapMode);

            return(outTex);
        }
Example #9
0
        public static void EdgeFilter(EdgeFilters type,
                                      Texture input, RenderTexture output,
                                      TextureWrapMode wrapMode = TextureWrapMode.Clamp)
        {
            //Allocate an intermediate texture for the two-pass blur.
            var tempTex = RenderTexture.GetTemporary(output.width, output.height, 0,
                                                     RenderTextureFormat.RGFloat,
                                                     RenderTextureReadWrite.Linear);

            tempTex.filterMode = FilterMode.Point;
            tempTex.wrapMode   = wrapMode;

            //Do the filter.
            Passes pass1, pass2;

            switch (type)
            {
            case EdgeFilters.Sobel:
                pass1 = Passes.Sobel_P1;
                pass2 = Passes.Sobel_P2;
                break;

            case EdgeFilters.Prewitt:
                pass1 = Passes.Prewitt_P1;
                pass2 = Passes.Prewitt_P2;
                break;

            default: throw new NotImplementedException(type.ToString());
            }
            var mat = UberFilterMat;

            Graphics.Blit(input, tempTex, mat, (int)pass1);
            Graphics.Blit(tempTex, output, mat, (int)pass2);

            //Clean up.
            RenderTexture.ReleaseTemporary(tempTex);
        }
 public void ApplyGreyScale_ByteArrayOutOfBounds_ReturnsIndexOutOfRangeException()
 {
     byte[] byteArray1 = new byte[1];
     EdgeFilters.ApplyGreyScale(byteArray1);
 }