【问题标题】:Formula For Calculating Length Of Line In BMP Image using c#使用c#计算BMP图像中线条长度的公式
【发布时间】:2017-03-23 19:27:55
【问题描述】:

我想计算此 BMP Image 中某些行的长度。

我不知道如何计算这些类型的线的公式?或者在图像处理中还有其他计算长度的公式。

通过搜索,我知道如果直线垂直或水平长 1 个像素,我们必须将其长度 +1。如果长度沿对角线增加怎么办? 如果有人能提供一个数学公式那就太好了。 谢谢。

【问题讨论】:

  • 这可能不是最佳的,但只需检查第一个像素周围的每个像素上是否有相同颜色的像素(如果您正在使用这种线条)。
  • 目前!我只有黑线,我也逐个像素地追踪了线。但我不知道计算长度的公式。

标签: c# math image-processing graph


【解决方案1】:

方向为对角线1像素时的长度为1.4142135623730950488016887242097。

这个因素背后的数学是纯向量数学,让我解释一下。根据向量数学,我们可以将二维向量的长度计算为Math.Sqrt(Vector.X * Vector.X + Vector.Y * Vector.Y))。如果我们以原点(0,0)和目标(1,1)为起点,我们知道原点和目标之间的距离向量为(1,1)。所以,如果我们计算这个向量的长度,我们会得到:sqrt(1 * 1 + 1 * 1) 减少的是 sqrt(2) 并产生 1.4142135623730950488016887242097 的结果。

您可以使用矢量数学来计算一堆像素,而不是添加这个因子来获得更好的精度,要做到这一点只需应用前面的数学:

distanceVector = targetVector - originVector
distance = sqrt(distanceVector.X * distanceVector.X + distanceVector.Y * distanceVector.Y)

如果您使用 System.Numeric 包,那么您可以使用集成函数:

Vector2 origin = new Vector2(originPixelX, originPixelY);
Vector2 target = new Vector2(targetPixelX, targetPixelY);

Vector2 distanceVector = target - origin;
float length = distanceVector.Length();

编辑:

为了简化您的问题,有一个非常简单的解决方案可以为您提供最佳精度。

如果您将两个变量中的直线像素和对角像素的总和相加,让我们将这些直线像素和对角像素命名为您可以这样做:

var length = straightPixels + (new Vector2(diagonalPixels, diagonalPixels)).Length();

如果您不想使用 System.Numeric,您可以这样做:

var length = straightPixels + Math.Sqrt(diagonalPixels * diagonalPixels + diagonalPixels * diagonalPixels);

非常简单有效。

【讨论】:

  • 感谢您的信息,所以它只是为对角像素添加 sqrt(2),你能确保我一件事,例如我有这种情况。 1 像素在 (0,0) 第二在 (1,1) 第三在 (2,2) 和第四在 (3,3) 所以我的长度公式会是?长度 = sqrt(2) + sqrt(2) + sqrt(2);
  • 不要只添加sqrt(2),它的精度会很差,请改用向量数学。
  • 让我添加一个方法,它可以为您提供最佳精度,并且使用 System.Numeric 包非常容易。
  • 只有数学公式会受到赞赏,我会尝试自己将其转换为代码。 @古斯曼
【解决方案2】:

如果您只想要上下 1 个像素的对角线长度,那么它是 very simple。 所以它将是二的平方。

【讨论】:

  • 如果我有一条带像素的对角线,那么我将不得不添加 sqrt(2) 像素次?这将是正确的长度?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-27
相关资源
最近更新 更多