为什么像素可以有浮点值?

Why pixels can have float values?

这可能是一个简单的问题,但我想知道为什么像素值可以有浮点值?我正在跟踪一个目标并使用 contours() 和 moments() 方法获取质量中心,如果我想要的话,我可以获得它们的浮点值。

但为什么这可能呢?图片不能有 0.1234 像素

一个 Mat 可以保存 float 值,以及许多其他类型。具有 float` 值的图像示例如下:

  • 对于 uchar,BGR 图像通常在 0, 255 范围内,但对于 float,则在 [0,1] 范围内。这只是一个约定。
  • 您的图像是产生 float 结果的某些操作的结果。这不一定是 ready-to-display 图像,但在这种情况下只是一个规则矩阵,包含一些值。不要忘记图像只是一个矩阵,其值代表像素值。

您还可以有 float 坐标。这是sub-pixel精度的情况。斑点的质心可能具有 float 坐标。例如(5.1, 6.8)。您可以使用整数坐标来绘制这一点,但会失去一点精度,例如(5, 7),但您可能需要 float 值进行进一步计算。

我相信(如果我没有正确理解您的话)您已经发现了 interpolation 的世界。图像本身是一个连续的平面,x 坐标在 [0, width] 范围内,y 坐标在 [0, height] 范围内。为了在监视器中显示图像或将其存储在磁盘中,图像以像素为单位进行离散化。

如果您对图像应用卷积、加法或阈值等离散操作,通常会将其视为值网格。但是,特别是在您跟踪图像中的对象的情况下,您应该将其视为连续的 space。一个物体的质心,可能不会是一个离散值,它会是上述范围内的某个浮点坐标(即 p = (50.5, 10.1)),但这应该不是问题。

如果需要,您还可以使用 bilinear(或更复杂的)插值来访问 p = (50.5, 10.1) 像素的颜色(或 gray-scale 值)。