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();
        }

原文地址:https://www.cnblogs.com/Yjianyong/p/2743002.html