我想在二值图像中加入一条平滑的线条。

该图像是利用对比度、轮廓、骨架、近邻、轮廓分离等对原始图像进行预处理的结果。

我想,一旦我得到一个由白点组成的数组(x,y),拟合一条曲线就会非常容易。但是当我试图在这个图像中拟合一条曲线时,由于某个x上的多个值,就会出现一条锯齿形线,我需要一个广义的解来解决我的问题。我的形象可能会有所不同(我正在制作一个应用程序)。它可以有特定x的4-5值,反之亦然。
方法我试过:

建议我如何在这样的图像中拟合光滑的曲线。
发布于 2019-07-01 03:41:57
通过使用以下步骤和代码可以解决这一问题:
问题解决了
连接所有最近邻居的代码:
def distance(P1, P2):
return ((P1[0] - P2[0])**2 + (P1[1] - P2[1])**2) ** 0.5
def optimized_path(coords, start=None):
if start is None:
start = coords[0]
pass_by = coords
path_connected = [start]
pass_by.remove(start)
while pass_by:
nearest = min(pass_by, key=lambda x: distance(path_connected[-1], x))
path_connected.append(nearest)
pass_by.remove(nearest)
return path_connected
start = None
points=[[i,j] for i,j in zip(x_data,y_data)]
points = optimized_path(points,start)平滑最近邻点的代码:
# Smoothing
distance_smooth = np.cumsum( np.sqrt(np.sum( np.diff(points, axis=0)**2, axis=1 )) )
distance_smooth = np.insert(distance_smooth, 0, 0)/distance_smooth[-1]
splines = [UnivariateSpline(distance_smooth, coords, k=5, s=None) for coords in points.T]
alpha = np.linspace(0, 1, 75)
points_fitted = np.vstack( spl(alpha) for spl in splines ).T这是最后的图像-平滑图像
发布于 2019-06-03 16:52:25
我理解这个问题,意思是你想通过数据找到曲线,作为x和y坐标的列表。
选择一个点开始,例如,在图的边或边有一个高密度的点。
找到中间到一边或另一边,排除传单,并找到平均值。挪过去,再做一次。
对于有两条线的区域,可以将中值中所考虑的点的范围限制在当前或以前点的某个范围内。
中位数将避免对远距离点的权重过大,并且倾向于在x(或y,如果您愿意的话)点的数据中心强烈地拉力。
这个平均值通常与你可能正在研究的物理理论或模型有着更强的联系。
您可以对不同的数据点集群重复此操作,以找到所有的行。
最后,对所有的曲线进行比较,修剪重复的曲线,例如,通过平方差之和来检测。
https://stackoverflow.com/questions/56423604
复制相似问题