有三种方式可以将彩色图像转成灰度图
1、直接imread(“1.jpg” , 0);直接读取灰度图像
 2、读取彩色图像然后 灰度 = 0.299 * 红色 + 0.587 * 绿色 + 0.114 * 蓝色进行转换
 3、调用cvtColor函数cvtColor(srcImg, imgShow, COLOR_BGR2GRAY);
通过测试来对比三者的区别:
调用cvtColor(srcImg, imgShow, COLOR_BGR2GRAY); // 图像格式转换和直接读取灰度的方式读取,通过保存像素值,能看出来二者差距挺大
 
 通过调用cvtColor(srcImg, imgShow, COLOR_BGR2GRAY); // 图像格式转换
 和用灰度 = 0.299 * 红色 + 0.587 * 绿色 + 0.114 * 蓝色公式进行转换,发现相差很小,基本都是一个像素
 
 通过输出发现:
 1、读取彩色图像然后 灰度 = 0.299 * 红色 + 0.587 * 绿色 + 0.114 * 蓝色进行转换 和 调用cvtColor函数cvtColor(srcImg, imgShow, COLOR_BGR2GRAY);几乎一样;
 2、直接按照灰度方式读取,余上面二者差距较大
附代码
void writeFile(QString filename ,  QString p_str)
{
    QFile file(filename);
    if (file.open(QIODevice::Append | QIODevice::Text)) {
        // 创建一个 QTextStream 对象,并将文件与之关联
        QTextStream stream(&file);
        // 写入文本数据
        stream << p_str << endl;
        // 关闭文件
        file.close();
    } else {
        qDebug() << "Failed to open file!";
    }
}
void MainWindow::on_pushButton_clicked()
{
    Mat srcImg = imread("D:\\1.jpg");
    if(srcImg.empty())
    {
        QMessageBox::information(this,"警告","图片读取失败,请检查图片路径!");
        return;
    }
    Mat imgShow ;
    cvtColor(srcImg, imgShow, COLOR_BGR2GRAY); // 图像格式转换
    // QImage qImg = QImage((unsigned char*)(imgShow.data), imgShow.cols,
    //                      imgShow.rows, imgShow.cols*imgShow.channels(), QImage::Format_RGB888);
    // ui->label->setPixmap(QPixmap::fromImage(qImg.scaled(ui->label->size(), Qt::KeepAspectRatio)));
    qDebug()<<"通道"<<imgShow.channels()<<endl;
    for(int i=0;i<imgShow.rows;++i)
    {
        uchar*ptr = imgShow.ptr<uchar>(i);
        QString mm = "";
        for(int j =0;j<imgShow.cols;++j)
        {
            //qDebug()<<static_cast<int>(ptr[j*3+0])<< static_cast<int>(ptr[j*3+1])<<static_cast<int>(ptr[j*3+2])<<endl;
            int t1 = static_cast<int>(ptr[j]);
          QString s1 =   QString::number(t1);
          mm+=s1+",";
        }
        writeFile("D:\\1.txt" , mm);
    }
    cv::namedWindow("Display window", cv::WINDOW_AUTOSIZE);
    cv::imshow("Display window", imgShow);
    cv::waitKey(0);
}
void MainWindow::on_pushButton_3_clicked()
{
    Mat imgShow = imread("D:\\1.jpg" , 0);
    if (imgShow.empty()) {
        std::cout << "Could not open or find the image" << std::endl;
        return ;
    }
    qDebug()<<imgShow.channels()<<endl;
    qDebug()<<"通道"<<imgShow.channels()<<endl;
    for(int i=0;i<imgShow.rows;++i)
    {
        uchar*ptr = imgShow.ptr<uchar>(i);
        QString mm = "";
        for(int j =0;j<imgShow.cols;++j)
        {
            int t1 = static_cast<int>(ptr[j]);
            QString s1 =   QString::number(t1);
            mm+=s1+",";
        }
         writeFile("D:\\2.txt" , mm);
    }
    cv::namedWindow("Display window1", cv::WINDOW_AUTOSIZE);
    cv::imshow("Display window1", imgShow);
    cv::waitKey(0);
}
void MainWindow::on_pushButton_4_clicked()
{
    Mat imgShow = imread("D:\\1.jpg" , 1);
    if (imgShow.empty()) {
        std::cout << "Could not open or find the image" << std::endl;
        return ;
    }
    qDebug()<<imgShow.channels()<<endl;
    qDebug()<<"通道"<<imgShow.channels()<<endl;
    Mat imgarr[3];
    split(imgShow ,imgarr );
    for(int i=0;i<imgShow.rows;++i)
    {
        uchar*ptr = imgShow.ptr<uchar>(i);
        QString mm = "";
        for(int j =0;j<imgShow.cols;++j)
        {
           // qDebug()<<static_cast<int>(ptr[j*3+0])<< static_cast<int>(ptr[j*3+1])<<static_cast<int>(ptr[j*3+2])<<endl;
            int t1 = static_cast<int>(ptr[j*3+0]);
            int t2 = static_cast<int>(ptr[j*3+1]);
            int t3 = static_cast<int>(ptr[j*3+2]);
            int dst = 0.299 * t3 + 0.587 * t2 + 0.114 * t1;
            QString s1 =   QString::number(dst);
            mm+=s1+",";
        }
         writeFile("D:\\3.txt" , mm);
    }
    cv::namedWindow("Display window1", cv::WINDOW_AUTOSIZE);
    cv::imshow("Display window1", imgShow);
    cv::waitKey(0);
}

![[leetcode-python]杨辉三角2](https://img-blog.csdnimg.cn/img_convert/917105a0d64c755ef489377d7100a40f.gif)

















