public ZagImage <byte> SmoothMedian(ZagImage <byte> quantGradient, int k = 1) { ZagImage <byte> smoothQuantGradient = quantGradient.Copy(); for (int y = k; y < quantGradient.Height - k; y++) { for (int x = k; x < quantGradient.Width - k; x++) { var points = new List <byte>(); for (int i = -k; i <= k; i++) { for (int j = -k; j <= k; j++) { points.Add(quantGradient.Data[(y + i) * quantGradient.Stride + (x + j)]); } } smoothQuantGradient.Data[y * smoothQuantGradient.Stride + x] = points.OrderBy(a => a).ToArray()[points.Count() >> 1]; } } return(smoothQuantGradient); }
private ZagImage <byte> Convolution(ZagImage <byte> myImage, ConvMatrix Mask) { int s = Mask.Size / 2; var cImage = myImage.Copy(); for (int y = s; y < myImage.Height - s; y++) { for (int x = s; x < myImage.Width - s; x++) { int r = 0, g = 0, b = 0; for (int masky = 0; masky < Mask.Size; masky++) { for (int maskx = 0; maskx < Mask.Size; maskx++) { var maskValue = Mask.Matrix[maskx + masky * Mask.Size]; b += maskValue * myImage.Data[myImage.Depth * (x + maskx - s) + (y + masky - s) * myImage.Stride]; if (myImage.Depth == 3) { r += maskValue * myImage.Data[myImage.Depth * (x + maskx - s) + 2 + (y + masky - s) * myImage.Stride]; g += maskValue * myImage.Data[myImage.Depth * (x + maskx - s) + 1 + (y + masky - s) * myImage.Stride]; } } } b = Math.Min(Math.Max((b / Mask.Factor) + Mask.Offset, 0), 255); cImage.Data[myImage.Depth * x + y * myImage.Stride] = (byte)b; if (myImage.Depth == 3) { r = Math.Min(Math.Max((r / Mask.Factor) + Mask.Offset, 0), 255); g = Math.Min(Math.Max((g / Mask.Factor) + Mask.Offset, 0), 255); cImage.Data[myImage.Depth * x + 1 + y * myImage.Stride] = (byte)g; cImage.Data[myImage.Depth * x + 2 + y * myImage.Stride] = (byte)r; } } } return(cImage); }