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

Python 计算图像中两点之间的白色像素,python,image-processing,Python,Image Processing,我找到了这条粗白线的起点和终点,它们是[234,2]和[134397]。现在我想计算直线上位于这两个点之间的白色像素数。我的目的是计算不在粗线上的白色像素数。我想计算1像素宽线上的白色像素。我对Python非常陌生。我花了一整天的时间寻找解决办法,但没有找到任何办法。我怎么能找到呢 我试图找到大致的起点和终点: for y in range(height): for x in range(width): .... .... print(p1

我找到了这条粗白线的起点和终点,它们是
[234,2]
[134397]
。现在我想计算直线上位于这两个点之间的白色像素数。我的目的是计算不在粗线上的白色像素数。我想计算1像素宽线上的白色像素。我对Python非常陌生。我花了一整天的时间寻找解决办法,但没有找到任何办法。我怎么能找到呢

我试图找到大致的起点和终点:

for y in range(height):
    for x in range(width):
         ....
          ....
    print(p1," , ",p2)
现在,下一步我将面临麻烦。i、 e.计算这两个点之间的白色像素数。

根据

max(abs(p1.x - p2.x), abs(p1.y - p2.y)) - 1
p1
p2
之间的像素(不计算像素
p1
p2

这条线是一条1像素厚的线

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


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

要计算两点之间直线上的实际白色像素数,需要绘制该直线。上面的维基百科链接提供了绘制线条的算法的详细信息,应该很容易翻译成Python。虽然不是实际绘制线,而是读取像素值,然后计算白色的像素值

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

这将产生以下输出:

[0 0]
[1 1]
[2 1]
[3 2]
[4 2]
[5 3]
[6 3]
[7 4]
现在剩下的就是读取这些坐标处的像素值,并确定它们是否为白色。

根据

max(abs(p1.x - p2.x), abs(p1.y - p2.y)) - 1
p1
p2
之间的像素(不计算像素
p1
p2

这条线是一条1像素厚的线

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


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

要计算两点之间直线上的实际白色像素数,需要绘制该直线。上面的维基百科链接提供了绘制线条的算法的详细信息,应该很容易翻译成Python。虽然不是实际绘制线,而是读取像素值,然后计算白色的像素值

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

这将产生以下输出:

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

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

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

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

因为,假设整条线将落在白色区域中,而组成宽度为1的线的像素数仅为
max(dx,dy)
,根据是否要包括端点,给定或获取一个像素。

如果使用类似的线算法,正如你所描述的,这两个点都在粗白线上,那么这两个点之间的白色像素的数量实际上是这样的:

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

因为,假设整条线将落在白色区域中,而组成宽度为1的线的像素数仅为
max(dx,dy)
,根据是否要包括端点,给定或获取一个像素。

您需要决定要在两点之间栅格化线的像素。一旦你确定了这一点,这应该是相当简单的。既然你说你是python新手,我建议你研究一下以帮助图像处理。@BenJones对不起,我编辑了我的问题,请给我“评论”的解决方案这是我在你的答案上发布的。你需要决定你想要栅格化两点之间的线。一旦你确定了这一点,这应该是相当简单的。既然你说你是python新手,我建议你研究一下以帮助图像处理。@BenJones,对不起,我编辑了我的问题,请给我在你的答案上贴出的“评论”的解决方案。我正在尝试你建议的同样的事情。但很抱歉,我并没有提前提到给定的线是粗点白线。我想要这个问题的解决办法。抱歉没有提前提及此事。你能为我推荐这个图像的解决方案吗?多谢各位@知识寻求者:这是一个完全不同的问题。。。我已经编辑了我的答案,给出了如何做的概要。请尝试实现它,如果你遇到困难,考虑用你的代码发布一个新的问题。FWIW,这是一个Python实现(用谷歌搜索找到Bresenham算法Python)@本:谢谢链接。我认为如果一个人忘记了只使用整数,那么画一条线就简单多了。请看答案的更新。哦,是的,这很有意义-浮点算法要简单得多。我尝试了与你建议的相同的方法。但很抱歉,我并没有提前提到给定的线是粗点白线。我想要这个问题的解决办法。抱歉没有提前提及此事。你能为我推荐这个图像的解决方案吗?多谢各位@知识寻求者:这是一个完整的dif