资源经验分享OpenCV 中 imread cvtColor cv::IMREAD_GRAYSCALE与CV_BGR2GRAY得到灰度图不一致问题

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

2019-10-14 | |  107 |   0

原标题: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

上一篇:自然语言处理之中文分词技术与算法

下一篇:迭代列表不要For循环,这是Python列表推导式最基本的概念

用户评价
全部评价

热门资源

  • Python 爬虫(二)...

    所谓爬虫就是模拟客户端发送网络请求,获取网络响...

  • TensorFlow从1到2...

    原文第四篇中,我们介绍了官方的入门案例MNIST,功...

  • TensorFlow从1到2...

    “回归”这个词,既是Regression算法的名称,也代表...

  • 机器学习中的熵、...

    熵 (entropy) 这一词最初来源于热力学。1948年,克...

  • TensorFlow2.0(10...

    前面的博客中我们说过,在加载数据和预处理数据时...