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

2024-06-11 01:21:30 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

但也许还有别的东西已经存在了

2D intensity volcano


Tags: 数据https图像算法定义中心opencv边缘
1条回答
网友
1楼 · 发布于 2024-06-11 01:21:30

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

我的方法是建立一个火山发生器,并在它的参数上摆动,直到它基本上生成你的。既然我知道它是如何产生的,我就可以告诉你所有的事情

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

具有焦点{}和半径{}

相关问题 更多 >