【问题标题】:detect color space with openCV用openCV检测色彩空间
【发布时间】:2018-07-19 03:25:29
【问题描述】:

如何使用 openCV 查看图像的色彩空间?

我想确定它是 RGB,然后再使用 cvCvtColor() 函数转换为另一个

谢谢

【问题讨论】:

  • 我在下面看到您正在从手机中提取图像。它们是什么格式的?听起来好像您在拉动实际的 IplImage 结构 - 您如何将图像导入 OpenCV?
  • 即使我想知道我从网络摄像头拍摄的图像是保存为 RGB 还是 BGR? (您是否碰巧找到了解决方案?)

标签: colors opencv space


【解决方案1】:

不幸的是,OpenCV 没有提供任何关于 IplImage 结构中颜色空间的指示,所以如果你盲目地从某个地方拾取 IplImage,就无法知道它是如何编码的。此外,没有算法可以明确地告诉您图像是否应该被解释为 HSV 与 RGB - 这对机器来说只是一堆字节(this 应该是 HSV 还是 RGB?)。我建议您将 IplImages 包装在另一个结构(甚至是带有模板的 C++ 类!)中,以帮助您跟踪这些信息。如果您真的很绝望并且只处理某种类型的图像(户外场景、办公室、面孔等),您可以尝试计算图像的一些统计信息(例如,为自然 RGB 图像构建直方图统计信息,以及为自然 HSV 图像),然后尝试通过比较您的图像更接近哪个颜色空间来对您完全未知的图像进行分类。

【讨论】:

  • 谢谢,所以这些照片是使用谷歌安卓的智能手机拍摄的。我以为它们是RGB图像,对吗? RGB 是最常见的色彩空间吧?谢谢
  • 再一次,如果不实际显示图像,真的无法判断,但我认为 RGB 是一个非常安全的假设 - 这是大多数人在谈论三通道色彩空间时的想法。如果是别的,我会很惊讶。
【解决方案2】:

txandi 提出了一个有趣的观点。 OpenCV 有一个默认使用的 BGR 颜色空间。这类似于 RGB 颜色空间,不同之处在于 B 和 R 通道在图像中进行了物理切换。如果物理通道顺序对您很重要,则需要使用以下函数转换图像:cvCvtColor(defaultBGR, imageRGB, CV_BGR2RGB)。

【讨论】:

    【解决方案3】:

    正如rcv 所说,没有通过检查三个颜色通道以编程方式检测颜色空间的方法,除非您先验了解图像内容(例如,有一个标记在已知颜色的图像中)。如果您将接受来自未知来源的图像,则必须允许用户指定其图像的色彩空间。一个好的默认设置是假设 RGB。

    如果您在显示之前修改任何像素颜色,并且您使用的是非 OpenCV 查看器,则您可能应该在运行完所有颜色过滤器后使用cvCvtColor(src,dst,CV_BGR2RGB)。如果您将 OpenCV 用于查看器或将图像保存到文件中,则应确保它们位于 BGR 色彩空间中。

    【讨论】:

      【解决方案4】:

      IplImage struct 有一个名为 colorModel 的字段,由 4 个字符组成。不幸的是,OpenCV 忽略了这个字段。但是您可以使用此字段来跟踪不同的颜色模型。

      【讨论】:

      【解决方案5】:

      我基本上是拆分通道并显示每个通道以找出我正在使用的图像的色彩空间。这可能不是最好的方法,但它对我有用。

      详细解释可以参考以下链接。

      https://dryrungarage.wordpress.com/2018/03/11/image-processing-basics/

      【讨论】: