当前位置: 首页 > article >正文

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

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

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


http://www.kler.cn/a/300153.html

相关文章:

  • web端ActiveMq测试工具
  • MyBatis最佳实践:提升数据库交互效率的秘密武器
  • 【数据结构】二分查找
  • WebSocket实现私聊私信功能
  • 变频器硬件接线
  • 总结 uniapp 上不适配iphone的:new Date 时间、border线条、渐变
  • 使用API有效率地管理Dynadot域名,查看某一订单当前的状态
  • 需要恢复 Android 手机的存储卡?6 个Android 数据恢复应用程序(可用于手机内存 + MicroSD 卡)
  • 【银河麒麟高级服务器操作系统】虚拟机服务器执行systemctl提示timeout——分析全过程及处理建议
  • [数据集][目标检测]人脸口罩佩戴目标检测数据集VOC+YOLO格式8068张3类别
  • 基于MinerU的PDF解析API
  • 面试必问的7大测试分类!一文说清楚!
  • [算法]单调栈解法
  • 一文说清什么是数据仓库
  • Linux之ebpf(3)uprobe与ebpf
  • Flex弹性布局常用的属性解析与分类
  • 解决 git 不是内部或外部命令,也不是可运行的程序
  • 828华为云征文|几分钟,即可在华为云Flexus X服务器部署安全稳定的——水果生鲜商城配送小程序
  • 在职研生活学习--20240906
  • 旅游景区生活污水处理设备处理工艺和用途
  • HarmonyOS开发5.0【骨架屏】 app界面制作
  • 测试微信发朋友圈:功能、界面/易用性、中断、网络、兼容性、安全性、性能测试
  • 性能测试经典案例解析——政务查询系统
  • k8s的应用
  • 基于Ant-Design-Vue设计的配置化表单
  • curl和ping