首先实现P(x|y)=高斯函数(正态分布),即y是正态分布,是条件,我们把它还原到图像界面I(i,j)每一个像素,是结果

这个实际就是生成高斯模板,我们前面有3*3的高斯生成算法,但是根本没有办法显示,3*3=9个像素,针尖一样,我们在这个基础上,生成11*11的高斯模板,并放大16倍,生成图像,在界面显示出来,看是否是同心圆,二维高斯像一个大钟,我们用平面平行xy平面,切割大钟很多次,感到很像核磁共振人体切片,把这些等高线,让z=0,在xy平面画出来,验证一下,发现图像的高斯离散型和高斯的连续函数还是有差别(颗粒感很强,我们把模板数据变成了灰度),请看图:

生成高斯模板显示并观察马氏距离(吴恩达机器学习c#实践,高斯判别算法GDA,一)

生成高斯模板显示并观察马氏距离(吴恩达机器学习c#实践,高斯判别算法GDA,一)

c#完整代码如下:

namespace 画高斯同心圆
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            //生成二维高斯滤波系数//  
            // int nWidowSize = 3;
            int nWidowSize = 11;
            // double nSigma = 0.4;
            double nSigma = 3.3;
            // double nSigma = 1.4;
            //  double* pdKernal_2 = new double[nWidowSize*nWidowSize]; //定义二维高斯核数组   
            double[] pdKernal_2 = new double[11 * 11];
            //double[] pdKernal_2 = new double[3 * 3];
                                          
            ///二维高斯函数公式       
            //                        x*x+y*y                        ///   
            //              -1*--------------                ///   
            //  1             2*nSigma*nSigma                ///   
            // ---------------- e                                   ///   
            // 2*pi*nSigma*nSigma                                     ///   
            ///   
            int nCenter = (nWidowSize) / 2;
            for (int i = 0; i < nWidowSize; i++)
            {
                for (int j = 0; j < nWidowSize; j++)
                {
                    int nDis_x = i - nCenter;
                    int nDis_y = j - nCenter;
                    double temp = (nDis_x * nDis_x + nDis_y * nDis_y);
                   temp = temp / (nSigma * nSigma);
                    double r = Math.Sqrt(temp);//马氏距离
                    double 指数 = Math.Exp(-(1 / 2.0) * temp);
                    double temp2 = 指数 / (2 * 3.1415926 * nSigma * nSigma);
                    pdKernal_2[i + j * nWidowSize] = (int)(temp2 * 1000);
                   
                }
            }
         
            //因为是11*11,不妥,X12,所以改为44*44*3*3,最终放大了16倍
            byte[] gaos = new byte[11  * 11 ];
         
            for (int j = 0; j < 11; j++)
            {
                for (int i = 0; i < 11; i = i + 1)
                {
                    int nn = j * 11 + i;
                    int temp3 = (int)(pdKernal_2[nn] * 10);
                    gaos[nn] = temp3 > 255 ? (byte)255 : (byte)temp3;//              

                }
            }
            int ww = 132 + 44;
            int hh = 132 + 44;
            //int ww = 132 ;
            //int hh = 132 ;
            byte[] glob_buffer8 = new byte[ww * hh];
            //ZoomNormal(gaos, ref glob_buffer8, 11, 11,
            //           ref  ww, ref hh, 12, 12);
            ZoomNormal(gaos, ref glob_buffer8, 11, 11,
                        ref  ww, ref hh, 16, 16);
          
            ///测试8位显示
            Bitmap cutPic88 = new Bitmap(ww, hh, PixelFormat.Format8bppIndexed);
            System.Drawing.Imaging.ColorPalette cp = cutPic88.Palette;
            for (int i = 0; i < 256; i++)
            {
                cp.Entries[i] = Color.FromArgb(255, i, i, i);
            }
            cutPic88.Palette = cp;
            BitmapData _cutPic8 = cutPic88.LockBits(new Rectangle(0, 0, ww, hh), ImageLockMode.ReadWrite,
                                                 cutPic88.PixelFormat);
            IntPtr ptr00 = _cutPic8.Scan0;//得到首地址                   
            //把cutvalues数组给ptr
            System.Runtime.InteropServices.Marshal.Copy(glob_buffer8, 0, ptr00, ww * hh);
            cutPic88.UnlockBits(_cutPic8);
            pictureBox显示gaos.Image = cutPic88;//pictureBox显示gaos
        }
        void ZoomNormal(byte[] image0, ref byte[] image1, int w, int h,
                       ref  int outwidth, ref int outheight, double ZoomX, double ZoomY)
        {
            outwidth = (int)(w * ZoomX + 0.5);
            outheight = (int)(h * ZoomY + 0.5);
         
            int newbuffersize = outwidth * outheight ;
            image1 = new byte[newbuffersize];        

            int x = 0;
            int y = 0;
            int tempY;
            int tempJ;

            for (int j = 0; j < outheight; j++)
            {
                y = (int)(j / ZoomY + 0.5);
                if (y >= h) y--;

                tempY = y * w ;
                tempJ = j * outwidth ;
                for (int i = 0; i < outwidth; i++)
                {
                    x = (int)(i / ZoomX + 0.5);
                    if (x >= w)
                        x--;
                   
                    image1[tempJ + i ] = image0[tempY + x ];
                  
                }
            }
        }

  private void pictureBox显示gaos_Paint(object sender, PaintEventArgs e)
        {
            Graphics g = e.Graphics;//马氏距离r=1.21,70.10*10E-4(概率),位置(1,5),放大16倍后如图
            g.DrawEllipse(new Pen(Color.Red), new Rectangle( 16,  16, 4 * 16 * 2, 4 * 16 * 2));
            //马氏距离r=0.9,96.67*10E-4(概率),位置(2,5),放大16倍后如图
            g.DrawEllipse(new Pen(Color.Red), new Rectangle(16*2, 16*2, 3 * 16 * 2, 3 * 16 * 2));
        }
    }
}

相关文章:

  • 2022-12-23
  • 2021-12-04
  • 2021-12-14
  • 2021-11-15
  • 2021-09-27
  • 2021-05-31
  • 2021-05-22
  • 2021-05-25
猜你喜欢
  • 2021-04-08
  • 2021-07-23
  • 2021-10-18
  • 2021-05-18
  • 2021-07-06
  • 2021-08-30
  • 2021-07-09
相关资源
相似解决方案