Python 在不知道第二个坐标的情况下获取直线上的点/像素

Python 在不知道第二个坐标的情况下获取直线上的点/像素,python,numpy,image-processing,pixel,angle,Python,Numpy,Image Processing,Pixel,Angle,我正在尝试构建一个函数,该函数从一个特定的坐标扩展到一个给定的角度,并在这条线上的像素中循环,直到遇到一个黑色像素 例如,如果角度为180度,则这很容易实现。在这种情况下,搜索只会向下扩展,在每次迭代中向列坐标添加1。但是,角度(例如10度)更为复杂。因此,我需要从数学上计算像素位置X处的下一个像素 在一个类似的问题中,y轴上的值没有如预期的那样改变,这对我没有帮助: import numpy as np angle = 90*np.pi/180 x = np.arange(0, 10) y

我正在尝试构建一个函数,该函数从一个特定的坐标扩展到一个给定的角度,并在这条线上的像素中循环,直到遇到一个黑色像素

例如,如果角度为180度,则这很容易实现。在这种情况下,搜索只会向下扩展,在每次迭代中向列坐标添加1。但是,角度(例如10度)更为复杂。因此,我需要从数学上计算像素位置X处的下一个像素

在一个类似的问题中,y轴上的值没有如预期的那样改变,这对我没有帮助:

import numpy as np
angle = 90*np.pi/180

x = np.arange(0, 10)
y = np.round(np.sin(angle)*x).astype(int)
print([(x, y) for x, y in zip(x, y)])
印刷品:
[(0,0)、(1,1)、(2,2)、(3,3)、(4,4)、(5,5)、(6,6)、(7,7)、(8,8)、(9,9)]

这是错误的,因为我不希望y轴改变,给定90度角

需要第二个“端点”坐标,我没有

最后,我发现,不幸的是,这没有一个有效的答案。问题中的代码似乎不返回偏移量,而是浮动,我不确定其含义。当我对浮动进行舍入时,偏移是错误的:

import numpy

def pol2cart(rotdist, cwangle):
    x = rotdist * numpy.cos(cwangle)
    y = rotdist * numpy.sin(cwangle)
    return round(x), round(y)

print(pol2cart(1, 180))
打印:
(-1.0,-1.0)
,而预期输出为
(1.0,0.0)

然而,上述答案也会在每次迭代时给出一致的偏移量。这将导致只有三个不同的角度(水平、垂直和45度)。这不是所需要的,因为我最终会得到另一个角度,然后我将其放入函数中

编辑:输入示例

下图是图像数据的一个示例。红点表示可能的起始位置。该点有一个方向,但未指明。如果红点笔直向下,则其方向为180度

嵌套字典包含每个像素的坐标(行、列)和颜色值:
{1:{1:0,2:0,3:0,4:0,5:0,6:0,7:255,8:255,


第一个建议的答案可以通过首先检查您的线是更水平还是更垂直,并使用该维度作为迭代维度(在您的示例中为x)来确定


关于第二个建议的答案:你当然可以计算任意远的端点,并将这些算法应用于你提到的具有已知起点和终点的直线。然后,你可以迭代通过该点返回的点来检查黑色像素,如果没有找到,甚至重新启动算法,直到你点击任意点结束点。

我认为你可以使用维基百科上描述的布雷森汉姆的“直线算法”


我知道你说你只有起点,没有终点,但你知道角度(方向)你知道矩形中最长的直线是对角线,所以如果你想象一条比对角线长的直线,从你的起点开始,朝着正确的方向走,你可以在矩形边缘之外生成和结束点,并将其用于Bresenham算法的另一端。

你的示例i是什么nput看起来像?图像中的直线是数字化的。我有一个输入的1位位图图片。嵌套字典包含相应像素的行、列和值的键。例如:[3][4]=255请举一个例子如果你知道起始位置和角度,你可以很容易地计算出另一端!图像中的直线不能长于对角线,因此从起始位置开始画一条对角线+10的直线,另一端将在图像之外。然后你可以使用Bresenham向另一端移动d、 展示一些例子。线宽,终止条件,不同的角度。有很多方法可以做到这一点,所以你的问题仍然没有很好的定义。