我有2D强度数据,看起来有点像有火山口的火山。我想拟合一个椭圆到火山的边缘定义(平滑)最大强度在每个角度周围的图像中心。这是一个在python或openCV中存在算法的问题,还是应该由我自己编写?
我在考虑平滑图像,然后沿着一些径向轮廓找到最大值,然后进行最小二乘椭圆拟合,比如:https://github.com/bdhammel/least-squares-ellipse-fitting
但也许其他东西已经存在了?

发布于 2021-07-20 07:12:13
我不太确定你想要的输出是多少。现在,我假设你想知道你的火山的中心和半径。
我的方法是设置一个火山发电机,并在它的参数上摇动,直到它基本上产生你的。然后,因为我知道它是如何生成的,所以我可以告诉您所有关于它的信息。
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())这给了我一个像这样的“火山”

焦点[32.1, 29.6],[32.1, 29.6]和radius 38.527。
https://stackoverflow.com/questions/68437571
复制相似问题