我发现了这条粗白线的起点和终点,分别是[234, 2]
和[134, 397]
。现在,我想直接计算位于这两个点之间的白色像素的数量。我的目的是计算不在粗线上的白色像素的数量。我想计算位于1像素宽度线上的白色像素。我是Python的新手。我花了一整天的时间寻找解决方案,但没有找到任何方法。我怎么能找到那个?
我寻找大概起点和终点的努力是:
for y in range(height):
for x in range(width):
....
....
print(p1," , ",p2)
现在我在下一步面临麻烦。即计算这两个点之间的白色像素数。
答案 0 :(得分:3)
根据the Bresenham line drawing algorithm,确切有
max(abs(p1.x - p2.x), abs(p1.y - p2.y)) - 1
点p1
和p2
之间的个像素(不计算像素p1
或p2
的像素)。
这条线是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 )
,所以要取一个像素还是取一个像素,具体取决于您是否要包含终点。