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

Yuk*_*awa 10 c++ opencv

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

在此输入图像描述

alr*_*kai 15

用于imread状态的OpenCV文档默认情况下,对于3通道彩色图像,数据以BGR顺序存储,例如在Mat中,数据存储为1D无符号字符指针,使得索引处的任何给定颜色像素px_idx为3个元素按顺序,用[px_idx + 0]:蓝色通道,[px_idx + 1]绿色通道,[px_idx + 2]红色通道

注意在彩色图像的情况下,解码图像将以BGR顺序存储通道.

您可以通过传递给它的flag参数对颜色类型进行一些(有限的)控制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相同)


Jon*_*rin 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);
Run Code Online (Sandbox Code Playgroud)

然后,您的示例证明将BGR图像转换为HSV 将不会产生与将RGB图像转换为HSV相同的矩阵.