/// <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)); }
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); }
/// <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); }
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); }