コード例 #1
0
        public void neighborhoodOperationHSV(int[] mask, DirectBitmap directBitmapPre, DirectBitmap directBitmapPost, KernelMethod _method = KernelMethod.NoBorders, SccalingMethod sccalingMethod = SccalingMethod.Cut, Boolean directionEdge = false)
        {
            int    maskSize         = (int)Math.Sqrt(mask.Length);
            int    calculatedPixel  = 0;
            HSVBit calculatedHSVBit = new HSVBit();
            int    maskSum          = mask.Min() < 0 ? 1 : mask.Sum();
            int    maskSumInner     = 0;

            List <float> angles = new List <float>();

            int[] bitMapToScale = null;

            int minPixel = directBitmapPre.getMin();
            int maxPixel = directBitmapPre.getMax();

            int maskValue;

            int xo;
            int yo;

            int lowerXOverlap  = 0;
            int higherXOverlap = 0;
            int lowerYOverlap  = 0;
            int higherYOverlap = 0;

            int yiInner = 0;

            int calculatedPixelIndexX = 0;
            int calculatedPixelIndexY = 0;

            Color  helpColor;
            HSVBit helperhSVBit;

            int overlap     = 0; // = maskSize / 2;
            int maskOverlap = maskSize / 2;

            switch (_method)
            {
            case KernelMethod.NoBorders:
                overlap = maskSize / 2;
                break;

            case KernelMethod.CloneBorder:
                overlap = 0;
                break;

            case KernelMethod.UseExisting:
                overlap = 0;
                break;
            }



            //Iterate through image
            for (int x = overlap; x < directBitmapPre.Width - overlap; ++x)
            {
                for (int y = overlap; y < directBitmapPre.Height - overlap; ++y)
                {
                    //Iterate through image

                    //Iterate through mask
                    for (int xi = 0; xi < maskSize; xi++)
                    {
                        for (int yi = 0; yi < maskSize; yi++)
                        {
                            maskValue = mask[xi + (yi * maskSize)];
                            xo        = x + xi - maskOverlap;
                            yo        = y + yi - maskOverlap;

                            calculatedPixelIndexX = x + xi - maskOverlap;
                            calculatedPixelIndexY = y + yi - maskOverlap;

                            if ((x == 0 && y == 0) || (x == directBitmapPre.Width && y == directBitmapPre.Height))
                            {
                                higherXOverlap = 0;
                            }


                            if (_method == KernelMethod.UseExisting && (calculatedPixelIndexX < 0 || calculatedPixelIndexY < 0 || calculatedPixelIndexX >= directBitmapPre.Width || calculatedPixelIndexY >= directBitmapPre.Height))
                            {
                                continue;
                            }

                            if (_method == KernelMethod.CloneBorder && (calculatedPixelIndexX < 0 || calculatedPixelIndexY < 0 || calculatedPixelIndexX >= directBitmapPre.Width || calculatedPixelIndexY >= directBitmapPre.Height))
                            {
                                var cloneIndexValue = mask[xi + (yi * maskSize)];



                                for (int i = 0; i < cloneIndexValue; i++)
                                {
                                    angles.Add(directBitmapPre.GetPixelHSV(x, y).HUE);
                                }

                                calculatedHSVBit.value += (directBitmapPre.GetPixelHSV(xi, yi).saturation *cloneIndexValue);
                                continue;
                            }

                            var cloneIndexValueMain = mask[xi + (yi * maskSize)];
                            maskSumInner += cloneIndexValueMain;


                            for (int i = 0; i < cloneIndexValueMain; i++)
                            {
                                angles.Add(directBitmapPre.GetPixelHSV(calculatedPixelIndexX, calculatedPixelIndexY).HUE);
                            }

                            //calculatedHSVBit.HUE += (directBitmapPre.GetPixelHSV(x, y).HUE * cloneIndexValueMain);
                            calculatedHSVBit.saturation += (directBitmapPre.GetPixelHSV(calculatedPixelIndexX, calculatedPixelIndexY).saturation *cloneIndexValueMain);
                            calculatedHSVBit.value      += (directBitmapPre.GetPixelHSV(calculatedPixelIndexX, calculatedPixelIndexY).value *cloneIndexValueMain);
                        }
                    }

                    if (_method == KernelMethod.UseExisting)
                    {
                        calculatedHSVBit.HUE        = this.MeanAngle(angles.ToArray());
                        calculatedHSVBit.saturation = maskSum == 1 ? calculatedHSVBit.saturation : calculatedHSVBit.saturation / maskSumInner;
                        calculatedHSVBit.value      = maskSum == 1 ? calculatedHSVBit.value : calculatedHSVBit.value / maskSumInner;
                        //calculatedPixel = maskSum == 1 ? calculatedPixel : calculatedPixel / maskSumInner;
                    }
                    else
                    {
                        var bit = directBitmapPost.GetPixelHSV(x, y);
                        // calculatedPixel /= maskSum;
                        calculatedHSVBit.HUE        = this.MeanAngle(angles.ToArray());
                        calculatedHSVBit.saturation = maskSum == 1 ? calculatedHSVBit.saturation : calculatedHSVBit.saturation / maskSumInner;
                        calculatedHSVBit.value      = maskSum == 1 ? calculatedHSVBit.value : calculatedHSVBit.value / maskSumInner;
                    }

                    int newPixel = calculatedPixel;

                    if (sccalingMethod != SccalingMethod.Scale)
                    {
                        newPixel = this.ScalePixelValue(newPixel, sccalingMethod, sccalingMethod == SccalingMethod.Scale ? minPixel : 0, sccalingMethod == SccalingMethod.Scale ? maxPixel : 255);
                    }


                    if (sccalingMethod != SccalingMethod.Scale)
                    {
                        var bit = directBitmapPost.GetPixelHSV(x, y);

                        calculatedHSVBit.saturation = bit.saturation;

                        calculatedHSVBit.HUE = bit.HUE;
                        //apply cut scalling
                        if (calculatedHSVBit.value > 1)
                        {
                            calculatedHSVBit.value = 1;
                        }

                        if (calculatedHSVBit.value < 0)
                        {
                            calculatedHSVBit.value = 0;
                        }

                        directBitmapPost.SetPixel(x, y, calculatedHSVBit.getColor());
                    }
                    else
                    {
                        bitMapToScale[x + (y * directBitmapPre.Width)] = newPixel;
                    }
                    maskSumInner                = 0;
                    calculatedPixel             = 0;
                    calculatedHSVBit.HUE        = 0;
                    calculatedHSVBit.saturation = 0;
                    calculatedHSVBit.value      = 0;
                    angles.Clear();
                }
            }
        }
コード例 #2
0
        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);
        }
コード例 #3
0
        public int[] robertsOperation(KernelMethod kernelMethod = KernelMethod.NoBorders, SccalingMethod sccalingMethod = SccalingMethod.Cut)
        {
            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  = ImageProcessingEngine.RobertsFirst;
            int[] maskSecond = ImageProcessingEngine.RobertsSecond;



            for (int x = 0; x < directBitmapPre.Width - xBond; ++x)
            {
                for (int y = 0; y < directBitmapPre.Height - xBond; ++y)
                {
                    maskSumFirst  = new List <int>();
                    maskSumSecond = new List <int>();

                    for (int xi = 0; xi < 2; xi++)
                    {
                        for (int yi = 0; yi < 2; yi++)
                        {
                            calculatedX = x + xi;
                            calculatedY = y + yi;

                            if (kernelMethod == KernelMethod.UseExisting)
                            {
                                if (calculatedX >= directBitmapPre.Width || calculatedY >= directBitmapPre.Height)
                                {
                                    continue;
                                }
                            }
                            else if (kernelMethod == KernelMethod.CloneBorder)
                            {
                                if (calculatedX >= directBitmapPre.Width || calculatedY >= directBitmapPre.Height)
                                {
                                    //mask[xi + (yi * maskSize)]
                                    maskSumFirst.Add(maskFirst[xi + (yi * 2)] * directBitmapPre.GetPixel(x, y).R);
                                    maskSumSecond.Add(maskSecond[xi + (yi * 2)] * directBitmapPre.GetPixel(x, y).R);
                                    continue;
                                }
                            }
                            maskSumFirst.Add(maskFirst[xi + (yi * 2)] * directBitmapPre.GetPixel(x + xi, y + yi).R);
                            maskSumSecond.Add(maskSecond[xi + (yi * 2)] * directBitmapPre.GetPixel(x + xi, y + yi).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);
        }
コード例 #4
0
        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;
            }
        }
コード例 #5
0
        public void medianOperation(int maskSize, KernelMethod _method = KernelMethod.NoBorders)
        {
            List <int> maskList = null;

            int[] maskObject = new int[maskSize * maskSize]; ///for easier median search using list

            //Array.Sort(maskObject);
            int calculatedPixel;
            int elementttt;
            int overlap       = 0;
            int maskSizeInner = 0; //mask size used for UseExisting method

            switch (_method)
            {
            case KernelMethod.NoBorders:
                overlap = maskSize / 2;
                break;

            case KernelMethod.CloneBorder:
                overlap = 0;
                break;

            case KernelMethod.UseExisting:
                overlap = 0;
                break;
            }

            Color helpColor;
            int   maskOverlap = maskSize / 2;

            int calculatedPixelXIndex = 0;
            int calculatedPixelYindex = 0;

            //Iterate through image
            for (int x = overlap; x < directBitmapPre.Width - overlap; ++x)
            {
                for (int y = overlap; y < directBitmapPre.Height - overlap; ++y)
                {
                    //Iterate through image

                    //Iterate through mask
                    maskList = new List <int>();
                    for (int xi = 0; xi < maskSize; xi++)
                    {
                        for (int yi = 0; yi < maskSize; yi++)
                        {
                            calculatedPixelXIndex = x + xi - maskOverlap;
                            calculatedPixelYindex = y + yi - maskOverlap;

                            if (_method == KernelMethod.UseExisting)
                            {
                                if ((calculatedPixelXIndex < 0 || calculatedPixelYindex < 0 || calculatedPixelXIndex >= directBitmapPre.Width || calculatedPixelYindex >= directBitmapPre.Height))
                                {
                                    continue;
                                }
                                else
                                {
                                    maskSizeInner++;
                                }
                            }

                            if (_method == KernelMethod.CloneBorder && (calculatedPixelXIndex < 0 || calculatedPixelYindex < 0 || calculatedPixelXIndex >= directBitmapPre.Width || calculatedPixelYindex >= directBitmapPre.Height))
                            {
                                calculatedPixelXIndex = x;
                                calculatedPixelYindex = y;
                            }

                            maskList.Add(directBitmapPre.GetPixel(calculatedPixelXIndex, calculatedPixelYindex).R);
                        }
                    }

                    calculatedPixel = maskList.Median();
                    directBitmapPost.SetPixel(x, y, Color.FromArgb(calculatedPixel, calculatedPixel, calculatedPixel));
                }
            }
        }
コード例 #6
0
        public void neighborhoodOperation(int[] mask, KernelMethod _method = KernelMethod.NoBorders, SccalingMethod sccalingMethod = SccalingMethod.Cut, Boolean directionEdge = false)
        {
            int maskSize        = (int)Math.Sqrt(mask.Length);
            int calculatedPixel = 0;
            int maskSum         = mask.Min() < 0 ? 1 : mask.Sum();
            int maskSumInner    = 0;

            int[] bitMapToScale = null;
            if (sccalingMethod == SccalingMethod.Scale)
            {
                bitMapToScale = new int[directBitmapPre.Height * directBitmapPre.Width];
            }



            int minPixel = directBitmapPre.getMin();
            int maxPixel = directBitmapPre.getMax();


            int maskValue;

            int xo;
            int yo;

            int lowerXOverlap  = 0;
            int higherXOverlap = 0;
            int lowerYOverlap  = 0;
            int higherYOverlap = 0;

            int yiInner = 0;

            int calculatedPixelIndexX = 0;
            int calculatedPixelIndexY = 0;

            Color helpColor;

            int overlap     = 0; // = maskSize / 2;
            int maskOverlap = maskSize / 2;

            switch (_method)
            {
            case KernelMethod.NoBorders:
                overlap = maskSize / 2;
                break;

            case KernelMethod.CloneBorder:
                overlap = 0;
                break;

            case KernelMethod.UseExisting:
                overlap = 0;
                break;
            }



            //Iterate through image
            for (int x = overlap; x < directBitmapPre.Width - overlap; ++x)
            {
                for (int y = overlap; y < directBitmapPre.Height - overlap; ++y)
                {
                    //Iterate through image

                    //Iterate through mask
                    for (int xi = 0; xi < maskSize; xi++)
                    {
                        for (int yi = 0; yi < maskSize; yi++)
                        {
                            maskValue = mask[xi + (yi * maskSize)];
                            xo        = x + xi - maskOverlap;
                            yo        = y + yi - maskOverlap;

                            calculatedPixelIndexX = x + xi - maskOverlap;
                            calculatedPixelIndexY = y + yi - maskOverlap;

                            if ((x == 0 && y == 0) || (x == directBitmapPre.Width && y == directBitmapPre.Height))
                            {
                                higherXOverlap = 0;
                            }


                            if (_method == KernelMethod.UseExisting && (calculatedPixelIndexX < 0 || calculatedPixelIndexY < 0 || calculatedPixelIndexX >= directBitmapPre.Width || calculatedPixelIndexY >= directBitmapPre.Height))
                            {
                                continue;
                            }

                            if (_method == KernelMethod.CloneBorder && (calculatedPixelIndexX < 0 || calculatedPixelIndexY < 0 || calculatedPixelIndexX >= directBitmapPre.Width || calculatedPixelIndexY >= directBitmapPre.Height))
                            {
                                calculatedPixel += (directBitmapPre.GetPixel(x, y).R *mask[xi + (yi * maskSize)]);

                                continue;
                            }
                            maskSumInner    += mask[xi + (yi * maskSize)];
                            calculatedPixel += (directBitmapPre.GetPixel(calculatedPixelIndexX, calculatedPixelIndexY).R *mask[xi + (yi * maskSize)]);
                        }
                    }

                    if (_method == KernelMethod.UseExisting)
                    {
                        calculatedPixel = maskSum == 1 ? calculatedPixel : calculatedPixel / maskSumInner;
                    }
                    else
                    {
                        calculatedPixel /= maskSum;
                    }

                    int newPixel = calculatedPixel;

                    if (sccalingMethod != SccalingMethod.Scale)
                    {
                        newPixel = this.ScalePixelValue(newPixel, sccalingMethod, sccalingMethod == SccalingMethod.Scale ? minPixel : 0, sccalingMethod == SccalingMethod.Scale ? maxPixel : 255);
                    }


                    if (sccalingMethod != SccalingMethod.Scale)
                    {
                        directBitmapPost.SetPixel(x, y, Color.FromArgb(newPixel, newPixel, newPixel));
                    }
                    else
                    {
                        bitMapToScale[x + (y * directBitmapPre.Width)] = newPixel;
                    }
                    maskSumInner    = 0;
                    calculatedPixel = 0;
                }
            }

            if (sccalingMethod == SccalingMethod.Scale)
            {
                int        minValue = bitMapToScale.Min();
                int        maxValue = bitMapToScale.Max();
                int        pixelScalled;
                List <int> checkList = new List <int>();



                for (int x = 0; x < directBitmapPre.Width - overlap; ++x)
                {
                    for (int y = 0; y < directBitmapPre.Height - overlap; ++y)
                    {
                        pixelScalled = (int)(((decimal)(bitMapToScale[x + (y * directBitmapPre.Width)] - minValue) / (decimal)(maxValue - minValue)) * 255);
                        checkList.Add(pixelScalled);
                        directBitmapPost.SetPixel(x, y, Color.FromArgb(pixelScalled, pixelScalled, pixelScalled));
                    }
                }
            }
        }