使用没有第二个参数的imread打开图像时,什么是颜色模式? BGR还是RGB?

时间:2013-05-07 02:03:50

标签: c++ opencv

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

enter image description here

2 个答案:

答案 0 :(得分:13)

imread 的OpenCV文档声明,默认情况下,对于3通道彩色图像,数据以BGR顺序存储,例如,在Mat中,数据存储为1D unsigned char指针,这样索引px_idx的任何给定颜色像素按顺序为3个元素,[px_idx + 0]:蓝色通道,[px_idx + 1]:绿色频道,[px_idx + 2]:红色频道

  

注意在彩色图像的情况下,解码图像将以B G R顺序存储通道。

您通过传递给imread的flag参数对颜色类型进行了一些(有限的)控制,尽管您无法指定通道排序(您应该假设所有彩色图像都是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相同)

答案 1 :(得分:5)

您是否使用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相同的矩阵中。