如何通过白色像素找到两个连接点之间的距离?

时间:2019-06-15 11:44:47

标签: matlab image-processing bresenham

我想找到一条曲线的两个端点。

我使用凸包找到8个边界点,然后针对每个点计算与所有其他点的距离。距离最大的点被假定为端点。它适用于形状简单的大多数情况,如下所示:

Correct Prediction

我正在使用此代码找到两点:

% Calculate 8-boundary points using Convex Hull
% (points consists of all white pixels for the curve)
out=convhull(points);
extremes=points(out,:);

% Finding two farthest points among above boundary points
arr_size = size(extremes);
max_distance = 0;
endpoints = [extremes(1,:); extremes(2,:)];
for i=1:arr_size(1)
    p1 = extremes(i,:);
    for j=i+1:arr_size(1)
        p2 = extremes(j,:);
        dist = sqrt((p2(1)-p1(1))^2 + (p2(2)-p1(2))^2);
        if dist>max_distance
            max_distance = dist;
            endpoints = [p1; p2];
        end
    end
end

disp(endpoints);

在大多数情况下都可以使用,但是问题在于将其应用于U型形状时。

Incorrect Prediction

我想找出两点之间的白色像素数。我跟着这个 Counting white pixels between 2 points in an image,但在仅直线而非曲线的情况下会有所帮助。任何帮助表示赞赏!

编辑1:

我已经根据@Rotem的答案更新了代码,并解决了我的问题。

Fixed Error Prediction

更新代码:

for i=1:arr_size(1)
    p1 = extremes(i,:);
    distanceMap = calculate_distance_map(arr, p1);
    for j=i+1:arr_size(1)
        p2 = extremes(j,:);
        dist = distanceMap(p2(2), p2(1));
        if dist>max_distance
            max_distance = dist;
            endpoints = [p1; p2];
        end
    end
end

但是,这需要花费大量时间。关于减少计算时间有什么建议吗?

1 个答案:

答案 0 :(得分:1)

我发现了受dynamic programming算法启发的解决方案。

注释中包含解释:

Scheduler

距离图的插图(10000替换为零):

P(距第一个蓝点的距离):
P

Q(距第二个蓝点的距离):
Q

max(P,Q):
max(T,Q)

T:
T