问题是当我需要将其转换为 HSV 时,CV_BGR2HSV 和 CV_RGB2HSV 会给我不同的结果:所以我真的需要知道打开时的颜色顺序是什么,imread
或者如何强制imread
以任何特定的顺序打开图像。
2 回答
imread的 OpenCV 文档指出,默认情况下,对于 3 通道彩色图像,数据以 BGR 顺序存储,例如在您的 Mat 中,数据存储为 1D 无符号字符指针,因此索引处的任何给定颜色像素px_idx
都是 3 个元素依次为[px_idx + 0]
:蓝色通道,[px_idx + 1]
:绿色通道,[px_idx + 2]
:红色通道
注意在彩色图像的情况下,解码图像的通道将按 BGR 顺序存储。
您可以通过传递给的标志参数对颜色类型进行一些(有限)控制imread
,尽管您不能指定通道顺序(您应该假设所有彩色图像都是 BGR)
CV_LOAD_IMAGE_ANYDEPTH - 如果设置,则在输入具有相应深度时返回 16 位/32 位图像,否则将其转换为 8 位。
CV_LOAD_IMAGE_COLOR - 如果设置,总是将图像转换为颜色一
CV_LOAD_IMAGE_GRAYSCALE - 如果设置,总是将图像转换为灰度图像
或者更简单地说,
>0 Return a 3-channel color image.
(与 CV_LOAD_IMAGE_COLOR 相同)
=0 Return a grayscale image.
(与 CV_LOAD_IMAGE_GRAYSCALE 相同)
<0 Return the loaded image as is (with alpha channel).
(与 CV_LOAD_IMAGE_ANYDEPTH 相同)
您是否使用 显示图像imshow()
?
imshow()
实际上不知道颜色空间并将图像打印为 BGR,即使您将它们转换为另一种格式。这就是为什么你会得到奇怪的结果。
为了说服自己,请尝试将图像从 RGB 转换为 BGR 并使用 打印imshow()
,然后通过将 BGR 转换为 RGB 来执行相同操作:
cv::cvtColor(src, dst, CV_RGB2BGR);
imshow("RGB2BGR", dst);
cv::cvtColor(src, dst, CV_BGR2RGB);
imshow("BGR2RGB", dst);
然后,您的示例证明将 BGR 图像转换为 HSV不会产生与将 RGB 图像转换为 HSV 相同的矩阵。