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

news2024/9/24 23:16:04

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

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.coloradmin.cn/o/2126388.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

秋招面经9.11

1. JWT的过程解析 JWT&#xff08;JSON Web Token&#xff09;是一种基于 JSON 的开放标准&#xff08;RFC 7519&#xff09;实现的用于在各方之间传递信息的紧凑且自包含的方式。JWT 是一种 token&#xff0c;可以对信息进行数字签名&#xff08;例如使用 HMAC 算法或 RSA 加…

[leetcode-python]杨辉三角2

给定一个非负索引 rowIndex&#xff0c;返回「杨辉三角」的第 rowIndex 行。 在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。 示例 1: 输入: rowIndex 3 输出: [1,3,3,1]示例 2: 输入: rowIndex 0 输出: [1]示例 3: 输入: rowIndex 1 输出: [1,1]提示…

Mycat2原理介绍

Mycat介绍 Mycat原理 Mycat 核心配置 Scheam.xml 逻辑数据库和节点对应关系配置Server.xml mycat的连接配置Rule.xml. 分片规则 自动分片auto-sharding-long&#xff0c;比如0-10000节点1 &#xff0c;10001-20000节点2枚举分片sahrding-bt-intfile ,比如beijing节点1…

【828华为云征文|如何使用华为云Flexus X实例搭建私人博客:从配置到发布全指南】

文章目录 华为云Flexus X实例介绍搭建专属私人博客准备工作具体操作指南服务器环境确认宝塔软件商店操作一键部署WordPress私人博客域名解析WordPress安装初始页数据库信息配置运行安装程序配置博客信息博客管理后台&#xff08;默认为wp-login.php页面&#xff09;博客前台页面…

c语言位运算符速成

本篇文章对c语言速成系列的补充&#xff0c;其中的内容会涉及原反补以及& 、| 、 ~ 、^、位运算等等。那么&#xff0c;闲话少叙&#xff0c;我们直接进入正题 首先我们先来讲讲原反补 进制转换&#xff08;前置知识&#xff09; 在学原反补之前我们先来学几个机制转换的…

网络高级(学习)2024.9.10

目录 一、Modbus简介 1.起源 2.特点 3.应用场景 二、Modbus TCP协议 1.特点 2.协议格式 3.MBAP报文头 4.功能码 5.寄存器 &#xff08;1&#xff09;线圈寄存器&#xff0c;类比为开关量&#xff0c;每一个bit都对应一个信号的开关状态。 &#xff08;2&#xff09…

C++——STL——栈(stack)

栈的定义 栈 &#xff08; stack &#xff09;是限定仅在表的一端进行插入和删除操作的线性表&#xff0c;允许插入和删除的一端称 为栈顶&#xff0c;另一端称为栈底&#xff0c;不含任何数据元素的栈称为空栈。 栈的示意图 因为栈只能够在一端进行插入和删除&#xff0c;所以…

【Lua学习】Lua入门

上一篇帖子【Lua学习】Lua最最基础的 – 经云的清净小站 (skycreator.top)讲了Lua是什么&#xff0c;Lua如何安装在Linux和Windows上。那么安装好之后&#xff0c;我们就要使用Lua实现我们的各种功能了。 首先&#xff0c;我们要先了解Lua一些最基本的内容&#xff0c;比如怎么…

杀毒软件 | Malware Hunter v1.189.0.816 绿色版

软件简介 Malware Hunter是由Glarysoft开发的一款专业安全防护软件。该软件的主要目的是保护用户的计算机免受恶意软件、病毒和其他网络威胁的侵害。它通过采用高效的云引擎和小红伞引擎&#xff0c;能够快速且全面地扫描电脑中的恶意软件&#xff0c;并进行强力清除&#xff…

5--SpringBoot、Mybatis

目录 Mybatis Mybatis入门操作步骤 1.准备工作 创建springboot工程 创建数据库表和实体类 连接数据库 创建接口XxxMapper 2.数据库连接池 Lombok 使用 Mybatis 准备工作 删除 日志输入 参数占位符 新增 更新 查询 驼峰命名 条件查询 XML 创建XML文件 编…

关于前端知识中框架概念部分的详细介绍

1、为什么要学习流行框架&#xff1f; 企业&#xff1a;为了提高效率&#xff0c;因为时间就是金钱。开发人员&#xff1a;提高了开发效率发展进程&#xff1a; JS>JQuery>模板引擎>框架时代&#xff08;Angular(2)、React、Vue&#xff09;好处&#xff1a;不用直接…

2.安卓逆向-初识java语言

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a;图灵Python学院 上一个内容&#xff1a;1.安卓逆向-说明 关于java语言的介绍就不写了没啥用直接开始 首先java语言写的代码运行说明 …

kolors文生图框架安装

环境安装 根据Kolors【github】的指引&#xff0c;安装命令如下&#xff1a; apt-get install git-lfs git clone https://github.com/Kwai-Kolors/Kolors cd Kolors conda create --name kolors python3.8 conda activate kolors pip install -r requirements.txt python3 s…

Vue3+TS项目封装SVG图标显示组件vite-plugin-svg-icons插件使用

准备好svg文件 假设从iconfont-阿里巴巴矢量图标库下载了一个svg格式的图标&#xff0c;放在我们项目里&#xff0c;并重命名为ic_money.svg&#xff0c;相对路径为&#xff1a;src\assets\images\icons\ic_money.svg 安装vite-plugin-svg-icons插件 npm install vite-plugi…

常用电路及分析

前言 最近在研究一些简单的硬件知识&#xff0c;把在网上看到的一些常见电路分析总结了一下。 有纰漏请指出&#xff0c;转载请说明。 学习交流请发邮件 1280253714qq.com 串联稳压电路 三极管串联线性稳压电路原理详解及Multisim仿真_三极管稳压电路-CSDN博客 线性稳压电…

Java小白一文讲清Java中集合相关的知识点(八)

HashMap底层机制及源码剖析 HashMap底层维护了Node类型的数组table,默认为null 当创建对象时&#xff0c;将加载因子初始化为0.75&#xff1b; 当添加key-value时&#xff0c;通过key的哈希值得到在table的索引&#xff0c;然后判断该索引处是否有元素&#xff0c;如果没有元…

力扣 — — 2555. 两个线段获得的最多奖品

力扣 — — 2555. 两个线段获得的最多奖品 一、题目描述 题目大意&#xff1a;给定一个数组prizePositions&#xff0c;数组中的值表示的是奖品的位置&#xff0c;每一个位置可以有多个奖品&#xff0c;并且设定一个线段的长度 K K K&#xff0c;要求从所有奖品位置中选择两个…

修改Netty 中EventLoopGroup的线程名字前缀

此方案针对 netty 4 , 阅读Netty 源码的过程中涉及到多种线程跳转&#xff0c;2-1 3-1 4-1 类似的命名头晕眼花&#xff0c;直接改了成方便辨认的名字吧&#xff01; 代码如下&#xff1a; public static EventLoopGroup getEventLoopGroup(String name, int nThread) {Defaul…

第十一周:机器学习

第十一周周报 摘要Abstract机器学习1. 注意力机制&#xff08;下&#xff09;1.1 multi-head self-attention&#xff08;多头注意力机制&#xff09;1.2 Positional Encoding&#xff08;位置编码&#xff09;1.3 truncated self attention&#xff08;截断式注意力机制&#…

SVGJS使用

svgjs用于操作 SVG 和动画的轻量级库。 官网 SVG.js v3.2 |家 (svgjs.dev) 1、安装 npm install svgdotjs/svg.js 或者下载直接引用 2、使用 <script src"https://cdn.jsdelivr.net/npm/svgdotjs/svg.js3.0/dist/svg.min.js"></script> import { S…