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);
        }
Example #2
0
        public static RenderTexture Blur(GaussianBlurQuality quality, Texture inputTex,
                                         RenderTextureFormat outFormat = RenderTextureFormat.ARGB32,
                                         TextureWrapMode wrapMode      = TextureWrapMode.Clamp)
        {
            var outTex = new RenderTexture(inputTex.width, inputTex.height, 0, outFormat,
                                           RenderTextureReadWrite.Linear);

            outTex.filterMode = FilterMode.Bilinear;
            outTex.wrapMode   = wrapMode;

            Blur(quality, inputTex, outTex, wrapMode);

            return(outTex);
        }
Example #3
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 #4
0
        public static void Blur(GaussianBlurQuality quality,
                                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, output.format,
                                                     RenderTextureReadWrite.Linear);

            tempTex.filterMode = FilterMode.Bilinear;
            tempTex.wrapMode   = wrapMode;

            //Do the blur.
            Passes pass1, pass2;

            switch (quality)
            {
            case GaussianBlurQuality.Low:
                pass1 = Passes.Gaussian5_P1;
                pass2 = Passes.Gaussian5_P2;
                break;

            case GaussianBlurQuality.High:
                pass1 = Passes.Gaussian9_P1;
                pass2 = Passes.Gaussian9_P2;
                break;

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

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

            //Clean up.
            RenderTexture.ReleaseTemporary(tempTex);
        }