c#图像处理-利用霍夫检测得到未知圆坐标半径

 public Bitmap circle(Bitmap img)
        {
            int[, ,] A = new int[img.Width, img.Height, 100];
            for (int x = 0; x < img.Width; x++)
            {
                for (int y = 0; y < img.Height; y++)
                {
                    Color c = img.GetPixel(x, y);//获取每个象素点的值,
                    byte cc = c.R;//获取一种颜色的值
                    if (cc == 255)//判断是不是边界上的象素点,是的话,进行霍夫变化
                    {
                        for (int a = 0; a < img.Width; a++)
                        {
                            for (int b = 0; b < img.Height; b++)
                            {
                                int r = (int)Math.Abs(Math.Sqrt((x - a) * (x - a) + (y - b) * (y - b)));
                                if (r <100)//由圆的公式计算出半径r
                                { A[a, b, r] = A[a, b, r] + 1; }//对应的累加器						 
                            }
                        }
                    }
                }
            }

            int max = 0;
            int xx = 0;
            int yy = 0;
            int rr = 0;
            for (int a = 0; a < img.Width; a++)
            {
                for (int b = 0; b < img.Height; b++)
                {
                    for (int r = 0; r < 100; r++)
                        if (A[a, b, r] > max)//判断是不是累加器的最大值
                        {
                            max = A[a, b, r];//最大值赋给max
                            xx = a;
                            yy = b;
                            rr = r;
                        }
                }

            }
            //标记圆的圆心
            img.SetPixel(xx, yy, Color.Yellow);
            img.SetPixel(xx, yy+1, Color.Yellow);
            img.SetPixel(xx, yy + 2, Color.Yellow);
            img.SetPixel(xx, yy-1, Color.Yellow);
            img.SetPixel(xx, yy - 2, Color.Yellow);
            img.SetPixel(xx+1, yy, Color.Yellow);
            img.SetPixel(xx + 2, yy, Color.Yellow);
            img.SetPixel(xx - 1, yy, Color.Yellow);
            img.SetPixel(xx - 2, yy, Color.Yellow);
           // jiakuang
            for (int i = xx-rr; i <= xx+rr; i++)
            {
                img.SetPixel(i, yy - rr, Color.Yellow);
            }
            for (int i = xx - rr; i <= xx + rr; i++)
            {
                img.SetPixel(i, yy + rr, Color.Yellow);
            }

            for (int i = yy - rr; i <= yy + rr; i++)
            {
                img.SetPixel(xx-rr, i, Color.Yellow);
            }
            for (int i = yy - rr; i <= yy + rr; i++)
            {
                img.SetPixel(xx + rr, i, Color.Yellow);
            }
            label1.Text = xx.ToString();
            label2.Text = yy.ToString();
            label3.Text = rr.ToString();
            Bitmap n = img;
            return n;
            
        }


处理前:

处理后:

得到数据:(坐标x,坐标y,半径R)

你可能感兴趣的:(c#图像处理)