Esempio n. 1
0
        public FloatImage Convolve(T image, FloatImage kernel)
        {
            var kw  = kernel.Width;
            var kh  = kernel.Height;
            var kxs = kw >> 1;
            var kys = kh >> 1;

            var   r     = new FloatImage(image.Width, image.Height);
            float total = kernel.Sum();

            for (var dy = 0; dy < image.Height; dy++)
            {
                for (var dx = 0; dx < image.Width; dx++)
                {
                    var v   = 0f;
                    var sum = 0f;
                    for (var ky = 0; ky < kh; ky++)
                    {
                        var sy = dy + ky - kys;
                        if (sy < 0 || image.Height <= sy)
                        {
                            continue;
                        }

                        for (var kx = 0; kx < kh; kx++)
                        {
                            var sx = dx + kx - kxs;
                            if (sx < 0 || image.Width <= sx)
                            {
                                continue;
                            }
                            var sv = image[sx, sy];
                            var kv = kernel[kx, ky];
                            v   += sv * kv;
                            sum += kv;
                        }
                    }

                    r[dx, dy] = total == sum ? v : (v * total / sum);
                }
            }

            return(r);
        }