13

问题是当我需要将其转换为 HSV 时,CV_BGR2HSV 和 CV_RGB2HSV 会给我不同的结果:所以我真的需要知道打开时的颜色顺序是什么,imread或者如何强制imread以任何特定的顺序打开图像。

在此处输入图像描述

4

2 回答 2

17

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 相同)

于 2013-05-07T05:09:21.463 回答
6

您是否使用 显示图像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 相同的矩阵。

于 2013-05-07T07:14:29.697 回答