【问题标题】:Counting white pixels between 2 points in an image计算图像中两点之间的白色像素
【发布时间】:2018-07-25 19:33:58
【问题描述】:

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

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

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

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

【问题讨论】:

  • 您需要确定要栅格化两点之间的线的line drawing algorithm。一旦确定了这一点,这应该相当简单。
  • 既然你说你是python新手,我建议你看看Python Imaging Library (PIL)来帮助处理图像。
  • @BenJones 对不起,我编辑了我的问题,请给我解决我在您的答案中发布的“评论”的解决方案。

标签: python image-processing


【解决方案1】:

根据the Bresenham line drawing algorithm,正好有

max(abs(p1.x - p2.x), abs(p1.y - p2.y)) - 1

p1p2 之间的像素(不包括 p1p2 的像素)。

这条线是 1 像素粗的线。

注意像素的数量不是对应点之间的欧几里得距离,而是对应L-infinity距离,也叫max-norm,棋盘距离或者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]

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

【讨论】:

  • 我正在尝试与您建议的相同的事情。但是很抱歉,我没有提早提到给定的线是粗虚线白线。我想要解决这个问题。很抱歉没有提早提到这一点。你能给我建议这个图像的解决方案吗?非常感谢!
  • @KnowledgeSeeker:这是一个完全不同的问题......我已经编辑了我的答案,以概述如何做到这一点。请尝试实现它,如果您遇到困难,请考虑在您的代码中发布一个新问题。
  • FWIW,这是一个 Python 实现(通过 google 搜索“Bresenham algorithm python”找到)rosettacode.org/wiki/Bitmap/Bresenham%27s_line_algorithm#Python
  • @Ben:感谢您的链接。如果忘记尝试仅使用整数,我认为画一条线会简单得多。查看答案的更新。
  • 哦,是的,这是有道理的——浮点算法要简单得多。
【解决方案2】:

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

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

因为,想必整条线都会落在白色区域,而组成一条宽度为1的线的像素数正好是max( dx, dy ),给还是取一个像素,就看你要不要包括结尾点。

【讨论】:

  • 本·琼斯,我正在尝试与您建议的相同的事情。但是很抱歉,我没有提早提到给定的线是粗虚线白线。我想要解决这个问题。很抱歉没有提早提到这一点。你能给我建议这个图像的解决方案吗?非常感谢!
  • 这是一个非常不同的问题陈述!解决方案涉及更多。我建议您使用 PIL 加载像素阵列,正如我在 cmets 中所建议的那样。然后实现 Bresenham 的算法,除了计数白色像素而不是绘制它们。
猜你喜欢
  • 2012-03-24
  • 1970-01-01
  • 2023-03-26
  • 2021-05-26
  • 2020-07-25
  • 2015-02-13
  • 2012-01-15
  • 2017-12-05
  • 2021-04-17
相关资源
最近更新 更多