예제 #1
0
        /// <summary>
        /// Processes the <paramref name="inputImage"/>.
        /// </summary>
        /// <param name="inputImage">Image to process.</param>
        /// <returns>Processed image.</returns>
        public override Image Process(Image inputImage)
        {
            if (inputImage == null)
            {
                throw new ArgumentNullException(nameof(inputImage));
            }

            int[] factors = MakeBinominalFactors(KernelSize.GetKernelNumber());
            int[] weights = MakeWeights(factors);

            var bounds    = this.GetProcessingBounds(inputImage);
            int weightSum = weights.Sum();

            if (ProcessAllPlanes)
            {
                foreach (var plane in inputImage.Planes)
                {
                    ProcessPlane(plane, weights, bounds, weightSum);
                }
            }
            else
            {
                ProcessPlane(inputImage.Planes[PlaneIndex], weights, bounds, weightSum);
            }

            return(inputImage);
        }
예제 #2
0
 protected override void EncodeParameterCore(ref string res)
 {
     res += OutScale.ToString() + " ";
     res += KernelSize.ToString() + " ";
     res += KernelExpand.ToString() + " ";
     res += OptimizerType.ToString() + " ";
     res += Rho.ToString() + " ";
 }
    public override void InitializeParameters()
    {
        //focusDistance
        if ((m_fromSettings != null && m_fromSettings.active && m_fromSettings.focusDistance.overrideState) ||
            (m_toSettings != null && m_toSettings.active && m_toSettings.focusDistance.overrideState))
        {
            m_tempSettings.focusDistance.overrideState = true;
        }
        else
        {
            m_tempSettings.focusDistance.overrideState = false;
        }
        focusDistance.x = m_fromSettings != null && m_fromSettings.active && m_fromSettings.focusDistance.overrideState ? m_fromSettings.focusDistance.value : m_tempSettings.focusDistance.value;
        focusDistance.y = m_toSettings != null && m_toSettings.active && m_toSettings.focusDistance.overrideState ? m_toSettings.focusDistance.value : m_tempSettings.focusDistance.value;

        //aperture
        if ((m_fromSettings != null && m_fromSettings.active && m_fromSettings.aperture.overrideState) ||
            (m_toSettings != null && m_toSettings.active && m_toSettings.aperture.overrideState))
        {
            m_tempSettings.aperture.overrideState = true;
        }
        else
        {
            m_tempSettings.aperture.overrideState = false;
        }
        aperture.x = m_fromSettings != null && m_fromSettings.active && m_fromSettings.aperture.overrideState ? m_fromSettings.aperture.value : m_tempSettings.aperture.value;
        aperture.y = m_toSettings != null && m_toSettings.active && m_toSettings.aperture.overrideState ? m_toSettings.aperture.value : m_tempSettings.aperture.value;

        //focalLength
        if ((m_fromSettings != null && m_fromSettings.active && m_fromSettings.focalLength.overrideState) ||
            (m_toSettings != null && m_toSettings.active && m_toSettings.focalLength.overrideState))
        {
            m_tempSettings.focalLength.overrideState = true;
        }
        else
        {
            m_tempSettings.focalLength.overrideState = false;
        }
        focalLength.x = m_fromSettings != null && m_fromSettings.active && m_fromSettings.focalLength.overrideState ? m_fromSettings.focalLength.value : m_tempSettings.focalLength.value;
        focalLength.y = m_toSettings != null && m_toSettings.active && m_toSettings.focalLength.overrideState ? m_toSettings.focalLength.value : m_tempSettings.focalLength.value;

        //kernelSize
        if ((m_fromSettings != null && m_fromSettings.active && m_fromSettings.kernelSize.overrideState) ||
            (m_toSettings != null && m_toSettings.active && m_toSettings.kernelSize.overrideState))
        {
            m_tempSettings.kernelSize.overrideState = true;
        }
        else
        {
            m_tempSettings.kernelSize.overrideState = false;
        }
        fromKernelSize = m_fromSettings != null && m_fromSettings.active && m_fromSettings.kernelSize.overrideState ? m_fromSettings.kernelSize.value : m_tempSettings.kernelSize.value;
        toKernelSize   = m_toSettings != null && m_toSettings.active && m_toSettings.kernelSize.overrideState ? m_toSettings.kernelSize.value : m_tempSettings.kernelSize.value;
    }
예제 #4
0
        /// <summary>
        /// Calculate a laplace kernel for the given <paramref name="kernelSize"/>.
        /// </summary>
        /// <param name="kernelSize">Kernel size to calculate laplace kernel for.</param>
        /// <returns>Calculated laplace kernel.</returns>
        private static int[] CalculateKernel(KernelSize kernelSize)
        {
            int kernelNum     = kernelSize.GetKernelNumber();
            int fullKernelNum = kernelNum * kernelNum;
            var kernel        = new int[fullKernelNum];

            for (int i = 0; i < kernel.Length; i++)
            {
                kernel[i] = 1;
            }
            kernel[(int)System.Math.Floor(fullKernelNum / 2.0)] = 1 - fullKernelNum;

            return(kernel);
        }
예제 #5
0
        internal Kernel(KernelSize size)
        {
            Size = (uint)size;
            ConvolutionMatrix = new double[Size, Size];
            uint count = Size * Size;

            for (uint x = 0; x < Size; x++)
            {
                for (uint y = 0; y < Size; y++)
                {
                    ConvolutionMatrix[x, y] = 1.0 / count;
                }
            }
        }
예제 #6
0
 public override void Reset()
 {
     ActiveLayer         = true;
     ActiveEffect        = true;
     ObjectProfile       = null;
     FocusDistanceActive = true;
     FocusDistance       = 0f;
     ApertureActive      = true;
     Aperture            = 0f;
     FocalActive         = true;
     FocalLength         = 0;
     MaxBlurActive       = true;
     MaxBlur             = 0;
     everyFrame          = false;
 }
        public ImageBlur(KernelSize kernelSize, int blurAmount)
        {
            switch (kernelSize)
            {
            case KernelSize.Small:
                this.kernelSize = 5; break;

            case KernelSize.Medium:
                this.kernelSize = 7; break;

            case KernelSize.Large:
                this.kernelSize = 11; break;
            }
            this.blurAmount = blurAmount;
        }
        public ImageBlur(Bitmap bitmap, KernelSize kernelSize, int blurAmount)
        {
            bmp = bitmap.Clone(new Rectangle(0, 0, bitmap.Width, bitmap.Height), bitmap.PixelFormat);
            switch (kernelSize)
            {
            case KernelSize.Small:
                this.kernelSize = 5; break;

            case KernelSize.Medium:
                this.kernelSize = 7; break;

            case KernelSize.Large:
                this.kernelSize = 11; break;
            }
            this.blurAmount = blurAmount;
        }
예제 #9
0
    public void SetKernelSize(KernelSize size)
    {
        if (this.Size != size)
        {
            if (size == KernelSize.Five)
            {
                this.Values = kernelValues5X5;
            }
            else
            {
                this.Values = kernelValues3X3;
            }

            this.Size = size;
        }
    }
예제 #10
0
        /// <summary>
        /// Gets the number representing the given <paramref name="kernel"/>.
        /// </summary>
        /// <param name="kernel">Size to get number representation for.</param>
        /// <returns>Number representation for the given <paramref name="kernel"/>.</returns>
        public static int GetKernelNumber(this KernelSize kernel)
        {
            switch (kernel)
            {
            case KernelSize.ThreeByThree:
                return(3);

            case KernelSize.FiveByFive:
                return(5);

            case KernelSize.SevenBySeven:
                return(7);

            default:
                throw new ArgumentException("Unknown kernel size", nameof(kernel));
            }
        }
예제 #11
0
 public KernelSizeValue(KernelSizeParameter parameter)
 {
     value         = parameter.value;
     overrideState = parameter.overrideState;
 }
예제 #12
0
 public KernelSizeValue(KernelSize value, bool overrideState)
 {
     this.value         = value;
     this.overrideState = overrideState;
 }
예제 #13
0
        public static ImagePlane ProcessMonoKernel(ImagePlane plane, Func <byte?[], byte> processingFunc, KernelSize kernel, ProcessingBounds bounds)
        {
            if (plane.TryGetLinearAccess(out LinearAccessData data))
            {
                var newImage = Image.FromPlanes(MappingOption.CopyPixels, plane);
                var newData  = newImage.Planes[0].GetLinearAccess();
                var yInc     = (int)data.YInc;
                var xInc     = (int)data.XInc;
                var newYInc  = (int)newData.YInc;
                var newXInc  = (int)newData.XInc;

                int boundHeight = plane.Parent.Height - 1;
                int boundWidth  = plane.Parent.Width - 1;
                int startY      = bounds.StartY;
                int startX      = bounds.StartX;
                int boundsY     = startY + bounds.Height;
                int boundsX     = startX + bounds.Width;

                int kernelSize    = kernel.GetKernelNumber();
                int kernelArrSize = kernelSize * kernelSize;
                var kernelFac     = (int)System.Math.Floor(kernelSize / 2.0);

                unsafe
                {
                    var pBase    = (byte *)data.BasePtr;
                    var pBaseNew = (byte *)newData.BasePtr;

                    Parallel.For(startY, boundsY, (y) =>
                    {
                        var kernelValues = new byte?[kernelArrSize];
                        var pLine        = pBase + y * yInc;
                        int newLineInc   = newYInc * y;

                        for (int x = startX; x < boundsX; x++)
                        {
                            int kernelCounter = -1;
                            var pMiddle       = pLine + xInc * x;
                            for (int kRow = -kernelFac; kRow <= kernelFac; kRow++)
                            {
                                byte *pKLine = pMiddle + kRow * yInc;
                                int yKRow    = y + kRow;
                                for (int kColumn = -kernelFac; kColumn <= kernelFac; kColumn++)
                                {
                                    kernelCounter++;
                                    int xKColumn = x + kColumn;
                                    if (yKRow < 0 || yKRow > boundHeight || xKColumn < 0 || xKColumn > boundWidth)
                                    {
                                        continue;
                                    }

                                    byte *pPixel = pKLine + kColumn * xInc;
                                    kernelValues[kernelCounter] = *pPixel;
                                }
                            }

                            if (kernelValues.Any(b => b.HasValue))
                            {
                                var pTargetLine  = pBaseNew + newLineInc;
                                var pTargetPixel = pTargetLine + newXInc * x; // current "middle pixel" in the target image
                                *pTargetPixel    = processingFunc.Invoke(kernelValues);
                            }
                        }
                    });
                }

                return(newImage.Planes[0]);
            }
            else
            {
                throw new ArgumentException("Plane could not be accessed linear", nameof(plane));
            }
        }
예제 #14
0
 public static ImagePlane ProcessMonoKernel(ImagePlane plane, Func <byte?[], byte> processingFunc, KernelSize kernel)
 {
     return(ProcessMonoKernel(plane, processingFunc, kernel, new ProcessingBounds(plane.Parent.Bounds)));
 }
예제 #15
0
 public static ImagePlane ProcessMonoKernel(ImagePlane plane, Func <byte?[], byte> processingFunc, KernelSize kernel, PixelFilterChain filterChain)
 {
     if (filterChain == null || !filterChain.HasActiveFilter)
     {
         return(ProcessMonoKernel(plane, processingFunc, kernel));
     }
     else
     {
         return(ProcessMonoKernel(plane, processingFunc, kernel, new ProcessingBounds(plane.Parent.Bounds), filterChain));
     }
 }
 static KernelSize Field(string label, KernelSize val, bool draw = true)
 {
     return((KernelSize)Field(label, (int)val, 0, 3, val.ToString(), draw));
 }
예제 #17
0
 public static Kernel Neighborhood(KernelSize size = KernelSize.SIZE_3x3)
 {
     return(new Kernel(size));
 }