Exemple #1
0
        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);
        }
Exemple #2
0
        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);
        }