原标题:OpenCV 中 imread cvtColor cv::IMREAD_GRAYSCALE与CV_BGR2GRAY得到灰度图不一致问题
原文来自:CSDN 原文链接:https://blog.csdn.net/Zhaoxi_Li/article/details/102529160
今天调个程序,源代码输入是PGM格式的灰度图,方便起见,我直接用matlab批量转的文件。然而,在程序中使用imread(filename, IMREAD_GRAYSCALE)时,惊奇发现,同一种图片的两种输入,却得到了不同的结果,尽管结果类似。我惊了!!彩色转灰度这玩意还有不一样的事,这个事坑了我好几天,今天终于明白了,现在我把问题及解决方案整理如下。
问题引出
一张jpg彩色图片file.jpg,一张由matlab - imread - rgb2gray得到相应的灰度pgm图file.pgm。则由如下代码得到的灰度图imgG1和imgG2,值不完全一致。
cv::Mat imgG1 = cv::imread("file.pgm", 0);
cv::Mat imgG2 = cv::imread("file.jpg", 0);
问题分析
从一开始,我以为是我程序问题,找了好久无头绪,换了另一种计算灰度的代码(如下),惊奇发现,得到的灰度与pgm对应数据一致。
cv::Mat imgC2 = cv::imread("file.jpg");
cv::Mat imgG2;
cv::cvtColor(imgC2, imgG2, CV_BGR2GRAY);
这让我不禁陷入了人生与科研的大思考,我从6点搜百度搜到第二天1点,没有得到任何有用信息。只能去GG搜下,结果发现有人跟我遇到了一样的问题,只不过他是计算直方图。但是似乎这些相关连接没给出明确的方法。
最后,找到一个网址,上面说了这个问题的原因Grayscale conversion algorithm of OpenCV’s imread(),我翻译如下。
在opencv3.0中,
cv::IMREAD_COLOR
解析jpg时候,由cv::JpegDecoder
解码得到一个RGB图像,然后由icvCvt_RGB2BGR_8u_C3R()
函数交换R和B空间,得到BGR格式的彩色图。
cv::IMREAD_GRAYSCALE
这个图像由cv::JpegDecoder
解码得到一个灰度图,所有的颜色转换和其他预处理或后处理等相关细节都是由libjpeg处理的,最后,将解压缩的数据复制到给定cv::Mat
的内部缓冲区中。因此,在cv::IMREAD_GRAYSCALE
中没有调用opencv中的函数cv::cvtColor
来进行颜色转换。
解决方案
为了保证与matlab生成数据保持一致,我们按照如下代码来获得灰度图。切记,以后不要再指定imread的第二个参数为0来获得灰度图了。
cv::Mat imgC2 = cv::imread("file.jpg");
cv::Mat imgG2;
cv::cvtColor(imgC2, imgG2, CV_BGR2GRAY);
免责声明:本文来自互联网新闻客户端自媒体,不代表本网的观点和立场。
合作及投稿邮箱:E-mail:editor@tusaishared.com