예제 #1
0
        /// <summary>
        /// UnSharpMasking (Img=原圖,Threshold=銳化選擇 ,Amount=銳化強度 ,
        /// HSMaxPixel1,HSMinPixel1=選取欲銳化像素範圍 ,HSMaxPixel1,HSMinPixel1=選取輸出像素範圍 ,
        /// LowPassMask=LowPass遮罩範圍)
        /// </summary>
        public Bitmap UnSharpMasking(Bitmap Img, int Threshold = 0, double Amount      = 1,
                                     byte HSMaxPixel1          = 255, byte HSMinPixel1 = 0, byte HSMaxPixel2 = 255, byte HSMinPixel2 = 0,
                                     int LowPassMask           = 3)
        {
            var    ImgIn = new ImgInitial(Img);
            Bitmap Img2;

            Img2 = ImgIn.Copy(Img);
            Img2 = LowPassFilter(Img2, LowPassMask);
            Img2 = HistogramProcessing(Img2, HSMaxPixel1, HSMinPixel1, Constants.HS);
            var ImgIn2 = new ImgInitial(Img2);

            for (int counter = 0; counter < ImgIn.rgbValues.Length - 1; counter += 3)
            {
                var ChangeValue = ImgIn.rgbValues[counter] - ImgIn2.rgbValues[counter];
                if (ChangeValue < Threshold)
                {
                    continue;
                }
                var PixelChange = ChangeValue * Amount + ImgIn.rgbValues[counter];
                PixelChange = PixelChange > 255 ? 255 : PixelChange < 0 ? 0 : PixelChange;
                ImgIn.rgbValues[counter]     = (byte)PixelChange;
                ImgIn.rgbValues[counter + 1] = (byte)PixelChange;
                ImgIn.rgbValues[counter + 2] = (byte)PixelChange;
            }
            Img = ImgIn.ImgChange();
            Img = HistogramProcessing(Img, HSMaxPixel2, HSMinPixel2, Constants.HS);
            return(Img);
        }
예제 #2
0
        /// <summary>
        /// LassPass Filter
        /// </summary>
        public Bitmap LowPassFilter(Bitmap Img, int Mask = 3)
        {
            var    ImgIn  = new ImgInitial(Img);
            Bitmap Img2   = ImgIn.Copy(Img);
            var    ImgIn2 = new ImgInitial(Img2);
            var    Block  = Mask / 2;

            for (int counter = 0; counter < ImgIn.rgbValues.Length - 1; counter += 3)
            {
                int PixelChange = 0;
                for (int x = -Block; x <= Block; x++)
                {
                    for (int y = -Block; y <= Block; y++)
                    {
                        int Range = counter + y * (Img.Width * 3) + x * 3;
                        if (Range > (ImgIn.ImgPixelsSize - 1))
                        {
                            Range = (ImgIn.ImgPixelsSize - 1) * 2 - Range;
                        }
                        PixelChange = PixelChange + (int)ImgIn.rgbValues[Math.Abs(Range)];
                    }
                }
                PixelChange = PixelChange / Mask / Mask;
                ImgIn2.rgbValues[counter]     = (byte)PixelChange;
                ImgIn2.rgbValues[counter + 1] = (byte)PixelChange;
                ImgIn2.rgbValues[counter + 2] = (byte)PixelChange;
            }
            Img2 = ImgIn2.ImgChange();
            return(Img2);
        }
예제 #3
0
        /// <summary>
        /// Sobel
        /// </summary>
        public Bitmap Sobel(Bitmap Img)
        {
            var    ImgIn = new ImgInitial(Img);
            Bitmap Img2;

            Img2 = ImgIn.Copy(Img);
            var ImgIn2 = new ImgInitial(Img2);

            for (int counter = 0; counter < ImgIn.rgbValues.Length - 1; counter += 3)
            {
                int SobelGx = 0, SobelGy = 0;
                for (int x = -1; x <= 1; x++)
                {
                    for (int y = -1; y <= 1; y += 2)
                    {
                        int RangeGx = counter + y * ((ImgIn.ImgPixelsSize - 1) / Img.Height) + x * 3;
                        int RangeGy = counter + x * ((ImgIn.ImgPixelsSize - 1) / Img.Height) + y * 3;
                        if (x == 0)
                        {
                            RangeGx *= 2; RangeGy *= 2;
                        }
                        if (RangeGx > ImgIn.rgbValues.Length - 1 || RangeGx < 0)
                        {
                            break;
                        }
                        if (RangeGy > ImgIn.rgbValues.Length - 1 || RangeGx < 0)
                        {
                            break;
                        }
                        SobelGx = SobelGx + x * ImgIn.rgbValues[RangeGx];
                        SobelGy = SobelGy + x * ImgIn.rgbValues[RangeGy];
                    }
                }

                var PixelChange = Math.Abs(SobelGx) + Math.Abs(SobelGy);
                PixelChange = PixelChange > 255 ? 255 : PixelChange < 0 ? 0 : PixelChange;
                ImgIn2.rgbValues[counter]     = (byte)PixelChange;
                ImgIn2.rgbValues[counter + 1] = (byte)PixelChange;
                ImgIn2.rgbValues[counter + 2] = (byte)PixelChange;
            }
            Img2 = ImgIn2.ImgChange();
            return(Img2);
        }
예제 #4
0
        /// <summary>
        /// HoughTransform
        /// </summary>
        public Bitmap HoughTransform(Bitmap Img, byte BinaryThreshold)
        {
            var ImgIn = new ImgInitial(Img);
            var Img2  = ImgIn.Copy(Img);

            Img2 = Sobel(Img2);
            Img2 = Binary(Img2, BinaryThreshold);
            var ImgIn2 = new ImgInitial(Img2);
            List <List <int> > Point = new  List <List <int> >();

            for (int counter = 0; counter < ImgIn2.rgbValues.Length - 1; counter += 3)
            {
                List <int> LinePoint = new List <int>();
                if (ImgIn2.rgbValues[counter] != 255)
                {
                    continue;
                }
                for (int Angle = 0; Angle < 180; Angle++)
                {
                    var  ChangeX = Math.Cos(Angle);
                    var  ChangeY = Math.Sin(Angle);
                    int  TotalPoint = 0;
                    bool e1 = false, e2 = false;
                    while (true)
                    {
                        var CounterChange = ChangeX * 3 + ChangeY * Img2.Width * 3;
                        if ((counter / Img2.Height + ChangeX * 3) < Img2.Width * 3 && (counter / Img2.Height + ChangeX * 3) > 0 && (counter + ChangeY * Img2.Width * 3) > 0)
                        {
                            if (ImgIn2.rgbValues[counter + (int)CounterChange] == 255)
                            {
                                TotalPoint++;
                            }
                        }
                        else
                        {
                            e1 = true;
                        }
                        if ((counter / Img2.Height - ChangeX * 3) < Img2.Width * 3 && (counter / Img2.Height - ChangeX * 3) > 0 && (counter + ChangeY * Img2.Width * 3) < ImgIn2.rgbValues.Length - 1)
                        {
                            if (ImgIn2.rgbValues[counter - (int)CounterChange] == 255)
                            {
                                TotalPoint++;
                            }
                        }
                        else
                        {
                            e2 = true;
                        }
                        if (e1 == true && e2 == true)
                        {
                            break;
                        }
                    }
                    if (TotalPoint > 100)
                    {
                        LinePoint.Add(counter);
                    }
                }
                if (LinePoint != null)
                {
                    Point.Add(LinePoint);
                }
            }
            Img2 = ImgIn2.ImgChange();
            return(Img2);
        }