繁体   English   中英

如何在二进制图像中找到线段的x,y的中间点?

[英]How can I find the middle points of x, y of a line segment in a binary image?

我在二进制图像中有一些损坏的线段,我需要修复它们(使它们笔直且原始厚度)。 为了做到这一点,我必须找到段的中间点 ,所以当我检查邻域以找到线的粗细时,我将能够找到像素停止为1并变为0的位置。

假设您的损坏线段是直的,您可以在MATLAB中使用regionprops来查找每个边界框的中心。 因为如果一个段是直的,它总是边界框的对角线,因此盒子的中心也是半圆的中心。

让我们调用点A和B来减少歧义,A(Xa,Ya)和B(Xb,Yb)

设C为中间点。

C(Xc, Yc)
Xc = (Xa + Xb) / 2
Yc = (Ya + Yb) / 2

我们有四个有趣的数字,两个用于X坐标,两个用于Y坐标。

Xmin = floor(Xc)
Xmax = ceil(Xc)
Ymin = floor(Yc)
Ymax = ceil(Yc)

中点的X坐标是Xmin或Xmax,中点的Y坐标是Ymin或Ymax。

因此我们有四个潜在点: (Xmin, Ymin), (Xmin, Ymax), (Xmax, Ymin), (Xmax, Ymax)

所以,最后,我们必须决定哪个点离C最近。

从P(Xp,Yp)到C(Xc,Yc)的距离是:

sqrt(sqr(Xp - Xc) + sqr(Yp - Yc))

计算从四个点到C的四个距离,选择最小值,这将是最好的中间点。

假设

A = [xa ya];
B = [xb yb];

然后

C = round( mean([A;B]) );

Matlab将数字round到它们最接近的整数,因此最小化了从分析中心( mean([A;B]) )到最近像素的(城市块)距离。

如果你想保持子像素精度(这对于大多数计算来说实际上是可取的,直到需要从结果到像素索引的显式映射),只需放弃该round并仅使用mean部分。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM