假设是单像素线白色用1(对应RGB(255,0,0))表示,背景用0(对应RBG(0,0,0))表示。

考虑3种类型的边界 水平方向  0->1  1->0   类似垂直方向也是0->1  1->0

如果是单像素,如果水平检测时 发现 0->1 或1->0变动,那么都将 mapX[i,j] 设置成1,注意是白色像素对应的位置

类似的处理也针对垂直方向mapY[i,j]

如果以个mapY[i,j] 与mapX[i,j] 同时标记成了1,那么意味着这个像素是斜方向,那么按sqrt(2)来记录。

 

注意一:以直角三角型为例,构成边的线段粗细大于1个像素,那么求出的结果是翻倍的,因为边界出现了2次。

注意二:以直角三角型为例,如果直角三角型内部是填充成白色的(前景色1),那么求出的结果是一样的,因为边界只出现一次。

 

完整代码如下,需要传入二值图片。

     /// <summary>
        /// 二值图片前景是白背景是黑
        /// 测试白像素的边长
        /// 正负 pi/4   ,3pi/4 计1.414
        /// 其余按1计
        /// </summary>
        /// <param name="bm"></param>
        public static double? SegmentLen(Bitmap bm)
        {

            var map = new byte[bm.Width, bm.Height];
            var mapX = new byte[bm.Width, bm.Height];
            var mapY = new byte[bm.Width, bm.Height];

            for (int i = 0; i < bm.Width; i++)
            {
                for (int j = 0; j < bm.Height; j++)
                {
                    var c = bm.GetPixel(i, j);
                    if (c.R == 255)
                    {
                        map[i, j] = 1;
       
                    }
                    else
                    {
                        map[i, j] = 0;

                    }
                    mapX[i, j] = 0;
                    mapY[i, j] = 0;
                }
            }
            //水平边界检测
            for (int i = 1; i < bm.Width - 1; i++)
            {

                for (int j = 1; j < bm.Height - 1; j++)
                {
                    if (map[i, j] == 1 && map[i, j - 1] == 0) mapX[i, j] = 1;
                    if (map[i, j] == 0 && map[i, j - 1] == 1) mapX[i, j - 1] = 1;

                }
            }
            //垂直边界检测
            for (int i = 1; i < bm.Width - 1; i++)
            {

                for (int j = 1; j < bm.Height - 1; j++)
                {
                    if (map[i, j] == 1 && map[i - 1, j] == 0) mapY[i, j] = 1;
                    if (map[i, j] == 0 && map[i - 1, j] == 1) mapY[i - 1, j] = 1;

                }
            }
            var len = 0.0d;
            for (int i = 0; i < bm.Width; i++)
            {

                for (int j = 0; j < bm.Height; j++)
                {

                    if (mapY[i, j] == 1 && mapX[i, j] == 1)
                    {
                        len +=  1.414;
                    }
                    else if (mapX[i, j] == 1 || mapY[i, j] == 1)
                    {
                        len += 1;
                    }
                }
            }
            return len;

        }
View Code

相关文章:

  • 2022-12-23
  • 2021-12-26
  • 2022-12-23
  • 2021-12-08
  • 2021-06-11
  • 2021-08-29
  • 2021-11-25
  • 2021-12-27
猜你喜欢
  • 2022-12-23
  • 2021-10-27
  • 2021-11-23
  • 2021-11-20
  • 2022-01-04
  • 2022-02-06
  • 2022-01-27
相关资源
相似解决方案