我在二进制图像中有一些损坏的线段,我需要修复它们(使它们笔直且原始厚度)。为了做到这一点,我必须找到段的中间点,所以当我检查邻域以找到线条的粗细时,我将能够找到像素停在1和变为0.
答案 0 :(得分:2)
假设您的损坏线段是直的,您可以在MATLAB中使用regionprops来查找每个边界框的中心。因为如果一个段是直的,它总是边界框的对角线,因此盒子的中心也是半圆的中心。
答案 1 :(得分:1)
让我们调用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的四个距离,选择最小值,这将是最佳中间点。
答案 2 :(得分:1)
假设
A = [xa ya];
B = [xb yb];
然后
C = round( mean([A;B]) );
Matlab的round
将数字舍入到它们最接近的整数,因此这可以最小化从分析中心(mean([A;B])
)到最近像素的(城市街区)距离。
如果要保持子像素精度(实际上大多数计算都是可取的,直到需要从结果到像素索引的显式映射),只需删除round
并仅使用mean
部分。