zoukankan      html  css  js  c++  java
  • C#数字图像处理(摘录)

    namespace ImageProcessor
    {
        class RGBImage
        {
            private Bitmap bitmap;
            public RGBImage(Bitmap bitmap)
            {
                this.bitmap = bitmap;
            }
            private int GetWidth()
            {
                return this.bitmap.Size.Width;
            }
            private int GetHeight()
            {
                return this.bitmap.Size.Height;
            }
            private Color RuleRGBValue(int r,int g,int b)
            {
                Color c = new Color();
                if (r > 255) r = 255;
                if (r < 0) r = 0;
                if (g > 255) g = 255;
                if (g < 0) g = 0;
                if (b > 255) b = 255;
                if (b < 0) b = 0;
                c = Color.FromArgb(r, g, b);
                return c;
            }
            /// <summary>
            /// 单色蓝图片
            /// </summary>
            /// <returns></returns>
            public Bitmap ToBlueImage()
            {
                Color c = new Color();
                Color c1 = new Color();
                Bitmap rtBitmap = new Bitmap(bitmap.Size.Width, bitmap.Size.Height);
                for (int i = 0; i < bitmap.Size.Width; i++)
                {
                    for (int j = 0; j < bitmap.Size.Height; j++)
                    {
                        c = bitmap.GetPixel(i, j);
                        c1 = Color.FromArgb(c.B, c.B, c.B);
                        rtBitmap.SetPixel(i, j, c1);
                    }
                }
                return rtBitmap;
            }
            /// <summary>
            /// 单色绿图片
            /// </summary>
            /// <returns></returns>
            public Bitmap ToGreenImage()
            {
                Color c = new Color();
                Color c1 = new Color();
                Bitmap rtBitmap = new Bitmap(bitmap.Size.Width, bitmap.Size.Height);
                for (int i = 0; i < bitmap.Size.Width; i++)
                {
                    for (int j = 0; j < bitmap.Size.Height; j++)
                    {
                        c = bitmap.GetPixel(i, j);
                        c1 = Color.FromArgb(c.R, c.R, c.R);
                        rtBitmap.SetPixel(i, j, c1);
                    }
                }
                return rtBitmap;
            }
            /// <summary>
            /// 单色红图片
            /// </summary>
            /// <returns></returns>
            public Bitmap ToRedImage()
            {
                Color c = new Color();
                Color c1 = new Color();
                Bitmap rtBitmap = new Bitmap(bitmap.Size.Width, bitmap.Size.Height);
                for (int i = 0; i < bitmap.Size.Width; i++)
                {
                    for (int j = 0; j < bitmap.Size.Height; j++)
                    {
                        c = bitmap.GetPixel(i, j);
                        c1 = Color.FromArgb(255-c.B, 255-c.B, 255-c.B);
                        rtBitmap.SetPixel(i, j, c1);
                    }
                }
                return rtBitmap;
            }
            /// <summary>
            /// 单亮度图片
            /// </summary>
            /// <returns></returns>
            public Bitmap ToBrightnessImage()
            {
                Bitmap rtBitmap = new Bitmap(bitmap.Size.Width, bitmap.Size.Height);
                Color c = new Color();
                Color c1 = new Color();
                int y;
                for (int i = 0; i < bitmap.Size.Width; i++)
                {
                    for (int j = 0; j < bitmap.Size.Height; j++)
                    {
                        c = bitmap.GetPixel(i, j);
                        y = (int)(0.31 * c.R + 0.59 * c.G + 0.11 * c.B);
                        c1 = RuleRGBValue(y, y, y);
                        rtBitmap.SetPixel(i, j, c1);
                    }
                }
                return rtBitmap;
            }
            /// <summary>
            /// 灰度图片
            /// </summary>
            /// <param name="n"></param>
            /// <returns></returns>
            public Bitmap ToGrayImage(int n)
            {
                Bitmap rtBitmap = new Bitmap(bitmap.Size.Width, bitmap.Size.Height);
                Color c = new Color();
                Color c1 = new Color();
                int y;
                for (int i = 0; i < bitmap.Size.Width; i++)
                {
                    for (int j = 0; j < bitmap.Size.Height; j++)
                    {
                        c = bitmap.GetPixel(i, j);
                        y = (int)((c.R + c.G + c.B)/n);
                        c1 = RuleRGBValue(y, y, y);
                        rtBitmap.SetPixel(i, j, c1);
                    }
                }
                return rtBitmap; 
            }
            /// <summary>
            /// 逆反图片
            /// </summary>
            /// <returns></returns>
            public Bitmap ToInverseImage()
            {
                Bitmap rtBitmap = new Bitmap(bitmap.Size.Width, bitmap.Size.Height);
                Color c = new Color();
                Color c1 = new Color();
                for (int i = 0; i < bitmap.Size.Width; i++)
                {
                    for (int j = 0; j < bitmap.Size.Height; j++)
                    {
                        c = bitmap.GetPixel(i, j);
                        c1 = Color.FromArgb(255-c.R, 255-c.G, 255-c.B);
                        rtBitmap.SetPixel(i, j, c1);
                    }
                }
                return rtBitmap;
            }
            /// <summary>
            /// 平滑图片
            /// </summary>
            /// <param name="nn"></param>
            /// <returns></returns>
            public Bitmap ToSmoothImage(int nn)
            {
                Bitmap rtBitmap = new Bitmap(bitmap.Size.Width, bitmap.Size.Height);
                Color c = new Color();
                Color c1 = new Color();
                int mm = (nn - 1) / 2;
                for (int i = mm; i < bitmap.Size.Width - mm; i++)
                {
                    for (int j = mm; j < bitmap.Size.Height - mm; j++)
                    {
                        int r = 0, g = 0, b = 0;
                        for (int m = i - mm; m <= i + mm; m++)
                        {
                            for (int n = j - mm; n <= j + mm; n++)
                            {
                                c = bitmap.GetPixel(m, n);
                                r = r + c.R;
                                g = g + c.G;
                                b = b + c.B;
                            }
                        }
                        r = r / (nn*nn);
                        g = g / (nn * nn);
                        b = b / (nn * nn);
                        c1 = RuleRGBValue(r, g, b);
                        rtBitmap.SetPixel(i, j, c1);
                    }
                }
                return rtBitmap;
            }
            /// <summary>
            /// 霓虹图片
            /// </summary>
            /// <returns></returns>
            public Bitmap ToNeonImage()
            {
                Bitmap rtBitmap = new Bitmap(bitmap.Size.Width, bitmap.Size.Height);
                Color c = new Color();
                Color c1 = new Color();
                Color c2 = new Color();
                Color c3 = new Color();
                int r1, r2, g1, g2, b1, b2;
                int r,g,b;
                for (int i = 0; i < bitmap.Size.Width-1; i++)
                {
                    for (int j = 0; j < bitmap.Size.Height-1; j++)
                    {
                        c1 = bitmap.GetPixel(i, j);
                        c2 = bitmap.GetPixel(i + 1, j);
                        c3 = bitmap.GetPixel(i, j + 1);
                        r1 = (c1.R - c2.R) ^ 2;
                        g1 = (c1.G - c2.G) ^ 2;
                        b1 = (c1.B - c2.B) ^ 2;
                        r2 = (c1.R - c3.R) ^ 2;
                        g2 = (c1.G - c3.G) ^ 2;
                        b2 = (c1.B - c3.B) ^ 2;
                        r = (int)(2 * Math.Sqrt(r1 +r2));
                        g = (int)(2 * Math.Sqrt(g1 + g2));
                        b = (int)(2 * Math.Sqrt(b1 + b2));
                        c = RuleRGBValue(r, g, b);
                        rtBitmap.SetPixel(i, j, c);
                    }
                }
                return rtBitmap;
            }
            /// <summary>
            /// 锐化图片
            /// </summary>
            /// <param name="n"></param>
            /// <returns></returns>
            public Bitmap ToSharpeningImage(double n)
            {
                Bitmap rtBitmap = new Bitmap(bitmap.Size.Width, bitmap.Size.Height);
                Color c = new Color();
                Color c1 = new Color();
                Color c2 = new Color();
                int r, g, b;
                for (int i = 1; i < bitmap.Size.Width; i++)
                {
                    for (int j = 1; j < bitmap.Size.Height; j++)
                    {
                        c1 = bitmap.GetPixel(i, j);
                        c2 = bitmap.GetPixel(i-1,j-1);
                        r = (int)(c1.R + n * Math.Abs(c1.R - c2.R));
                        g = (int)(c1.G + n * Math.Abs(c1.G - c2.G));
                        b = (int)(c1.B + n * Math.Abs(c1.B - c2.B));
                        c = RuleRGBValue(r,g,b);
                        rtBitmap.SetPixel(i, j, c);
                    }
                }
                return rtBitmap;
            }
            /// <summary>
            /// 浮雕图片
            /// </summary>
            /// <param name="n"></param>
            /// <returns></returns>
            public Bitmap ToReliefImage(int n)
            {
                if (n < 0) n = 0;
                if (n > 255) n = 255;
                Bitmap rtBitmap = new Bitmap(bitmap.Size.Width, bitmap.Size.Height);
                Color c = new Color();
                Color c1 = new Color();
                Color c2 = new Color();
                int r, g, b;
                for (int i = 1; i < bitmap.Size.Width; i++)
                {
                    for (int j = 0; j < bitmap.Size.Height; j++)
                    {
                        c1 = bitmap.GetPixel(i, j);
                        c2 = bitmap.GetPixel(i - 1, j);
                        r = c1.R - c2.R + n;
                        g = c1.G - c2.G + n;
                        b = c1.B - c2.B + n;
                        c = RuleRGBValue(r, g, b);
                        rtBitmap.SetPixel(i, j, c);
                    }
                }
                return rtBitmap;
            }
            /// <summary>
            /// 镶嵌图片
            /// </summary>
            /// <param name="nn"></param>
            /// <returns></returns>
            public Bitmap ToMosaicImage(int nn)
            {
                if (nn < 0) nn = 3;
                int mm = (nn - 1) / 2;
                Bitmap rtBitmap = new Bitmap(bitmap.Size.Width, bitmap.Size.Height);
                Color c = new Color();
                Color c1 = new Color();
                for (int i = mm; i < bitmap.Size.Width - mm; i++)
                {
                    for (int j = mm; j < bitmap.Size.Height - mm; j++)
                    {
                        int r = 0, g = 0, b = 0;
                        for (int m = i - mm; m <= i + mm; m++)
                        {
                            for (int n = j - mm; n <= j + mm; n++)
                            {
                                c = bitmap.GetPixel(m, n);
                                r = r + c.R;
                                g = g + c.G;
                                b = b + c.B;
                            }
                        }
                        r = r / (nn*nn);
                        g = g / (nn * nn);
                        b = b / (nn * nn);
                        c1 = RuleRGBValue(r, g, b);
                        for (int m = i - mm; m <= i + mm; m++)
                        {
                            for (int n = j - mm; n <= j + mm; n++)
                            {
                                rtBitmap.SetPixel(m, n, c1);
                            }
                        }
                    }
                }
                return rtBitmap;
            }
            /// <summary>
            /// 平移图片
            /// </summary>
            /// <param name="n"></param>
            /// <returns></returns>
            public Bitmap TranslationImage(int n)
            {
                if (n < 0|| n>255) n = 20;
                Bitmap rtBitmap=new Bitmap (bitmap.Width,bitmap.Height);
                Color c=new Color ();
                for(int i=0;i<bitmap.Size.Width-n;i++)
                {
                    for(int j=0;j<bitmap.Size.Height-n;j++)
                    {
                        c=bitmap.GetPixel(i,j);
                        rtBitmap.SetPixel(i + n, j + n, c);
                    }
                }
                return rtBitmap;
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="n"></param>
            /// <returns></returns>
            public Bitmap ResizeImage(double n)
            {
                Bitmap rtBitmap = new Bitmap((int)(bitmap.Size.Width*n),(int)(bitmap.Size.Height*n));
                Color c = new Color();
                int x, y; 
                for (int i = 0; i < bitmap.Size.Width; i++)
                {
                    for (int j = 0; j < bitmap.Size.Height; j++)
                    {
                        c = bitmap.GetPixel(i, j);
                        x = Convert.ToInt16(i * n);
                        y = Convert.ToInt16(j * n);
                        if (x < 0) x = 0;
                        if (x >= rtBitmap.Size.Width) x = rtBitmap.Size.Width-1;
                        if (y < 0) y = 0;
                        if (y >= rtBitmap.Size.Height) y = rtBitmap.Size.Height-1;
                        rtBitmap.SetPixel(x,y, c);
                    }
                }
                return rtBitmap;
            }
            /// <summary>
            /// 
            /// </summary>
            /// <returns></returns>
            public Bitmap LRFlipImage()
            {
                Bitmap rtBitmap =new Bitmap (bitmap.Width,bitmap.Height );
                Color c = new Color();
                for (int i = 0; i < bitmap.Width; i++)
                {
                    for (int j = 0; j < bitmap.Height; j++)
                    {
                        c = bitmap.GetPixel(i, j);
                        rtBitmap.SetPixel(bitmap.Width - 1 - i, j, c);
                    }
                }
                return rtBitmap;
            }
            public Bitmap UDFlipImage()
            {
                Bitmap rtBitmap = new Bitmap(bitmap.Width, bitmap.Height);
                Color c = new Color();
                for (int i = 0; i < bitmap.Width; i++)
                {
                    for (int j = 0; j < bitmap.Height; j++)
                    {
                        c = bitmap.GetPixel(i, j);
                        rtBitmap.SetPixel(i, bitmap.Height-1-j, c);
                    }
                }
                return rtBitmap;
            }
            public Bitmap RotateImage(double n)
            {
                if (n < 0) n = 1;
                if (n > 360) n = 360;
                double nn = 180 / n;
                Bitmap rtBitmap = new Bitmap(bitmap.Width,bitmap.Height);
                int x,y;
                double pi = Math.PI;
                for (int i = 0; i < bitmap.Width; i++)
                {
                    for (int j = 0; j < bitmap.Height; j++)
                    {
                        x =(int)( i * Math.Cos(pi / nn) - j * Math.Sin(pi / nn));
                        y=(int)(i*Math.Sin(pi/6)+j*Math.Cos(pi/6));
                        if(x>0&& x<bitmap.Width&&y>0&&y<bitmap.Height)
                        rtBitmap.SetPixel(x, y, bitmap.GetPixel(i, j));
                    }
                }
                return rtBitmap;
            }
            public Bitmap HistImage()
            {
                RGBImage rgb = new RGBImage(this.bitmap);
                Bitmap tempBitmap = rgb.ToGrayImage(3);
                Color c =Color.FromA#ffffff;
                int[] times = new int[256];
                for (int i = 0; i < tempBitmap.Width; i++)
                {
                    for (int j = 0; j < tempBitmap.Height; j++)
                    {
                        c = tempBitmap.GetPixel(i, j);
                        times[c.R]++;
                    }
                }
                int max = times[0];
                for (int i = 1; i < 256; i++)
                {
                    if (times[i] > max) max = times[i];
                }
                for (int i = 0; i < 256; i++)
                {
                    times[i] = Convert.ToInt16(((double)(times[i]) /(double)( max))*100);
                }
                Bitmap rtBitmap = new Bitmap(256, 110);
                for (int i = 0; i < rtBitmap.Width; i++)
                {
                    for (int j = 0; j < rtBitmap.Height; j++)
                    {
                        for (int m = 0; m <= times[i]; m++)
                        {
                            rtBitmap.SetPixel(i, m, c);
                        }
                    }
                }
                RGBImage rimage = new RGBImage(rtBitmap);
                Bitmap s=rimage.UDFlipImage();
                return s;
            }
        }
    }

            private void btnToBlueImage_Click(object sender, EventArgs e)
            {
                RGBImage rgbBitmap = new RGBImage(bmp);
                Bitmap bBitmap = rgbBitmap.ToBlueImage();
                ShowImage showImage = new ShowImage(bBitmap,"单色蓝图片");
                showImage.Show();
            }
            private void btnToGreenImage_Click(object sender, EventArgs e)
            {
                RGBImage rgbBitmap = new RGBImage(bmp);
                Bitmap bBitmap = rgbBitmap.ToGreenImage();
                ShowImage showImage = new ShowImage(bBitmap, "单色绿图片");
                showImage.Show();
            }
            private void btnToRedImage_Click(object sender, EventArgs e)
            {
                RGBImage rgbBitmap = new RGBImage(bmp);
                Bitmap bBitmap = rgbBitmap.ToRedImage();
                ShowImage showImage = new ShowImage(bBitmap, "单色红图片");
                showImage.Show();
            }
            private void btnToBrightnessImage_Click(object sender, EventArgs e)
            {
                RGBImage rgbBitmap = new RGBImage(bmp);
                Bitmap bitmap = rgbBitmap.ToBrightnessImage();
                ShowImage s = new ShowImage(bitmap, "单亮度图片");
                s.Show();
            }
            private void btnToGrayImage_Click(object sender, EventArgs e)
            {
                RGBImage rgbBitmap = new RGBImage(bmp);
                InputDialog inputDialog = new InputDialog("请输入采用的模板大小:", "模板大小","3");
                inputDialog.ShowDialog();
                if (inputDialog.result != "")
                {
                    int n = Convert.ToInt16(inputDialog.result);
                    Bitmap bitmap = rgbBitmap.ToGrayImage(n);
                    ShowImage s = new ShowImage(bitmap, "灰度图片");
                    s.Show();
                }
                else
                {
                    MessageBox.Show("对不起,你的输入参数错误!");
                }
            }
            private void btnInverseImage_Click(object sender, EventArgs e)
            {
                RGBImage rgbBitmap = new RGBImage(bmp);
                Bitmap bitmap = rgbBitmap.ToInverseImage();
                ShowImage s = new ShowImage(bitmap, "逆反图片");
                s.Show();
            }
            private void btnSmoothImage_Click(object sender, EventArgs e)
            {
                RGBImage rgbBitmap = new RGBImage(bmp);
                InputDialog inputDialog = new InputDialog("请输入采用的模板大小:", "模板大小", "3");
                inputDialog.ShowDialog();
                if (inputDialog.result != "")
                {
                    int n = Convert.ToInt16(inputDialog.result);
                    Bitmap bitmap = rgbBitmap.ToSmoothImage(n);
                    ShowImage s = new ShowImage(bitmap, "平滑图片");
                    s.Show();
                }
                else
                {
                    MessageBox.Show("对不起,你的输入参数错误!");
                }
            }
            private void btnNeonImage_Click(object sender, EventArgs e)
            {
                RGBImage rgbBitmap = new RGBImage(bmp);
                Bitmap bitmap = rgbBitmap.ToNeonImage();
                ShowImage s = new ShowImage(bitmap, "霓虹图片");
                s.Show();
            }
            private void btnSharpenImage_Click(object sender, EventArgs e)
            {
                RGBImage rgbBitmap = new RGBImage(bmp);
                InputDialog inputDialog = new InputDialog("请输入锐化系数:", "输入参数", "0.25");
                inputDialog.ShowDialog();
                if (inputDialog.result != "")
                {
                    double n = Convert.ToDouble(inputDialog.result);
                    Bitmap bitmap = rgbBitmap.ToSharpeningImage(n);
                    ShowImage s = new ShowImage(bitmap, "锐化图片");
                    s.Show();
                }
                else
                {
                    MessageBox.Show("对不起,你的输入参数错误!");
                }
            }
            private void btnReliefImage_Click(object sender, EventArgs e)
            {
                RGBImage rgbBitmap = new RGBImage(bmp);
                InputDialog nn=new InputDialog ("输入浮雕值:","输入参数","128");
                nn.ShowDialog();
                if (nn.result != "")
                {
                    int n = Convert.ToInt16(nn.result);
                    Bitmap bitmap = rgbBitmap.ToReliefImage(n);
                    ShowImage s = new ShowImage(bitmap, "浮雕图片");
                    s.Show();
                }
                else
                {
                    MessageBox.Show("对不起,你的输入参数错误!");
                }
            }
            private void btnMosaicImage_Click(object sender, EventArgs e)
            {
                RGBImage rgbBitmap = new RGBImage(bmp);
                InputDialog nn=new InputDialog ("输入模板大小:","输入参数","3");
                nn.ShowDialog();
                if (nn.result != "")
                {
                    int n = Convert.ToInt16(nn.result);
                    Bitmap bitmap = rgbBitmap.ToMosaicImage(n);
                    ShowImage s = new ShowImage(bitmap, "镶嵌图片");
                    s.Show();
                }
                else
                {
                    MessageBox.Show("对不起,你的输入参数错误!");
                }
            }
            private void btnTranslationImage_Click(object sender, EventArgs e)
            {
                RGBImage rgbBitmap = new RGBImage(bmp);
                InputDialog nn=new InputDialog ("输入平移的像素数:","输入参数","20");
                nn.ShowDialog();
                if (nn.result != "")
                {
                    int n = Convert.ToInt16(nn.result);
                    Bitmap bitmap = rgbBitmap.TranslationImage(n);
                    ShowImage s = new ShowImage(bitmap, "平移图片");
                    s.Show();
                }
                else
                {
                    MessageBox.Show("对不起,你的输入参数错误!");
                }
            }
            private void btnLargerImage_Click(object sender, EventArgs e)
            {
                RGBImage rgbBitmap = new RGBImage(bmp);
                InputDialog nn=new InputDialog ("输入放大倍数:","输入参数","2");
                nn.ShowDialog();
                if (nn.result != "")
                {
                    double n = Convert.ToDouble(nn.result);
                    Bitmap bitmap = rgbBitmap.ResizeImage(n);
                    ShowImage s = new ShowImage(bitmap, "放大图片");
                    s.Show();
                }
                else
                {
                    MessageBox.Show("对不起,你的输入参数错误!");
                }
            }
            private void btnSmallerImage_Click(object sender, EventArgs e)
            {
                RGBImage rgbBitmap = new RGBImage(bmp);
                InputDialog nn=new InputDialog ("输入缩小倍数:","输入参数","0.5");
                nn.ShowDialog();
                if (nn.result != "")
                {
                    double n = Convert.ToDouble(nn.result);
                    Bitmap bitmap = rgbBitmap.ResizeImage(n);
                    ShowImage s = new ShowImage(bitmap, "缩小图片");
                    s.Show();
                }
                else
                {
                    MessageBox.Show("对不起,你的输入参数错误!");
                }
            }
            private void btnLRFlipImage_Click(object sender, EventArgs e)
            {
                RGBImage rgbBitmap = new RGBImage(bmp);
                Bitmap bitmap = rgbBitmap.LRFlipImage();
                ShowImage s = new ShowImage(bitmap, "左右翻转");
                s.Show();
            }
            private void btnUDFlipImage_Click(object sender, EventArgs e)
            {
                RGBImage rgbBitmap = new RGBImage(bmp);
                Bitmap bitmap = rgbBitmap.UDFlipImage();
                ShowImage s = new ShowImage(bitmap, "上下翻转");
                s.Show();
            }
            private void ImageProcessor_Load(object sender, EventArgs e)
            {
                this.MaximumSize = new Size(this.Width, this.Height);
                this.MinimumSize = this.MaximumSize;
            }
            private void btnRotateImage_Click(object sender, EventArgs e)
            {
                RGBImage rgbBitmap = new RGBImage(bmp);
                InputDialog nn=new InputDialog ("输入旋转度数:","输入参数","30");
                nn.ShowDialog();
                if (nn.result != "")
                {
                    double n = Convert.ToDouble(nn.result);
                    Bitmap bitmap = rgbBitmap.RotateImage(n);
                    ShowImage s = new ShowImage(bitmap, "旋转图片");
                    s.Show();
                }
                else
                {
                    MessageBox.Show("对不起,你的输入参数错误!");
                }
            }
            private void btnHistImage_Click(object sender, EventArgs e)
            {
                RGBImage rgbBitmap = new RGBImage(bmp);
                Bitmap bitmap = rgbBitmap.HistImage();
                ShowImage s = new ShowImage(bitmap, "直方图");
                s.Show();
            }

  • 相关阅读:
    84. Largest Rectangle in Histogram (Solution 2)
    84. Largest Rectangle in Histogram (Solution 1)
    73. Set Matrix Zeroes
    【JavaScript】Symbol 静态方法
    【JavaScript】Date
    【JavaScript】Math
    725. Split Linked List in Parts把链表分成长度不超过1的若干部分
    791. Custom Sort String字符串保持字母一样,位置可以变
    508. Most Frequent Subtree Sum 最频繁的子树和
    762. Prime Number of Set Bits in Binary Representation二进制中有质数个1的数量
  • 原文地址:https://www.cnblogs.com/Yjianyong/p/2743002.html
Copyright © 2011-2022 走看看