问题是当我需要将其转换为HSV时,CV_BGR2HSV和CV_RGB2HSV会给我不同的结果:
所以我真的需要知道imread
打开时颜色的顺序是什么,或者如何强制imread
以任何特定的顺序打开图像。
答案 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相同的矩阵中。