0

我有一个图像和两个点,
我想读取这两个点之间的像素,
并将它们重新采样到一个小的 1x40 数组中。
我正在使用 EMGU,它是 OpenCV 的 C# 包装器。
谢谢,
西南

示例图像

4

3 回答 3

4

您正在寻找的是Bresenham's line algorithm。它将允许您获得像素阵列中最接近直线的点。Wikipedia 链接还包含帮助您入门的伪代码。

于 2011-02-12T13:35:08.140 回答
3

Emgu CV 在Image类中包含用于沿称为Sample.

有关定义,请参阅手册这是版本 2.3.0 中的链接Image.Sample

您仍然需要重新采样/插值从返回的数组中的点,Sample最终得到一个 40 元素数组。由于有多种方法可以重新采样,因此我建议您查看其他问题。

于 2011-10-31T22:32:05.323 回答
2

旋转和裁剪

我首先尝试这样做:

  • GetRotationMatrix2D用 ( )计算旋转矩阵
  • 扭曲图像,使这条线是水平的 ( WarpAffine)
  • 计算你的两个点的新位置(你可以使用Transform
  • 获取合适宽度和 1 px 高的图像矩形 ( GetRectSubPix)

到处插值可能会影响结果,但无论如何你都必须插值。您可以考虑在旋转之前裁剪图像。

遍历线的 8 个连接像素

否则,您可以使用线迭代器来迭代两点之间的像素。请参阅文档InitLineIterator(抱歉,该链接指向 OpenCV 的 Python 版本,我从未听说过 EMGU)。我想在这种情况下,您会遍历未抗锯齿的线条的像素。但这应该快得多。

手动插值

最后,您可以将图像转换为数组,计算线条通过哪些元素,并手动进行二次采样和插值。

于 2011-02-09T17:08:54.793 回答