使用imread从OpenCV图像转换为RGB到灰度,结果不佳

tis*_*sch 16 opencv

我正在从PNG文件中将24位RGB图像加载到我的OpenCV应用程序中.

然而,直接使用灰度图像加载图像imread会产生非常差的结果.

Mat src1 = imread(inputImageFilename1.c_str(), 0);
Run Code Online (Sandbox Code Playgroud)

将RGB图像加载为RGB并将其转换为灰度可以获得更好的效果.

Mat src1 = imread(inputImageFilename1.c_str(), 1);
cvtColor(src1, src1Gray, CV_RGB2GRAY);
Run Code Online (Sandbox Code Playgroud)

我想知道我imread是否正确使用我的图像类型.有谁经历过类似的行为?

使用转换为灰度的图像imread如下所示: 结果不好

使用转换为灰度的图像cvtColor如下所示: 好结果

Sta*_*rog 19

我今天遇到了同样的问题.最后,我比较了三种方法:

//method 1
cv::Mat gs = cv::imread(filename, CV_LOAD_IMAGE_GRAYSCALE);

//method 2
cv::Mat color = cv::imread(filename, 1); //loads color if it is available
cv::Mat gs_rgb(color.size(), CV_8UC1);
cv::cvtColor(color, gs_rgb, CV_RGB2GRAY);

//method 3
cv::Mat gs_bgr(color.size(), CV_8UC1);
cv::cvtColor(color, gs_bgr, CV_BGR2GRAY);
Run Code Online (Sandbox Code Playgroud)

方法1(加载灰度)和3(CV_BGR2GRAY)产生相同的结果,而方法2产生不同的结果.为了我自己的目的,我已经开始使用CV_BGR2GRAY.

我的输入文件是jpgs,因此可能存在与您的特定图像格式相关的问题.


小智 10

简单的答案是,openCV函数使用BGR格式.如果你用imread或读取图像VideoCapture,它将永远是BGR.如果使用RGB2GRAY,则将蓝色通道与绿色互换.获得亮度的公式是

y = 0.587*green + 0.299*red + 0.114*blue
Run Code Online (Sandbox Code Playgroud)

所以如果你改变绿色和蓝色,这将导致巨大的计算错误.

电贺