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

13
问题在于当我需要将它转换为HSV格式时,CV_BGR2HSV和CV_RGB2HSV会给出不同的结果: 因此,我真的需要知道用imread打开图像时颜色的顺序是什么,或者如何强制imread以任意特定的顺序打开图像。
2个回答

17
默认情况下,OpenCV文档中imread的说明指出,对于三通道彩色图像,数据以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 返回一个3通道的彩色图像。(与CV_LOAD_IMAGE_COLOR相同) > > =0 返回一张灰度图像。 (与CV_LOAD_IMAGE_GRAYSCALE相同) > > <0 返回加载的图像本身(带有alpha通道)。 (与CV_LOAD_IMAGE_ANYDEPTH相同)

谢谢您的回答,正如您所说:“在索引px_idx处给定的任何颜色像素都是按顺序的3个元素,其中[px_idx + 0]:红色通道,[px_idx + 1]:绿色通道,[px_idx + 2]:蓝色通道”,因此从0到2,您分别拥有R、G、B。这意味着通道的默认顺序是RGB,而不是BGR? - Max

8
你是否使用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得到相同的矩阵。


谢谢你的回答。我知道使用imshow()显示HSV图像并没有太多意义,目的是为了看看使用CV_BGR2HSV和CV_RGB2HSV转换的HSV之间是否有任何差异。例如,如果它们完全相同,无论是使用imshow还是imwrite保存到文件或其他方式,它们应该被显示为完全一致的。 - Max

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