Exemplo n.º 1
0
        //<sumary>
        //   x, y : point (x,y)
        //   size : convolution size
        //</sumary>
        private Color GetAvg(LockBitmap lbm, int x, int y, int size = 3)
        {
            if (size % 2 == 0)
            {
                throw new ArgumentException("Convolution size must is odd number");
            }
            int sumR = 0, sumG = 0, sumB = 0, sumA = 0;

            for (int i = x - size / 2; i <= x + size / 2; i++)
            {
                for (int j = y - size / 2; j <= y + size / 2; j++)
                {
                    if (i >= 0 && j >= 0 && i < lbm.Width && j < lbm.Height)
                    {
                        sumA += (int)lbm.GetPixel(i, j).A;
                        sumR += (int)lbm.GetPixel(i, j).R;
                        sumG += (int)lbm.GetPixel(i, j).G;
                        sumB += (int)lbm.GetPixel(i, j).B;
                    }
                }
            }
            sumA = (int)(Math.Round((double)sumA / (size * size), MidpointRounding.AwayFromZero));
            sumR = (int)(Math.Round((double)sumR / (size * size), MidpointRounding.AwayFromZero));
            sumG = (int)(Math.Round((double)sumG / (size * size), MidpointRounding.AwayFromZero));
            sumB = (int)(Math.Round((double)sumB / (size * size), MidpointRounding.AwayFromZero));

            return(lbm.Depth == 32 ? Color.FromArgb(sumA, sumR, sumG, sumB) : Color.FromArgb(sumR, sumG, sumB));
        }
Exemplo n.º 2
0
        private Color GetMax(LockBitmap lbm, int x, int y, int size = 3)
        {
            Color color = new Color();
            int   maxVal = 0, tmp;

            if (size % 2 == 0)
            {
                throw new ArgumentException("Convolution size must is odd number");
            }
            for (int i = x - size / 2; i <= x + size / 2; i++)
            {
                for (int j = y - size / 2; j <= y + size / 2; j++)
                {
                    if (i >= 0 && j >= 0 && i < lbm.Width && j < lbm.Height)
                    {
                        tmp = lbm.GetPixel(i, j).R + lbm.GetPixel(i, j).G + lbm.GetPixel(i, j).B + lbm.GetPixel(i, j).A;
                        if (tmp > maxVal)
                        {
                            maxVal = tmp;
                            color  = lbm.GetPixel(i, j);
                        }
                    }
                    else
                    {
                    }
                }
            }
            return(color);
        }
Exemplo n.º 3
0
        private Color GetSharp(LockBitmap lbm, int x, int y, int size = 3)
        {
            if (size % 2 == 0)
            {
                throw new ArgumentException("Convolution size must is odd number");
            }
            // index of CONV_SHARP matrix
            int index = 0;
            int R = 0, G = 0, B = 0, A = 0;

            for (int i = x - size / 2; i <= x + size / 2; i++)
            {
                for (int j = y - size / 2; j <= y + size / 2; j++)
                {
                    if (i >= 0 && j >= 0 && i < lbm.Width && j < lbm.Height)
                    {
                        if (size == 3)
                        {
                            A += (int)lbm.GetPixel(i, j).A *CONV_SHARP_3_3[index];
                            R += (int)lbm.GetPixel(i, j).R *CONV_SHARP_3_3[index];
                            G += (int)lbm.GetPixel(i, j).G *CONV_SHARP_3_3[index];
                            B += (int)lbm.GetPixel(i, j).B *CONV_SHARP_3_3[index];
                        }
                        else if (size == 5)
                        {
                            A += (int)lbm.GetPixel(i, j).A *CONV_SHARP_5_5[index];
                            R += (int)lbm.GetPixel(i, j).R *CONV_SHARP_5_5[index];
                            G += (int)lbm.GetPixel(i, j).G *CONV_SHARP_5_5[index];
                            B += (int)lbm.GetPixel(i, j).B *CONV_SHARP_5_5[index];
                        }
                        else
                        {
                            throw new System.ArgumentException("size cannot be" + size, "original");
                        }
                    }
                    index++;
                }
            }

            A = (A < 0 ? 0 : (A > 255 ? 255 : A));
            R = (R < 0 ? 0 : (R > 255 ? 255 : R));
            G = (G < 0 ? 0 : (G > 255 ? 255 : G));
            B = (B < 0 ? 0 : (B > 255 ? 255 : B));

            return(lbm.Depth == 32 ? Color.FromArgb(A, R, G, B) : Color.FromArgb(R, G, B));
        }
Exemplo n.º 4
0
        private Color GetMedian(LockBitmap lbm, int x, int y, int size = 3)
        {
            List <byte> rColor = new List <byte>();
            List <byte> gColor = new List <byte>();
            List <byte> bColor = new List <byte>();
            List <byte> aColor = new List <byte>();

            if (size % 2 == 0)
            {
                throw new ArgumentException("Convolution size must is odd number");
            }
            for (int i = x - size / 2; i <= x + size / 2; i++)
            {
                for (int j = y - size / 2; j <= y + size / 2; j++)
                {
                    if (i >= 0 && j >= 0 && i < lbm.Width && j < lbm.Height)
                    {
                        rColor.Add(lbm.GetPixel(i, j).R);
                        gColor.Add(lbm.GetPixel(i, j).G);
                        bColor.Add(lbm.GetPixel(i, j).B);
                        aColor.Add(lbm.GetPixel(i, j).A);
                    }
                    else
                    {
                        rColor.Add(0);
                        gColor.Add(0);
                        bColor.Add(0);
                        aColor.Add(0);
                    }
                }
            }
            int mid = (size * size - 1) / 2;

            rColor.Sort(); gColor.Sort(); bColor.Sort(); aColor.Sort();
            return(lbm.Depth == 32 ? Color.FromArgb(aColor[mid], rColor[mid], gColor[mid], bColor[mid]) : Color.FromArgb(rColor[mid], gColor[mid], bColor[mid]));
        }
Exemplo n.º 5
0
        private Bitmap GetResult(Bitmap bmp, int type)
        {
            imageOutput = new Bitmap(imageInput.Width, imageInput.Height, imageInput.PixelFormat);

            LockBitmap lockBitmapIn = new LockBitmap(imageInput);

            lockBitmapIn.LockBits();

            LockBitmap lockBitmapOut = new LockBitmap(imageOutput);

            lockBitmapOut.LockBits();

            int width  = lockBitmapIn.Width;
            int height = lockBitmapIn.Height;

            switch (type)
            {
            case 1:
                for (int i = 0; i < width; i++)
                {
                    for (int j = 0; j < height; j++)
                    {
                        lockBitmapOut.SetPixel(i, j, GetAvg(lockBitmapIn, i, j, CONV_SIZE_3_3));
                    }
                }
                break;

            case 2:
                for (int i = 0; i < width; i++)
                {
                    for (int j = 0; j < height; j++)
                    {
                        lockBitmapOut.SetPixel(i, j, GetAvg(lockBitmapIn, i, j, CONV_SIZE_5_5));
                    }
                }
                break;

            case 3:
                for (int i = 0; i < width; i++)
                {
                    for (int j = 0; j < height; j++)
                    {
                        lockBitmapOut.SetPixel(i, j, GetMedian(lockBitmapIn, i, j, CONV_SIZE_3_3));
                    }
                }
                break;

            case 4:
                for (int i = 0; i < width; i++)
                {
                    for (int j = 0; j < height; j++)
                    {
                        lockBitmapOut.SetPixel(i, j, GetMedian(lockBitmapIn, i, j, CONV_SIZE_5_5));
                    }
                }
                break;

            case 5:
                for (int i = 0; i < width; i++)
                {
                    for (int j = 0; j < height; j++)
                    {
                        lockBitmapOut.SetPixel(i, j, GetSharp(lockBitmapIn, i, j, CONV_SIZE_3_3));
                    }
                }
                break;

            case 6:
                for (int i = 0; i < width; i++)
                {
                    for (int j = 0; j < height; j++)
                    {
                        lockBitmapOut.SetPixel(i, j, GetSharp(lockBitmapIn, i, j, CONV_SIZE_5_5));
                    }
                }
                break;

            case 7:
                for (int i = 0; i < width; i++)
                {
                    for (int j = 0; j < height; j++)
                    {
                        lockBitmapOut.SetPixel(i, j, GetMax(lockBitmapIn, i, j, CONV_SIZE_3_3));
                    }
                }
                break;

            case 8:
                for (int i = 0; i < width; i++)
                {
                    for (int j = 0; j < height; j++)
                    {
                        lockBitmapOut.SetPixel(i, j, GetMax(lockBitmapIn, i, j, CONV_SIZE_5_5));
                    }
                }
                break;

            case 9:
                for (int i = 0; i < width; i++)
                {
                    for (int j = 0; j < height; j++)
                    {
                        lockBitmapOut.SetPixel(i, j, GetMin(lockBitmapIn, i, j, CONV_SIZE_3_3));
                    }
                }
                break;

            case 10:
                for (int i = 0; i < width; i++)
                {
                    for (int j = 0; j < height; j++)
                    {
                        lockBitmapOut.SetPixel(i, j, GetMin(lockBitmapIn, i, j, CONV_SIZE_5_5));
                    }
                }
                break;

            default:
                MessageBox.Show("Hãy chọn một bộ lọc!, pls", "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
                lockBitmapIn.UnlockBits();
                lockBitmapOut.UnlockBits();
                return(null);
            }
            lockBitmapIn.UnlockBits();
            lockBitmapOut.UnlockBits();

            return(imageOutput);
        }