OpenCV 中 imread cvtColor cv::IMREAD_GRAYSCALE与CV_BGR2GRAY得到灰度图不一致问题

今天调个程序,源代码输入是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);

后话,好多问题我都是从github的issue和stackoverflow.com搜到的,如果百度不爬这两个网站。

药丸つ﹏⊂。

终于可以无忧无虑睡觉了(~﹃~)~zZ

  • 19
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值