我正在从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)
所以如果你改变绿色和蓝色,这将导致巨大的计算错误.
电贺