微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在二维数据中将圆拟合到最大强度

如何解决在二维数据中将圆拟合到最大强度

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

我想平滑图像,然后沿多个径向轮廓找到最大值,然后进行最小二乘椭圆拟合,例如:https://github.com/bdhammel/least-squares-ellipse-fitting

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

2D intensity volcano

解决方法

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

我的方法是设置一个火山生成器并调整它的参数,直到它基本上生成您的参数。既然我知道它是如何产生的,我就可以告诉你所有的事情。

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)
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())

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

enter image description here

焦点 [32.1,29.6],[32.1,29.6] 和半径 38.527

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。