三种方式可以将彩色图像转成灰度图对比

有三种方式可以将彩色图像转成灰度图

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);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值