首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在2D数据中将圆拟合为最大强度

在2D数据中将圆拟合为最大强度
EN

Stack Overflow用户
提问于 2021-07-19 16:44:56
回答 1查看 73关注 0票数 0

我有2D强度数据,看起来有点像有火山口的火山。我想拟合一个椭圆到火山的边缘定义(平滑)最大强度在每个角度周围的图像中心。这是一个在python或openCV中存在算法的问题,还是应该由我自己编写?

我在考虑平滑图像,然后沿着一些径向轮廓找到最大值,然后进行最小二乘椭圆拟合,比如:https://github.com/bdhammel/least-squares-ellipse-fitting

但也许其他东西已经存在了?

EN

回答 1

Stack Overflow用户

发布于 2021-07-20 07:12:13

我不太确定你想要的输出是多少。现在,我假设你想知道你的火山的中心和半径。

我的方法是设置一个火山发电机,并在它的参数上摇动,直到它基本上产生你的。然后,因为我知道它是如何生成的,所以我可以告诉您所有关于它的信息。

代码语言:javascript
复制
import torch
import torch.nn as nn
import torch.optim

class Net(nn.Module):
    def __init__(self):
        super().__init__()
        self.foci = nn.Parameter(torch.tensor([[30.0,30.0],[30.0,30.0]]))
        self.r = nn.Parameter(torch.tensor((20.0)))
        self.a = nn.Parameter(torch.tensor((-0.1)))
        self.b = nn.Parameter(torch.tensor((0.01)))

    def generate_volcano(self):
        eps = 1e-15
        x,y = torch.meshgrid(torch.arange(60.0), torch.arange(60.0))
        d1 = ((self.foci[0,0] - x)**2+(self.foci[0,1] - y)**2 + eps)**(1/2)
        d2 = ((self.foci[1,0] - x)**2+(self.foci[1,1] - y)**2 + eps)**(1/2)
        return torch.sigmoid(self.a*(d1+d2-self.r)**2+self.b)
代码语言:javascript
复制
n = 10**5
optimizer = optim.Adam(net.parameters())
torch_image = torch.from_numpy(image.astype('float32'))
loss_funcition = nn.MSELoss()

for i in range(n):
    optimizer.zero_grad()
    volcano = net.generate_volcano()
    loss = loss_funcition(volcano, torch_image)
    loss.backward()
    optimizer.step()
    if i % (n//8) == 0:
        print('loss', loss.item())

这给了我一个像这样的“火山”

焦点[32.1, 29.6],[32.1, 29.6]和radius 38.527

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68437571

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档