Form1.cs
上传用户:c6x6r6
上传日期:2022-07-31
资源大小:515k
文件大小:35k
源码类别:

波变换

开发平台:

Visual Basic

  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Windows.Forms;
  9. using System.Drawing.Drawing2D;
  10. using System.IO;
  11. using System.Drawing.Imaging;
  12. using System.Runtime.InteropServices;
  13. namespace WindowsFormsApplication2
  14. {
  15.     public partial class Form1 : Form
  16.     {
  17.         #region 本地属性
  18.         string _currentImagePath = string.Empty;
  19.         Bitmap _currentBmp = null;
  20.         Bitmap _currentBmpClone = null;
  21.         
  22.         #endregion
  23.         #region 初始化
  24.         public Form1()
  25.         {
  26.             InitializeComponent();
  27.             this.Text = "ImageManagemer";
  28.         }
  29.         private void Form1_Load(object sender, EventArgs e)
  30.         {
  31.         }
  32.         #endregion
  33.         #region 事件
  34.         private void openToolStripMenuItem_Click(object sender, EventArgs e)
  35.         {
  36.             Open();
  37.         }
  38.         private void saveToolStripMenuItem_Click(object sender, EventArgs e)
  39.         {
  40.             Save();
  41.         }
  42.         private void fileToolStripMenuItem_Click(object sender, EventArgs e)
  43.         {
  44.         }
  45.         private void reverseToolStripMenuItem_Click(object sender, EventArgs e)
  46.         {
  47.         }
  48.         private void 直方图计算ToolStripMenuItem_Click(object sender, EventArgs e)
  49.         {
  50.         }
  51.         private void helpToolStripMenuItem_Click(object sender, EventArgs e)
  52.         {
  53.            
  54.         }
  55.         private void 水平翻转ToolStripMenuItem_Click(object sender, EventArgs e)
  56.         {
  57.             if(_currentBmpClone == null) return;
  58.             _currentBmpClone.RotateFlip(RotateFlipType.RotateNoneFlipX);
  59.             this.pictureBox1.Image.Dispose();
  60.             this.pictureBox1.Image = _currentBmpClone.Clone() as Image;
  61.             //this.pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
  62.             
  63.         }
  64.         private void 垂直翻转ToolStripMenuItem_Click(object sender, EventArgs e)
  65.         {
  66.             if (_currentBmpClone == null) return;
  67.             _currentBmpClone.RotateFlip(RotateFlipType.RotateNoneFlipXY);
  68.             this.pictureBox1.Image.Dispose();
  69.             this.pictureBox1.Image = _currentBmpClone.Clone() as Image;
  70.             //this.pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
  71.         }
  72.         private void saveAsToolStripMenuItem_Click(object sender, EventArgs e)
  73.         {
  74.             SaveAs();
  75.         }
  76.         private void exitToolStripMenuItem_Click(object sender, EventArgs e)
  77.         {
  78.         }
  79.         private void pictureBox1_Click(object sender, EventArgs e)
  80.         {
  81.         }
  82.         private void aboutToolStripMenuItem_Click(object sender, EventArgs e)
  83.         {
  84.             new AboutForm().Show();
  85.         }
  86.         #endregion
  87.         #region 本地方法
  88.         void Open()
  89.         {
  90.             OpenFileDialog of = new OpenFileDialog();
  91.             of.Filter = "所有图像文件 | *.bmp; *.pcx; *.png; *.jpg; *.gif;" +
  92.                 "*.tif; *.ico; *.dxf; *.cgm; *.cdr; *.wmf; *.eps; *.emf|" +
  93.                 "位图( *.bmp; *.jpg; *.png;...) | *.bmp; *.pcx; *.png; *.jpg; *.gif; *.tif; *.ico|" +
  94.                 "矢量图( *.wmf; *.eps; *.emf;...) | *.dxf; *.cgm; *.cdr; *.wmf; *.eps; *.emf";
  95.             of.Title = "打开图像文件";
  96.             of.ShowHelp = true;
  97.             if (of.ShowDialog() == DialogResult.OK && string.IsNullOrEmpty(of.FileName) == false)
  98.             {
  99.                 _currentImagePath = of.FileName;
  100.                 _currentBmp = Image.FromFile(of.FileName) as Bitmap;
  101.                 _currentBmpClone = _currentBmp.Clone() as Bitmap;
  102.                 this.pictureBox1.Image = Image.FromFile(of.FileName);
  103.             }
  104.         }
  105.         void Save()
  106.         {
  107.             if (string.IsNullOrEmpty(_currentImagePath)) return;
  108.             this.pictureBox1.Image.Dispose();
  109.             _currentBmp.Dispose();
  110.             _currentBmp = _currentBmpClone.Clone() as Bitmap;
  111.             string temp = _currentImagePath.Substring(0, _currentImagePath.LastIndexOf('.')) +"bmp";
  112.             _currentBmpClone.Save(temp);
  113.             File.Delete(_currentImagePath);
  114.             System.IO.File.Move(temp, _currentImagePath);
  115.      
  116.             this.pictureBox1.Image = _currentBmpClone.Clone() as Image;
  117.             
  118.         }
  119.         void SaveAs()
  120.         {
  121.             SaveFileDialog sf = new SaveFileDialog();
  122.             sf.FileName = "Temp.bmp";
  123.             if (sf.ShowDialog() == DialogResult.OK)
  124.             {
  125.                 _currentBmpClone.Save(sf.FileName);
  126.             }
  127.         }
  128.         #endregion
  129.         private void 顺时针旋转ToolStripMenuItem_Click(object sender, EventArgs e)
  130.         {
  131.             if (_currentBmpClone == null) return;
  132.             _currentBmpClone.RotateFlip(RotateFlipType.Rotate90FlipNone);
  133.             this.pictureBox1.Image.Dispose();
  134.             this.pictureBox1.Image = _currentBmpClone.Clone() as Image;
  135.             //this.pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage; 
  136.         }
  137.         private void 逆时针旋转ToolStripMenuItem_Click(object sender, EventArgs e)
  138.         {
  139.             if (_currentBmpClone == null) return;
  140.             _currentBmpClone.RotateFlip(RotateFlipType.Rotate90FlipXY);
  141.             this.pictureBox1.Image.Dispose();
  142.             this.pictureBox1.Image = _currentBmpClone.Clone() as Image;
  143.             //this.pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage; 
  144.         }
  145.         private void 傅里叶变换ToolStripMenuItem_Click(object sender, EventArgs e)
  146.         {
  147.             MyFFT fft = new MyFFT();
  148.             Bitmap result = fft.GetFFTPic((Bitmap)pictureBox1.Image);
  149.             pictureBox1.Image.Dispose();
  150.             pictureBox1.Image = result;
  151.         }
  152.         private Bitmap edgeDetection(Bitmap curBitmap, int thresh)
  153.         {
  154.             Rectangle rect = new Rectangle(0, 0, curBitmap.Width, curBitmap.Height);
  155.             BitmapData bmpData = curBitmap.LockBits(rect, ImageLockMode.ReadWrite, curBitmap.PixelFormat);
  156.             IntPtr ptr = bmpData.Scan0;
  157.             int bytes = curBitmap.Width * curBitmap.Height;
  158.             byte[] rgbValues = new byte[bytes * 3];
  159.             Marshal.Copy(ptr, rgbValues, 0, bytes * 3);
  160.             byte[] grayValues = new byte[bytes];
  161.             double[] tempArray = new double[bytes];
  162.             byte[] rValues = new byte[bytes];
  163.             byte[] gValues = new byte[bytes];
  164.             byte[] bValues = new byte[bytes];
  165.             for (int i = 0; i < bytes; i++)
  166.             {
  167.                 rValues[i] = rgbValues[i * 3 + 2];
  168.                 gValues[i] = rgbValues[i * 3 + 1];
  169.                 bValues[i] = rgbValues[i * 3];
  170.             }
  171.             double maxV = 0.0;
  172.             double minV = 1000.0;
  173.             double grh, ggh, gbh;
  174.             double grv, ggv, gbv;
  175.             double gxx, gyy, gxy;
  176.             double ge1, ge2;
  177.             double theta;
  178.             for (int i = 0; i < curBitmap.Height; i++)
  179.             {
  180.                 for (int j = 0; j < curBitmap.Width; j++)
  181.                 {
  182.                     grh = rValues[((Math.Abs(i - 1)) % curBitmap.Height) * curBitmap.Width + ((j + 1) % curBitmap.Width)] + 2 * rValues[i * curBitmap.Width + ((j + 1) % curBitmap.Width)] + rValues[((i + 1) % curBitmap.Height) * curBitmap.Width + ((j + 1) % curBitmap.Width)] -
  183.                         rValues[((Math.Abs(i - 1)) % curBitmap.Height) * curBitmap.Width + ((Math.Abs(j - 1)) % curBitmap.Width)] - 2 * rValues[i * curBitmap.Width + ((Math.Abs(j - 1)) % curBitmap.Width)] - rValues[((i + 1) % curBitmap.Height) * curBitmap.Width + ((Math.Abs(j - 1)) % curBitmap.Width)];
  184.                     ggh = gValues[((Math.Abs(i - 1)) % curBitmap.Height) * curBitmap.Width + ((j + 1) % curBitmap.Width)] + 2 * gValues[i * curBitmap.Width + ((j + 1) % curBitmap.Width)] + gValues[((i + 1) % curBitmap.Height) * curBitmap.Width + ((j + 1) % curBitmap.Width)] -
  185.                         gValues[((Math.Abs(i - 1)) % curBitmap.Height) * curBitmap.Width + ((Math.Abs(j - 1)) % curBitmap.Width)] - 2 * gValues[i * curBitmap.Width + ((Math.Abs(j - 1)) % curBitmap.Width)] - gValues[((i + 1) % curBitmap.Height) * curBitmap.Width + ((Math.Abs(j - 1)) % curBitmap.Width)];
  186.                     gbh = bValues[((Math.Abs(i - 1)) % curBitmap.Height) * curBitmap.Width + ((j + 1) % curBitmap.Width)] + 2 * bValues[i * curBitmap.Width + ((j + 1) % curBitmap.Width)] + bValues[((i + 1) % curBitmap.Height) * curBitmap.Width + ((j + 1) % curBitmap.Width)] -
  187.                         bValues[((Math.Abs(i - 1)) % curBitmap.Height) * curBitmap.Width + ((Math.Abs(j - 1)) % curBitmap.Width)] - 2 * bValues[i * curBitmap.Width + ((Math.Abs(j - 1)) % curBitmap.Width)] - bValues[((i + 1) % curBitmap.Height) * curBitmap.Width + ((Math.Abs(j - 1)) % curBitmap.Width)];
  188.                     grv = rValues[((Math.Abs(i - 1)) % curBitmap.Height) * curBitmap.Width + ((Math.Abs(j - 1)) % curBitmap.Width)] + 2 * rValues[((Math.Abs(i - 1)) % curBitmap.Height) * curBitmap.Width + j] + rValues[((Math.Abs(i - 1)) % curBitmap.Height) * curBitmap.Width + ((j + 1) % curBitmap.Width)] -
  189.                         rValues[((i + 1) % curBitmap.Height) * curBitmap.Width + ((Math.Abs(j - 1)) % curBitmap.Width)] - 2 * rValues[((i + 1) % curBitmap.Height) * curBitmap.Width + j] - rValues[((i + 1) % curBitmap.Height) * curBitmap.Width + ((j + 1) % curBitmap.Width)];
  190.                     ggv = gValues[((Math.Abs(i - 1)) % curBitmap.Height) * curBitmap.Width + ((Math.Abs(j - 1)) % curBitmap.Width)] + 2 * gValues[((Math.Abs(i - 1)) % curBitmap.Height) * curBitmap.Width + j] + gValues[((Math.Abs(i - 1)) % curBitmap.Height) * curBitmap.Width + ((j + 1) % curBitmap.Width)] -
  191.                         gValues[((i + 1) % curBitmap.Height) * curBitmap.Width + ((Math.Abs(j - 1)) % curBitmap.Width)] - 2 * gValues[((i + 1) % curBitmap.Height) * curBitmap.Width + j] - gValues[((i + 1) % curBitmap.Height) * curBitmap.Width + ((j + 1) % curBitmap.Width)];
  192.                     gbv = bValues[((Math.Abs(i - 1)) % curBitmap.Height) * curBitmap.Width + ((Math.Abs(j - 1)) % curBitmap.Width)] + 2 * bValues[((Math.Abs(i - 1)) % curBitmap.Height) * curBitmap.Width + j] + bValues[((Math.Abs(i - 1)) % curBitmap.Height) * curBitmap.Width + ((j + 1) % curBitmap.Width)] -
  193.                         bValues[((i + 1) % curBitmap.Height) * curBitmap.Width + ((Math.Abs(j - 1)) % curBitmap.Width)] - 2 * bValues[((i + 1) % curBitmap.Height) * curBitmap.Width + j] - bValues[((i + 1) % curBitmap.Height) * curBitmap.Width + ((j + 1) % curBitmap.Width)];
  194.                     gxx = grh * grh + ggh * ggh + gbh * gbh;
  195.                     gyy = grv * grv + ggv * ggv + gbv * gbv;
  196.                     gxy = grh * grv + ggh * ggv + gbh * gbv;
  197.                     theta = Math.Atan(2 * gxy / (gxx - gyy + 0.000000001)) / 2;
  198.                     ge1 = ((gxx + gyy) + (gxx - gyy) * Math.Cos(2 * theta) + 2 * gxy * Math.Sin(2 * theta)) / 2;
  199.                     theta = theta + Math.PI / 2;
  200.                     ge2 = ((gxx + gyy) + (gxx - gyy) * Math.Cos(2 * theta) + 2 * gxy * Math.Sin(2 * theta)) / 2;
  201.                     tempArray[i * curBitmap.Width + j] = Math.Max(Math.Sqrt(ge1), Math.Sqrt(ge2));
  202.                     if (tempArray[i * curBitmap.Width + j] > maxV)
  203.                         maxV = tempArray[i * curBitmap.Width + j];
  204.                     else if (tempArray[i * curBitmap.Width + j] < minV)
  205.                         minV = tempArray[i * curBitmap.Width + j];
  206.                 }
  207.             }
  208.             for (int i = 0; i < bytes; i++)
  209.             {
  210.                 grayValues[i] = (byte)((tempArray[i] - minV) * 255 / (maxV - minV));
  211.             }
  212.             if (thresh != 0)
  213.             {
  214.                 for (int i = 0; i < bytes; i++)
  215.                 {
  216.                     if (grayValues[i] > thresh)
  217.                         grayValues[i] = 255;
  218.                     else
  219.                         grayValues[i] = 0;
  220.                 }
  221.             }
  222.             curBitmap = new Bitmap(curBitmap.Width, curBitmap.Height, PixelFormat.Format8bppIndexed);
  223.             ColorPalette cp = curBitmap.Palette;
  224.             for (int i = 0; i < 256; i++)
  225.             {
  226.                 cp.Entries[i] = Color.FromArgb(i, i, i);
  227.             }
  228.             curBitmap.Palette = cp;
  229.             bmpData = curBitmap.LockBits(rect, ImageLockMode.ReadWrite, curBitmap.PixelFormat);
  230.             ptr = bmpData.Scan0;
  231.             System.Runtime.InteropServices.Marshal.Copy(grayValues, 0, ptr, bytes);
  232.             curBitmap.UnlockBits(bmpData);
  233.             return curBitmap;
  234.         }
  235.         private void 边缘检测ToolStripMenuItem_Click(object sender, EventArgs e)
  236.         {
  237.         }
  238.         private Bitmap LaplEdgeDetection(Bitmap src)
  239.         {
  240.             int w = src.Width;
  241.             int h = src.Height;
  242.             Bitmap newBmp = new Bitmap(w, h);
  243.             Color oColor, gColor;
  244.             float brightness;
  245.             int gRGB;
  246.             //gray
  247.             for (int x = 0; x < w; x++)
  248.             {
  249.                 for (int y = 0; y < h; y++)
  250.                 {
  251.                     oColor = src.GetPixel(x, y);
  252.                     brightness = oColor.GetBrightness();
  253.                     gRGB = (int)(brightness * 255);
  254.                     gColor = Color.FromArgb(gRGB, gRGB, gRGB);
  255.                     src.SetPixel(x, y, gColor);
  256.                 }
  257.             }
  258.             Color pixel;
  259.             int[] Laplacian = { -1, -1, -1, -1, 8, -1, -1, -1, -1 };
  260.             for (int x = 1; x < w - 1; x++)
  261.             {
  262.                 for (int y = 1; y < h - 1; y++)
  263.                 {
  264.                     int r = 0, g = 0, b = 0;
  265.                     int index = 0;
  266.                     for (int col = -1; col < 2; col++)
  267.                     {
  268.                         for (int row = -1; row < 2; row++)
  269.                         {
  270.                             pixel = src.GetPixel(x + row, y + col);
  271.                             r += pixel.R * Laplacian[index];
  272.                             g += pixel.G * Laplacian[index];
  273.                             b += pixel.B * Laplacian[index];
  274.                             index++;
  275.                         }
  276.                     }
  277.                     //pixel scale
  278.                     r = r > 255 ? 255 : r;
  279.                     r = r < 0 ? 0 : r;
  280.                     g = g > 255 ? 255 : g;
  281.                     g = g < 0 ? 0 : g;
  282.                     b = b > 255 ? 255 : b;
  283.                     b = b < 0 ? 0 : b;
  284.                     newBmp.SetPixel(x, y, Color.FromArgb(r, g, b));
  285.                 }
  286.             }
  287.             src.Dispose();
  288.             return newBmp;
  289.         }
  290.         private Bitmap ConvertToGray(Bitmap src)
  291.         {
  292.             int w = src.Width;
  293.             int h = src.Height;
  294.             Rectangle rect = new Rectangle(0, 0, w, h);
  295.             BitmapData srcData = src.LockBits(rect, ImageLockMode.ReadOnly, src.PixelFormat);
  296.             unsafe
  297.             {
  298.                 byte* ptr = (byte*)srcData.Scan0;
  299.                 for (int y = 0; y < h; y++)
  300.                 {
  301.                     for (int x = 0; x < w; x++)
  302.                     {
  303.                         int gray = (int)(ptr[0] * 0.3 + ptr[1] * 0.59 + ptr[2] * 0.11);
  304.                         ptr[0] = (byte)gray;
  305.                         ptr[1] = (byte)gray;
  306.                         ptr[2] = (byte)gray;
  307.                         ptr += 3;
  308.                     }
  309.                     ptr += srcData.Stride - 3 * w;
  310.                 }
  311.             }
  312.             src.UnlockBits(srcData);
  313.             return src;
  314.         }
  315.         private void 阈值分割ToolStripMenuItem_Click(object sender, EventArgs e)
  316.         {
  317.             
  318.             Bitmap src = ConvertToGray((Bitmap)pictureBox1.Image);
  319.             int[] histogram = new int[256];
  320.             byte maxGray = 0;
  321.             byte minGray = 255;
  322.             int w = src.Width;
  323.             int h = src.Height;
  324.             Rectangle rect = new Rectangle(0, 0, w, h);
  325.             BitmapData srcData = src.LockBits(rect, ImageLockMode.ReadWrite, src.PixelFormat);
  326.             unsafe
  327.             {
  328.                 byte* ptr = (byte*)srcData.Scan0;
  329.                 byte temp;
  330.                 for (int y = 0; y < h; y++)
  331.                 {
  332.                     for (int x = 0; x < w; x++)
  333.                     {
  334.                         temp = ptr[0];
  335.                         histogram[temp]++;
  336.                         if (temp > maxGray)
  337.                             maxGray = temp;
  338.                         if (temp < minGray)
  339.                             minGray = temp;
  340.                         ptr += 3;
  341.                     }
  342.                     ptr += srcData.Stride - 3 * w;
  343.                 }
  344.                 double sum = 0;
  345.                 double w1 = 0, w2 = 0;
  346.                 int numerator = 0;
  347.                 for (int i = minGray; i <= maxGray; i ++ )
  348.                 {
  349.                     sum += i * histogram[i];
  350.                 }
  351.                 double mu1, mu2;
  352.                 double sigma;
  353.                 int count = w * h;
  354.                 double tempMax = 0;
  355.                 byte T = 0 ;
  356.                 for (int i = minGray; i <= maxGray; i++ )
  357.                 {
  358.                     w1 += histogram[i];
  359.                     numerator += i * histogram[i];
  360.                     mu1 = numerator / w1;
  361.                     w2 = count - w1;
  362.                     mu2 = (sum - numerator) / w2;
  363.                     sigma = w1 * w2 * (mu1 - mu2) * (mu1 - mu2);
  364.                     if (sigma > tempMax)
  365.                     {
  366.                         tempMax = sigma;
  367.                         T = Convert.ToByte(i);
  368.                     }
  369.                 }
  370.                 ptr = (byte*)srcData.Scan0;
  371.                 for (int y = 0; y < h; y ++ )
  372.                 {
  373.                     for (int x = 0; x < w; x++ )
  374.                     {
  375.                         if (ptr[0] < T)
  376.                         {
  377.                             ptr[0] = 0;
  378.                             ptr[1] = 0;
  379.                             ptr[2] = 0;
  380.                         }
  381.                         else
  382.                         {
  383.                             ptr[0] = 255;
  384.                             ptr[1] = 255;
  385.                             ptr[2] = 255;
  386.                         }
  387.                         ptr += 3;
  388.                     }
  389.                     ptr += srcData.Stride - 3 * w;
  390.                 }
  391.             }
  392.             src.UnlockBits(srcData);
  393.             pictureBox1.Image = src;
  394.         }
  395.         private Bitmap ruihua(Bitmap bm)
  396.         {
  397.             Color c1 = new Color();
  398.             Color c2 = new Color();
  399.             Bitmap box1 = bm;
  400.             Bitmap box2 = bm;
  401.             int rr, gg, bb;
  402.             int r1, g1, b1;
  403.             int r2, g2, b2;
  404.             for (int i = 1; i < bm.Width - 1; ++i)
  405.             {
  406.                 for (int j = 1; j < bm.Height - 1; ++j)
  407.                 {
  408.                     rr = gg = bb = 0;
  409.                     c1 = box1.GetPixel(i, j);
  410.                     r1 = c1.R;
  411.                     g1 = c1.G;
  412.                     b1 = c1.B;
  413.                     c2 = box1.GetPixel(i - 1, j - 1);
  414.                     r2 = c2.R;
  415.                     g2 = c2.G;
  416.                     b2 = c2.B;
  417.                     rr = r1 + Math.Abs((r1 - r2) / 4);
  418.                     gg = g1 + Math.Abs((g1 - g2) / 4);
  419.                     bb = b1 + Math.Abs((b1 - b2) / 4);
  420.                     if (rr < 0) rr = 0;
  421.                     if (rr > 255) rr = 255;
  422.                     if (gg < 0) gg = 0;
  423.                     if (gg > 255) gg = 255;
  424.                     if (bb < 0) bb = 0;
  425.                     if (bb > 255) bb = 255;
  426.                     Color c3 = Color.FromArgb(rr, gg, bb);  //用formArgb方法由颜色分量值创建color结构
  427.                     box2.SetPixel(i, j, c3);
  428.                 }
  429.             }
  430.             return box2;
  431.         }
  432.         private void 锐化ToolStripMenuItem_Click(object sender, EventArgs e)
  433.         {
  434.             pictureBox1.Image = ruihua((Bitmap)pictureBox1.Image);
  435.         }
  436.         private void 直方图ToolStripMenuItem1_Click(object sender, EventArgs e)
  437.         {
  438.             if (pictureBox1.Image != null)
  439.             {
  440.                 histForm histogram = new histForm((Bitmap)pictureBox1.Image);
  441.                 histogram.ShowDialog();
  442.             }
  443.         }
  444.         private void 直方图均衡ToolStripMenuItem1_Click(object sender, EventArgs e)
  445.         {
  446.             Bitmap curBitmap = (Bitmap)pictureBox1.Image;
  447.             if (curBitmap != null)
  448.             {
  449.                 Rectangle rect = new Rectangle(0, 0, curBitmap.Width, curBitmap.Height);
  450.                 BitmapData bmpData = curBitmap.LockBits(rect, ImageLockMode.ReadWrite, curBitmap.PixelFormat);
  451.                 IntPtr ptr = bmpData.Scan0;
  452.                 int bytes = curBitmap.Width * curBitmap.Height;
  453.                 byte[] rgbValues = new byte[bytes * 3];
  454.                 Marshal.Copy(ptr, rgbValues, 0, bytes * 3);
  455.                 int[,] countPixel = new int[3, 256];
  456.                 int rTemp, gTemp, bTemp;
  457.                 for (int i = 0; i < bytes; i++)
  458.                 {
  459.                     rTemp = ++countPixel[0, rgbValues[i * 3 + 2]];
  460.                     gTemp = ++countPixel[1, rgbValues[i * 3 + 1]];
  461.                     bTemp = ++countPixel[2, rgbValues[i * 3]];
  462.                 }
  463.                 int[,] tempArray = new int[3, 256];
  464.                 byte[,] pixelMap = new byte[3, 256];
  465.                 byte temp;
  466.                 for (int i = 0; i < 256; i++)
  467.                 {
  468.                     if (i != 0)
  469.                     {
  470.                         tempArray[ 0 , i] = tempArray[0 , i - 1] + countPixel[0 , i];
  471.                         tempArray[1, i] = tempArray[1, i - 1] + countPixel[1, i];
  472.                         tempArray[2, i] = tempArray[2, i - 1] + countPixel[2, i];
  473.                     }
  474.                     else
  475.                     {
  476.                         tempArray[0 , 0] = countPixel[0 , 0];
  477.                         tempArray[1, 0] = countPixel[1, 0];
  478.                         tempArray[2, 0] = countPixel[2, 0];
  479.                     }
  480.                     pixelMap[0 ,i] = (byte)(255.0 * tempArray[0 , i] / bytes + 0.5);
  481.                     pixelMap[1, i] = (byte)(255.0 * tempArray[1, i] / bytes + 0.5);
  482.                     pixelMap[2, i] = (byte)(255.0 * tempArray[2, i] / bytes + 0.5);
  483.                 }
  484.                 for (int i = 0; i < bytes; i++)
  485.                 {
  486.                     temp = rgbValues[i * 3 + 2];
  487.                     rgbValues[i * 3 + 2] = pixelMap[ 0 , temp];
  488.                     temp = rgbValues[i * 3 + 1];
  489.                     rgbValues[i * 3 + 1] = pixelMap[ 1 , temp];
  490.                     temp = rgbValues[i * 3];
  491.                     rgbValues[i * 3] = pixelMap[ 2 , temp];
  492.                 }
  493.                 Marshal.Copy(rgbValues, 0, ptr, bytes * 3);
  494.                 curBitmap.UnlockBits(bmpData);
  495.                 Invalidate();
  496.             }
  497.         }
  498.         private void 柔化ToolStripMenuItem_Click(object sender, EventArgs e)
  499.         {
  500.             Bitmap result = rouhua((Bitmap)pictureBox1.Image);
  501.             pictureBox1.Image.Dispose();
  502.             pictureBox1.Image = result;
  503.         }
  504.         private Bitmap rouhua(Bitmap src)
  505.         {
  506.             int w = src.Width;
  507.             int h = src.Height;
  508.             Bitmap newBmp = new Bitmap(w, h);
  509.             Color pixel;
  510.             int[] Guassin = { 1, 2, 1, 2, 4, 2, 1, 2, 1 };
  511.             for (int x = 1; x < w - 1; x++)
  512.             {
  513.                 for (int y = 1; y < h - 1; y++)
  514.                 {
  515.                     int r = 0, g = 0, b = 0;
  516.                     int index = 0;
  517.                     for (int col = -1; col < 2; col++)
  518.                     {
  519.                         for (int row = -1; row < 2; row++)
  520.                         {
  521.                             pixel = src.GetPixel(x + row, y + col);
  522.                             r += pixel.R * Guassin[index];
  523.                             g += pixel.G * Guassin[index];
  524.                             b += pixel.B * Guassin[index];
  525.                             index++;
  526.                         }
  527.                     }
  528.                     r = r / 16;
  529.                     g = g / 16;
  530.                     b = b / 16;
  531.                     //pixel scale
  532.                     r = r > 255 ? 255 : r;
  533.                     r = r < 0 ? 0 : r;
  534.                     g = g > 255 ? 255 : g;
  535.                     g = g < 0 ? 0 : g;
  536.                     b = b > 255 ? 255 : b;
  537.                      b = b < 0 ? 0 : b;
  538.                     newBmp.SetPixel(x, y, Color.FromArgb(r, g, b));
  539.                 }
  540.             }
  541.             return newBmp;
  542.         }
  543.         private void 拉普拉斯ToolStripMenuItem_Click(object sender, EventArgs e)
  544.         {
  545.             Bitmap result = LaplEdgeDetection((Bitmap)pictureBox1.Image);
  546.             pictureBox1.Image.Dispose();
  547.             pictureBox1.Image = result;
  548.         }
  549.         private void sobeToolStripMenuItem_Click(object sender, EventArgs e)
  550.         {
  551.             Bitmap result = edgeDetection((Bitmap)pictureBox1.Image , 40);
  552.             pictureBox1.Image.Dispose();
  553.             pictureBox1.Image = result;
  554.         }
  555.         private void 椒盐噪声ToolStripMenuItem_Click(object sender, EventArgs e)
  556.         {
  557.             //加椒盐噪声
  558.             if (pictureBox1.Image == null)
  559.             {
  560.                 return;
  561.             }
  562.             int Height = this.pictureBox1.Image.Height;
  563.             int Width = this.pictureBox1.Image.Width;
  564.             Bitmap oldbitmap = (Bitmap)this.pictureBox1.Image;
  565.             Bitmap newbitmap = new Bitmap(Width, Height);
  566.             Color pixel;
  567.             for (int x = 0; x < Width; x++)
  568.             {
  569.                 for (int y = 0; y < Height; y++)
  570.                 {
  571.                     int r, g, b;
  572.                     pixel = oldbitmap.GetPixel(x, y);
  573.                     r = pixel.R;
  574.                     g = pixel.G;
  575.                     b = pixel.B;
  576.                     newbitmap.SetPixel(x, y, Color.FromArgb(r, g, b));
  577.                 }
  578.             }
  579.             for (int z = 0; z < 1000; z++)
  580.             {
  581.                 Random random1 = new Random(z);
  582.                 int a = random1.Next(Width);
  583.                 Random random2 = new Random(a * unchecked((int)DateTime.Now.Ticks));
  584.                 int b = random2.Next(Height);
  585.                 Random random3 = new Random(b * unchecked((int)DateTime.Now.Ticks));
  586.                 int c = random3.Next(2);
  587.                 newbitmap.SetPixel(a, b, Color.FromArgb(c * 255, c * 255, c * 255));
  588.             }
  589.             this.pictureBox1.Image = newbitmap;
  590.         }
  591.         private void 高斯噪声ToolStripMenuItem_Click(object sender, EventArgs e)
  592.         {
  593.             //加高斯噪声
  594.             if (pictureBox1.Image == null)
  595.             {
  596.                 return;
  597.             }
  598.             int Height = this.pictureBox1.Image.Height;
  599.             int Width = this.pictureBox1.Image.Width;
  600.             Bitmap oldbitmap = (Bitmap)this.pictureBox1.Image;
  601.             Bitmap newbitmap = new Bitmap(Width, Height);
  602.             Color pixel;
  603.             double u, v;
  604.             for (int x = 0; x < Width; x++)
  605.             {
  606.                 for (int y = 0; y < Height; y++)
  607.                 {
  608.                     Random random1 = new Random((x + 1) * (1 + y) * unchecked((int)DateTime.Now.Ticks));
  609.                     u = random1.NextDouble();
  610.                     Random random2 = new Random((int)u * unchecked((int)DateTime.Now.Ticks));
  611.                     v = random2.NextDouble();
  612.                     double gs = Math.Pow(-2 * Math.Log(u, Math.E), 0.5) * Math.Sin(2 * Math.PI * v);
  613.                     int r, g, b;
  614.                     int t = (int)(gs * 50 + 128);
  615.                     if (t < 0) t = 0;
  616.                     if (t > 255) t = 255;
  617.                     pixel = oldbitmap.GetPixel(x, y);
  618.                     r = pixel.R;
  619.                     g = pixel.G;
  620.                     b = pixel.B;
  621.                     newbitmap.SetPixel(x, y, Color.FromArgb((int)(r + t) / 2, (int)(g + t) / 2, (int)(b + t) / 2));
  622.                 }
  623.             }
  624.             this.pictureBox1.Image = newbitmap;
  625.         }
  626.         public Bitmap getNewBitmap(Bitmap old)
  627.         {
  628.             int Height = old.Height;
  629.             int Width = old.Width;
  630.             Bitmap newbitmap = new Bitmap(Width + 2, Height + 2);
  631.             Color pixel;
  632.             for (int x = 0; x < Width + 2; x++)
  633.             {
  634.                 for (int y = 0; y < Height + 2; y++)
  635.                 {
  636.                     int r, g, b;
  637.                     if (x == 0 && y == 0)
  638.                     {
  639.                         pixel = old.GetPixel(x, y);
  640.                         r = pixel.R;
  641.                         g = pixel.G;
  642.                         b = pixel.B;
  643.                     }
  644.                     else
  645.                     {
  646.                         if (x == 0 && y == Height + 1)
  647.                         {
  648.                             pixel = old.GetPixel(x, y - 2);
  649.                             r = pixel.R;
  650.                             g = pixel.G;
  651.                             b = pixel.B;
  652.                         }
  653.                         else
  654.                         {
  655.                             if (x == Width + 1 && y == 0)
  656.                             {
  657.                                 pixel = old.GetPixel(x - 2, y);
  658.                                 r = pixel.R;
  659.                                 g = pixel.G;
  660.                                 b = pixel.B;
  661.                             }
  662.                             else
  663.                             {
  664.                                 if (x == Width + 1 && y == Height + 1)
  665.                                 {
  666.                                     pixel = old.GetPixel(x - 2, y - 2);
  667.                                     r = pixel.R;
  668.                                     g = pixel.G;
  669.                                     b = pixel.B;
  670.                                 }
  671.                                 else
  672.                                 {
  673.                                     if (x == 0)
  674.                                     {
  675.                                         pixel = old.GetPixel(x, y - 1);
  676.                                         r = pixel.R;
  677.                                         g = pixel.G;
  678.                                         b = pixel.B;
  679.                                     }
  680.                                     else
  681.                                     {
  682.                                         if (x == Width + 1)
  683.                                         {
  684.                                             pixel = old.GetPixel(x - 2, y - 1);
  685.                                             r = pixel.R;
  686.                                             g = pixel.G;
  687.                                             b = pixel.B;
  688.                                         }
  689.                                         else
  690.                                         {
  691.                                             if (y == 0)
  692.                                             {
  693.                                                 pixel = old.GetPixel(x - 1, y);
  694.                                                 r = pixel.R;
  695.                                                 g = pixel.G;
  696.                                                 b = pixel.B;
  697.                                             }
  698.                                             else
  699.                                             {
  700.                                                 if (y == Height + 1)
  701.                                                 {
  702.                                                     pixel = old.GetPixel(x - 1, y - 2);
  703.                                                     r = pixel.R;
  704.                                                     g = pixel.G;
  705.                                                     b = pixel.B;
  706.                                                 }
  707.                                                 else
  708.                                                 {
  709.                                                     pixel = old.GetPixel(x - 1, y - 1);
  710.                                                     r = pixel.R;
  711.                                                     g = pixel.G;
  712.                                                     b = pixel.B;
  713.                                                 }
  714.                                             }
  715.                                         }
  716.                                     }
  717.                                 }
  718.                             }
  719.                         }
  720.                     }
  721.                     newbitmap.SetPixel(x, y, Color.FromArgb(r, g, b));
  722.                 }
  723.             }
  724.             return newbitmap;
  725.         }
  726.         private void 中值滤波ToolStripMenuItem_Click(object sender, EventArgs e)
  727.         {
  728.             //中值滤波
  729.             if (pictureBox1.Image == null)
  730.             {
  731.                 return;
  732.             }
  733.             int Height = this.pictureBox1.Image.Height + 2;
  734.             int Width = this.pictureBox1.Image.Width + 2;
  735.             Bitmap newbitmap2 = new Bitmap(Width - 2, Height - 2);
  736.             Bitmap oldbitmap = (Bitmap)this.pictureBox1.Image;
  737.             int[] r = new int[15];
  738.             int[] g = new int[15];
  739.             int[] b = new int[15];
  740.             Bitmap newbitmap = getNewBitmap(oldbitmap);
  741.             Color[] pixel = new Color[9];
  742.             for (int x = 1; x < Width - 1; x++)
  743.             {
  744.                 for (int y = 1; y < Height - 1; y++)
  745.                 {
  746.                     pixel[0] = newbitmap.GetPixel(x - 1, y - 1);
  747.                     pixel[1] = newbitmap.GetPixel(x, y - 1);
  748.                     pixel[2] = newbitmap.GetPixel(x + 1, y - 1);
  749.                     pixel[3] = newbitmap.GetPixel(x - 1, y);
  750.                     pixel[4] = newbitmap.GetPixel(x, y);
  751.                     pixel[5] = newbitmap.GetPixel(x + 1, y);
  752.                     pixel[6] = newbitmap.GetPixel(x - 1, y + 1);
  753.                     pixel[7] = newbitmap.GetPixel(x, y + 1);
  754.                     pixel[8] = newbitmap.GetPixel(x + 1, y + 1);
  755.                     for (int i = 0; i < 9; i++)
  756.                     {
  757.                         r[i] = pixel[i].R;
  758.                         g[i] = pixel[i].G;
  759.                         b[i] = pixel[i].B;
  760.                     }
  761.                     for (int j = 0; j < 4; j++)
  762.                     {
  763.                         r[9 + j] = pixel[j * 2 + 1].R;
  764.                         g[9 + j] = pixel[j * 2 + 1].G;
  765.                         b[9 + j] = pixel[j * 2 + 1].B;
  766.                     }
  767.                     r[14] = pixel[4].R;
  768.                     g[14] = pixel[4].G;
  769.                     b[14] = pixel[4].B;
  770.                     Array.Sort(r);
  771.                     Array.Sort(g);
  772.                     Array.Sort(b);
  773.                     newbitmap2.SetPixel(x - 1, y - 1, Color.FromArgb(r[7], g[7], b[7]));
  774.                 }
  775.             }
  776.             this.pictureBox1.Image = newbitmap2;
  777.         }
  778.         private void closeToolStripMenuItem_Click(object sender, EventArgs e)
  779.         {
  780.             pictureBox1.Image.Dispose();
  781.             pictureBox1.Image = null;
  782.         }
  783.     }
  784. }