代码之家  ›  专栏  ›  技术社区  ›  Knowledge Seeker

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

  •  -1
  • Knowledge Seeker  · 技术社区  · 6 年前

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

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

    范围(高度)内Y的
    
    对于范围(宽度)中的x:
    …
    …
    打印(p1,“,”,p2)
    < /代码> 
    
    

    现在我要面对下一步的麻烦。也就是说,计算这两个点之间的白色像素数。

    enter image description here

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

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

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

    2 回复  |  直到 6 年前
        1
  •  3
  •   Cris Luengo    6 年前

    根据 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 .


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

    要计算两点之间直线上的实际白色像素数,需要绘制该直线。上面的维基百科链接提供了有关 这个 绘制线条的算法。 Here is a very simple implementation in MATLAB ,应该易于转换为python。虽然不是真正画线,但您将读取像素值,并计算白色的像素值。

    @本·琼斯建议用python实现bresenham的算法。不必那么复杂。下面是一个简单的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]
    

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

        2
  •  1
  •   Ben Jones Tim Goetz    6 年前

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

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

    因为,假设整行都在白色区域,组成一行宽度为1的像素的数目 max( dx, dy ) ,给定或获取一个像素,取决于是否要包括端点。