计算图像中2点之间的白色像素

时间:2018-07-25 19:33:59

标签: python image-processing

我发现了这条粗白线的起点和终点,分别是[234, 2][134, 397]。现在,我想直接计算位于这两个点之间的白色像素的数量。我的目的是计算不在粗线上的白色像素的数量。我想计算位于1像素宽度线上的白色像素。我是Python的新手。我花了一整天的时间寻找解决方案,但没有找到任何方法。我怎么能找到那个?

enter image description here

我寻找大概起点和终点的努力是:

for y in range(height):
    for x in range(width):
         ....
          ....
    print(p1," , ",p2)

现在我在下一步面临麻烦。即计算这两个点之间的白色像素数。

2 个答案:

答案 0 :(得分:3)

根据the Bresenham line drawing algorithm,确切有

max(abs(p1.x - p2.x), abs(p1.y - p2.y)) - 1
p1p2之间的

个像素(不计算像素p1p2的像素)。

这条线是1像素粗的线。

请注意,像素数与点之间的欧几里得距离不对应,而与L-无穷远距离(也称为最大范数,棋盘距离或Chebyshev distance)相对应。


编辑:更新后的问题完全不同。以上就是上限。

要计算两点之间线的实际白色像素数,您需要绘制该线。上面的Wikipedia链接提供了有关 算法的详细信息。 Here is a very simple implementation in MATLAB,应该易于翻译成Python。尽管您不必实际画线,但可以读取像素值并计算白色的像素值。

@Ben Jones建议使用Bresenham算法的Python实现。不必那么复杂。这是一个简单的Python脚本,可找到两点之间直线上的所有像素(从上面链接的MATLAB版本翻译而来):

p1 = np.array([0,0])
p2 = np.array([7,4]) % Two example points.

p = p1
d = p2-p1
N = np.max(np.abs(d))
s = d/N
print(np.rint(p).astype('int'))
for ii in range(0,N):
   p = p+s;
   print(np.rint(p).astype('int'))

这将产生输出:

[0 0]
[1 1]
[2 1]
[3 2]
[4 2]
[5 3]
[6 3]
[7 4]

现在剩下的就是读取这些坐标处的像素值,并确定它们是否为白色。

答案 1 :(得分:1)

如果您使用的是Bresenham's之类的线算法,并且两个点都位于您所描述的粗白线上,那么这两个点之间的白色像素数实际上将是这样的:

num_white_pixels = max(abs(pt0[0] - pt1[0]), abs(pt0[1] - pt1[1]))

因为,大概整个行都将落在白色区域中,并且构成宽度为1的行的像素数仅为max( dx, dy ),所以要取一个像素还是取一个像素,具体取决于您是否要包含终点。