javascript-计算圆度

我目前正在开发一种简单的形状检测算法,该算法希望将图像中提取的形状区分为不同的类型,例如三角形,正方形,圆形等.

提取所有这些区域都没有问题-圆形检测只是问题.

到目前为止,我能够提取形状的所有轮廓坐标(例如在这种情况下为圆形)->红线显示轮廓坐标(可能约为100点):

javascript-计算圆度

现在,我想计算百分比值,此坐标与一个完美的圆匹配的精确度.

这是我计算“准确度百分比值”的第一个想法(请参阅评论).

注意:代码是用javaScript编写的.

let areaCoordinates = [[142, 267], [141, 268], [136, 268], [135, 269], [133, 269], [132, 270], [131, 270], [129, 272], [128, 272], [126, 274], [125, 274], [125, 275], [120, 280], [120, 281], [119, 282], [119, 284], [117, 286], [117, 289], [116, 290], [116, 300], [117, 301], [117, 304], [118, 305], [118, 307], [119, 308], [119, 309], [122, 312], [122, 313], [124, 315], [124, 316], [125, 316], [128, 319], [129, 319], [130, 320], [131, 320], [132, 321], [133, 321], [134, 322], [135, 322], [136, 323], [139, 323], [140, 324], [148, 324], [149, 323], [154, 323], [155, 322], [157, 322], [158, 321], [159, 321], [162, 318], [163, 318], [168, 313], [168, 312], [171, 309], [171, 307], [172, 306], [172, 304], [173, 303], [173, 302], [174, 301], [174, 292], [173, 291], [173, 287], [172, 286], [172, 285], [170, 283], [170, 282], [169, 281], [169, 279], [164, 274], [163, 274], [160, 271], [159, 271], [158, 270], [157, 270], [156, 269], [155, 269], [154, 268], [150, 268], [149, 267]]


function calculateCircleAccuracy(areaCoordinates) {
   var percentageValue = 0;
   
   // calculate areas center
   var centerX = 0, centerY = 0;
   for (var i=0; i<areaCoordinates.length; i++) {
      centerX+=areaCoordinates[i][0];
      centerY+=areaCoordinates[i][1];
   }
   centerX/=areaCoordinates.length;
   centerY/=areaCoordinates.length;
   
   // calculate radius for every contour point
   var centerDistances = [];   
   for (var i=0; i<areaCoordinates.length; i++) {
      let dx = centerX - areaCoordinates[i][0],
          dy = centerY - areaCoordinates[i][1];
      let centerDistance = Math.sqrt( dx*dx + dy*dy );
      centerDistances.push(centerDistance)
   }
   
   // calculate percentage value using [centerDistances]?!
   // got no idea how to go on!   
   
   return percentageValue;
}


console.log("Area is to " + calculateCircleAccuracy(areaCoordinates) + "% a perfect circle!");

到目前为止,这段代码是我所掌握的全部信息,我真的不知道如何继续计算百分比值.

任何帮助将不胜感激,感谢TEMPI.

这是上图中圆的一些测试坐标:

[142, 267], [141, 268], [136, 268], [135, 269], [133, 269], [132, 270], [131, 270], [129, 272], [128, 272], [126, 274], [125, 274], [125, 275], [120, 280], [120, 281], [119, 282], [119, 284], [117, 286], [117, 289], [116, 290], [116, 300], [117, 301], [117, 304], [118, 305], [118, 307], [119, 308], [119, 309], [122, 312], [122, 313], [124, 315], [124, 316], [125, 316], [128, 319], [129, 319], [130, 320], [131, 320], [132, 321], [133, 321], [134, 322], [135, 322], [136, 323], [139, 323], [140, 324], [148, 324], [149, 323], [154, 323], [155, 322], [157, 322], [158, 321], [159, 321], [162, 318], [163, 318], [168, 313], [168, 312], [171, 309], [171, 307], [172, 306], [172, 304], [173, 303], [173, 302], [174, 301], [174, 292], [173, 291], [173, 287], [172, 286], [172, 285], [170, 283], [170, 282], [169, 281], [169, 279], [164, 274], [163, 274], [160, 271], [159, 271], [158, 270], [157, 270], [156, 269], [155, 269], [154, 268], [150, 268], [149, 267]

注意:我真的很希望获得一些示例代码片段,这将非常有帮助.

解决方法:

您可以使用“单迹线”或“多迹线”方法来实现此目的.

这里给出了单迹方法的公式

Roundness (object) – Calculation in two dimensions

您也可以将这些公式用于圆度和圆度,这两个公式都将值确定为给定形状的周长和面积的函数.

圆度

javascript-计算圆度

javascript-计算圆度

或在代码中,类似…

function circularity(x) {
   4 * Math.PI * area(x) / Math.sqrt(perimeter(x))
}

值1.0表示一个完美的圆,而值大于或小于1则表示偏离圆的对象(面积和周长计算留给您使用).

另一个定义是ISO圆度定义-定义为内切圆与外切圆之间的比率.即适合形状内部和外部的最大和最小圆形-您可以使用这种方法轻松确定圆度.

如果您搜索“计算单个轨迹的圆度”或“计算
 圆度”,我相信您会找到大量的实现和指南.

如Wiki链接中所述,还有很多其他方法可用于定义圆度错误,例如最小正方形圆,最小区域圆等-在您的情况下可能更适用.

例如:

https://github.com/Meakk/circle-fit

上一篇:如何确定点是否在2D凸多边形内?


下一篇:javascript – 如何为二维几何实现约束求解器?