使用openCV检测颜色空间

50

我该如何使用openCV来查看图像的颜色空间?

在使用cvCvtColor()函数转换之前,我想确认它是否为RGB。

谢谢


我看到你正在从手机中提取图像。它们是什么格式?现在似乎不再是实际的 IplImage 结构 -- 你是如何将图像导入 OpenCV 的? - ezod
我甚至在想,我从网络摄像头中获取的图像是以RGB还是BGR格式保存的?(你有没有碰巧找到解决方案?) - Vaibhav Bajpai
5个回答

34

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


谢谢,所以这些图片是由使用Google Android的智能手机拍摄的。我想它们是RGB图像,对吗?RGB是最常见的颜色空间,对吗?谢谢。 - aneuryzm
2
再次强调,没有实际显示图像是无法确定的,但我认为RGB是一个相当安全的假设 - 当人们谈论三通道颜色空间时,大多数人都会想到它。如果是其他颜色空间,我会感到非常惊讶。 - rcv

7

txandi提出了一个有趣的观点。OpenCV默认使用BGR颜色空间。这类似于RGB颜色空间,只是图像中的B和R通道在物理上被交换了。如果物理通道顺序对您很重要,您需要使用此函数转换图像:cvCvtColor(defaultBGR, imageRGB, CV_BGR2RGB)。


4
正如rcv所说,通过检查三个颜色通道无法以编程方式检测颜色空间,除非您具有图像内容的先验知识(例如,图像中有一个已知颜色的标记)。如果您将接受来自未知来源的图像,则必须允许用户指定其图像的颜色空间。一个很好的默认值是假定RGB。
如果在显示之前修改任何像素颜色,并且使用的是非OpenCV查看器,则应该在运行所有颜色过滤器后使用cvCvtColor(src,dst,CV_BGR2RGB)。如果您正在使用OpenCV查看器或将图像保存到文件中,则应确保它们处于BGR颜色空间。

3

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


2
链接现在已经失效。在OpenCV4中不再提供此功能。https://github.com/opencv/opencv/issues/14344 - user4466350

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接