【发布时间】:2012-10-08 22:19:07
【问题描述】:
我在二进制图像中有一些损坏的线段,我需要修复它们(使它们笔直并保持原来的粗度)。为了做到这一点,我必须找到线段的中间点,所以当我检查邻域以找到线条的粗细时,我将能够找到像素停止为 1 的位置并且变成0。
【问题讨论】:
标签: algorithm matlab image-processing line-segment
我在二进制图像中有一些损坏的线段,我需要修复它们(使它们笔直并保持原来的粗度)。为了做到这一点,我必须找到线段的中间点,所以当我检查邻域以找到线条的粗细时,我将能够找到像素停止为 1 的位置并且变成0。
【问题讨论】:
标签: algorithm matlab image-processing line-segment
假设您损坏的线段是直的,您可以使用 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 部分。
【讨论】: