public void directEdgeOperation(DirectionEdgeMask directionEdgeMask, SccalingMethod sccalingMethod = SccalingMethod.Cut, KernelMethod kernelMethod = KernelMethod.NoBorders) { DirectBitmap directBitMapFinal = null; //Bitmaps for performing operations int[] bitmapPreScaleFirst = new int[directBitmapPre.Width * directBitmapPre.Height]; int[] bitmapPreScaleSecond = new int[directBitmapPre.Width * directBitmapPre.Height]; int[] maskFirst; int[] maskSecond; switch (directionEdgeMask) { case DirectionEdgeMask.Roberts: maskFirst = ImageProcessingEngine.RobertsFirst; maskSecond = ImageProcessingEngine.RobertsSecond; break; case DirectionEdgeMask.Sobel: maskFirst = ImageProcessingEngine.SobelFirst; maskSecond = ImageProcessingEngine.SobelSecond; break; case DirectionEdgeMask.Prewwit: maskFirst = ImageProcessingEngine.PrewwitFirst; maskSecond = ImageProcessingEngine.PrewwitSecond; break; } }
public int[] sobelPrewwitOperation(KernelMethod kernelMethod = KernelMethod.NoBorders, SccalingMethod sccalingMethod = SccalingMethod.Cut, DirectionEdgeMask directionEdgeMask = DirectionEdgeMask.Prewwit) { //TODO: Merge all neighborhood operations in little framework, big code redundancy, but its prototype so cool int[] bitmapPreScaleFirst = new int[directBitmapPre.Width * directBitmapPre.Height]; int[] bitmapPreScaleSecond = new int[directBitmapPre.Width * directBitmapPre.Height]; int[] resultImage = new int[directBitmapPre.Width * directBitmapPre.Height]; int xBond = kernelMethod == KernelMethod.NoBorders ? 1 : 0; List <int> maskSumFirst; List <int> maskSumSecond; int calculatedX; int calculatedY; int[] maskFirst = null; int[] maskSecond = null; switch (directionEdgeMask) { case DirectionEdgeMask.Prewwit: maskFirst = ImageProcessingEngine.PrewwitFirst; maskSecond = ImageProcessingEngine.PrewwitSecond; break; case DirectionEdgeMask.Sobel: maskFirst = ImageProcessingEngine.SobelFirst; maskSecond = ImageProcessingEngine.SobelSecond; break; } const int maskSize = 3; int overlap = 0; // = maskSize / 2; int maskOverlap = maskSize / 2; switch (kernelMethod) { case KernelMethod.NoBorders: overlap = maskSize / 2; break; case KernelMethod.CloneBorder: overlap = 0; break; case KernelMethod.UseExisting: overlap = 0; break; } for (int x = overlap; x < directBitmapPre.Width - overlap; ++x) { for (int y = overlap; y < directBitmapPre.Height - overlap; ++y) { maskSumFirst = new List <int>(); maskSumSecond = new List <int>(); for (int xi = 0; xi < 3; xi++) { for (int yi = 0; yi < 3; yi++) { calculatedX = x + xi - maskOverlap; calculatedY = y + yi - maskOverlap; if (kernelMethod == KernelMethod.UseExisting) { if (calculatedX >= directBitmapPre.Width || calculatedY >= directBitmapPre.Height || calculatedX < 0 || calculatedY < 0) { continue; } } else if (kernelMethod == KernelMethod.CloneBorder) { if (calculatedX >= directBitmapPre.Width || calculatedY >= directBitmapPre.Height || calculatedX < 0 || calculatedY < 0) { //mask[xi + (yi * maskSize)] maskSumFirst.Add(maskFirst[xi + (yi * 3)] * directBitmapPre.GetPixel(x, y).R); maskSumSecond.Add(maskSecond[xi + (yi * 3)] * directBitmapPre.GetPixel(x, y).R); continue; } } maskSumFirst.Add(maskFirst[xi + (yi * 3)] * directBitmapPre.GetPixel(calculatedX, calculatedY).R); maskSumSecond.Add(maskSecond[xi + (yi * 3)] * directBitmapPre.GetPixel(calculatedX, calculatedY).R); } } bitmapPreScaleFirst[x + (y * directBitmapPre.Width)] = Math.Abs(maskSumFirst.Sum()); bitmapPreScaleSecond[x + (y * directBitmapPre.Width)] = Math.Abs(maskSumSecond.Sum()); } } int finalPixel = 0; for (int x = 0; x < directBitmapPre.Width; x++) { for (int y = 0; y < directBitmapPre.Height; y++) { finalPixel = bitmapPreScaleFirst[x + (y * directBitmapPre.Width)] + bitmapPreScaleSecond[x + (y * directBitmapPre.Width)]; resultImage[x + (y * directBitmapPre.Width)] = finalPixel; } } int min = resultImage.Min(); int max = resultImage.Max(); // resultImage.Select(x => this.ScalePixelValue( x, sccalingMethod, min, max)); for (int i = 0; i < directBitmapPre.Height * directBitmapPost.Width; i++) { resultImage[i] = this.ScalePixelValue(resultImage[i], sccalingMethod, min, max); } directBitmapPost.load(resultImage); return(resultImage); }