gpt4 book ai didi

javascript - 计算圆度

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:13:07 25 4
gpt4 key购买 nike

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

我在提取所有这些区域时没有遇到任何问题 - 我只是遇到了圆检测的问题。


到目前为止,我已经能够提取一个形状的所有轮廓坐标(就像在这种情况下的圆形) -->红线显示等高线坐标(大概100点左右):

Image

现在我想计算此坐标与正圆匹配的准确度的百分比值。

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

注意:代码是用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

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

圆度

Roundness

圆度

Circularity

或者在代码中,类似...

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

其中值为 1.0 表示完美的圆,高于或低于 1 的值表示偏离圆形的物体(面积和周长留给您计算)。

另一个定义是圆度的 ISO 定义 - 定义为内切圆和外切圆之间的比率。即适合形状内外的最大和最小圆 - 您可以使用这样的方法很容易地确定圆度。

如果您搜索“计算单道圆度”或“计算 圆度”我相信您会找到大量的实现和指南。

正如 wiki 链接中所指出的,还有很多其他的圆度误差定义方法,例如最小二乘圆、最小区域圆等 - 这可能更适用于您的情况。

例如:

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

关于javascript - 计算圆度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49804646/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com