利用QT画图像的直方图

1.什么是直方图

直方图是一种图形化展示数据频率分布的方式。它将样本数据分成一系列相邻的区间,统计每个区间内数据所占比例或数量,并用矩形条形图表现出来。直方图可以反映样本数据的分布情况,例如它们的集中趋势、对称性和离散程度等。

直方图在数据分析和处理过程中有广泛的应用,例如:

  1. 可以用于检查数据是否符合正态分布,从而判断使用什么类型的统计方法。

  2. 可以用于比较多组数据的分布情况,从而寻找它们的异同点。

  3. 可以用于数字图像处理中,对图像像素的亮度、对比度等特征进行定量描述。

  4. 可以用于形态学图像处理中,比如分割和重建等。

总的来说,直方图的作用是通过直观的图形展示方式,帮助分析者快速理解和评估数据的统计特征,从而更准确和全面地进行数据分析和处理。

2.qt编写灰度图像直方图

   // 统计灰度级别的像素数量 + 绘制直方图QVector<int> histogram(256, 0); // 存储每个灰度级别的像素数量for (int i = 0; i < image.width(); i++){for (int j = 0; j < image.height(); j++){QColor color(image.pixel(i, j));int gray = qGray(color.rgb()); // 获取灰度级别if((gray >= 30) &&( gray <= 225)){histogram[gray]++;}}}QImage histogramImage(256, 256, QImage::Format_RGB32); // 创建直方图图像histogramImage.fill(Qt::black); // 设置背景颜色QPainter painter(&histogramImage);painter.setPen(Qt::white);int maxCount = *std::max_element(histogram.begin(), histogram.end()); // 获取像素数量最大值for (int i = 0; i < 256; i++){int count = histogram[i];int x = i;int y = histogramImage.height() - (static_cast<double>(count) / maxCount) * histogramImage.height();painter.drawLine(x, histogramImage.height(), x, y);}QPixmap pixmap_hisinput;pixmap_hisinput = pixmap_hisinput.fromImage(histogramImage);ui->lb_histir->setPixmap(pixmap_hisinput.scaled(ui->lb_histir->size(), Qt::KeepAspectRatio, Qt::FastTransformation));

 

3.qt绘制rgb图像直方图

   QVector<int> redHistogram(256, 0); // 存储红色通道灰度级别的像素数量QVector<int> greenHistogram(256, 0); // 存储绿色通道灰度级别的像素数量QVector<int> blueHistogram(256, 0); // 存储蓝色通道灰度级别的像素数量for (int i = 0; i < image.width(); i++){for (int j = 0; j < image.height(); j++){QColor color(image.pixel(i, j));int red = color.red(); // 获取红色通道的灰度级别int green = color.green(); // 获取绿色通道的灰度级别int blue = color.blue(); // 获取蓝色通道的灰度级别//if ((red >= 30) && (red <= 225) && (green >= 30) && (green <= 225) && (blue >= 30) && (blue <= 225)){redHistogram[red]++;greenHistogram[green]++;blueHistogram[blue]++;}}}// 绘制红色通道直方图QImage redHistogramImage(256, 256, QImage::Format_RGB32); // 创建红色通道直方图图像redHistogramImage.fill(Qt::black); // 设置背景颜色QPainter redHistogramPainter(&redHistogramImage);redHistogramPainter.setPen(Qt::red);int maxRedCount = *std::max_element(redHistogram.begin(), redHistogram.end());for (int i = 0; i < 256; i++){int count = redHistogram[i];int x = i;int y = redHistogramImage.height() - (static_cast<double>(count) / maxRedCount) * redHistogramImage.height();redHistogramPainter.drawLine(x, redHistogramImage.height(), x, y);}// 绘制绿色通道直方图QImage greenHistogramImage(256, 256, QImage::Format_RGB32); // 创建绿色通道直方图图像greenHistogramImage.fill(Qt::black); // 设置背景颜色QPainter greenHistogramPainter(&greenHistogramImage);greenHistogramPainter.setPen(Qt::green);int maxGreenCount = *std::max_element(greenHistogram.begin(), greenHistogram.end());for (int i = 0; i < 256; i++){int count = greenHistogram[i];int x = i;int y = greenHistogramImage.height() - (static_cast<double>(count) / maxGreenCount) * greenHistogramImage.height();greenHistogramPainter.drawLine(x, greenHistogramImage.height(), x, y);}// 绘制蓝色通道直方图QImage blueHistogramImage(256, 256, QImage::Format_RGB32); // 创建蓝色通道直方图图像blueHistogramImage.fill(Qt::black); // 设置背景颜色QPainter blueHistogramPainter(&blueHistogramImage);blueHistogramPainter.setPen(Qt::blue);int maxBlueCount = *std::max_element(blueHistogram.begin(), blueHistogram.end());for (int i = 0; i < 256; i++){int count = blueHistogram[i];int x = i;int y = blueHistogramImage.height() - (static_cast<double>(count) / maxBlueCount) * blueHistogramImage.height();blueHistogramPainter.drawLine(x, blueHistogramImage.height(), x, y);}// 将直方图图像显示到三个控件中QPixmap redPixmap;redPixmap = redPixmap.fromImage(redHistogramImage);ui->lb_histrgb_red->setPixmap(redPixmap.scaled(ui->lb_histrgb_red->size(), Qt::KeepAspectRatio, Qt::FastTransformation));QPixmap greenPixmap;greenPixmap = greenPixmap.fromImage(greenHistogramImage);ui->lb_histrgb_green->setPixmap(greenPixmap.scaled(ui->lb_histrgb_green->size(), Qt::KeepAspectRatio, Qt::FastTransformation));QPixmap bluePixmap;bluePixmap = bluePixmap.fromImage(blueHistogramImage);ui->lb_histrgb_blue->setPixmap(bluePixmap.scaled(ui->lb_histrgb_blue->size(), Qt::KeepAspectRatio, Qt::FastTransformation));

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/134924.shtml

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

相关文章

Java2 - 数据结构

5 数据类型 5.1 整数类型 在Java中&#xff0c;数据类型用于定义变量或表达式可以存储的数据的类型。Java的数据类型可分为两大类&#xff1a;基本数据类型和引用数据类型。 byte&#xff0c;字节 【1字节】表示范围&#xff1a;-128 ~ 127 即&#xff1a;-2^7 ~ 2^7 -1 sho…

基于Kinect 动捕XR直播解决方案 - 硬件篇

Kinect-V2 硬件设备 一、Kinect介绍 1、Kinect for Windows 的开发配置 Kinect V2 操作系统&#xff1a;Windows 10&#xff08;必须&#xff09; Windows Surface Windows Surface 2 开发环境&#xff1a;Visual Studio 2017 .NET Framework 4.5 (.NET Framework 4.5) 硬…

VEX —— Quaternion|Euler Angle

目录 一&#xff0c;四元数相关概念 四元数 欧拉角 常用四元数相关函数 相互转换 二&#xff0c;案例 案例&#xff1a;沿面中心翻转 案例&#xff1a;路径导弹 案例&#xff1a;RBD刚体还原过渡 一&#xff0c;四元数相关概念 四元数 在vex内四元数为&#xff08;&am…

【C/PTA】数组练习(编程)

本文结合PTA专项练习带领读者掌握数组&#xff0c;刷题为主注释为辅&#xff0c;在代码中理解思路&#xff0c;其它不做过多叙述。 文章目录 7-1 计算最大值出现的次数7-2 求一批整数中出现最多的个位数字7-3 装箱问题7-4 数组-值钱的微信号7-5 数组-吹泡泡7-6 数组-数学鬼才 7…

代码随想录Day42-图论:力扣第417m、841m、463e题

417m. 太平洋大西洋水流问题 题目链接 代码随想录文章讲解链接 方法一&#xff1a; 用时&#xff1a;1h0m58s 思路 直接找哪些点既可以到达太平洋又可以到达大西洋比较麻烦&#xff0c;换个角度&#xff0c;找到太平洋可以逆流而上到达的点&#xff0c;再找到大西洋可以逆…

BigDecimal 类型的累加操作

BigDecimal 累加操作 .add操作

C语言:深入浅出qsort方法,编写自己的qsort完成冒泡排序

目录 什么是qsort&#xff1f; 函数原型 比较函数 compar 排序整型数组 排序结构体数组 根据成员字符排序 strcmp函数 根据成员整型排序 自定义qsort实现冒泡排序 qsort的实现原理 具体步骤 快速排序示例代码&#xff1a; 什么是qsort&#xff1f; qsort是 C …

geoserver发布同一字段的多值渲染

Geoserver之同一字段的多值渲染 有时候我们需要对一个shp的某一字段值中的不同值进行区分展示&#xff0c;但是一般的渲染都是按照统一图层展示的&#xff0c;因此为了更好的效果&#xff0c;我们选择使用uDig等工具处理。 文章目录 Geoserver之同一字段的多值渲染前言一共是分…

休眠和睡眠有哪些区别?如何让电脑一键休眠?

电脑中有休眠和睡眠&#xff0c;那么它们有什么区别呢&#xff1f;下面我们就通过本文来了解一下。 休眠和睡眠的区别 电脑在睡眠状态时&#xff0c;会切断内存之外的设备电源&#xff0c;电脑会进入睡眠状态&#xff0c;当再次唤醒电脑后&#xff0c;不会影响睡眠前保存好的工…

机器学习练习1

线性回归 数据集模型,第一列代表人口,第二列代表利润 此处的线性回归 与 常规的 y wx b 不同的是 将b换成了w的一部分 故需要在数据集x前面加个1, 求出b . 可以简化计算,只需要一个乘法就可以

网络安全入门必学内容

网络安全入门 必/学/内/容/ 随着时代的发展&#xff0c;经济、社会、生产、生活越来越依赖网络。而随着万物互联的物联网技术的兴起&#xff0c;线上线下已经打通&#xff0c;虚拟世界和现实世界的边界正变得模糊。这使得来自网络空间的攻击能够穿透虚拟世界的边界&#xff0…

vscode中 vue3+ts 项目的提示失效,volar插件失效问题解决方案

文章目录 前情提要bug回顾解决方案最后 前情提要 说起来很耻辱&#xff0c;从mac环境换到window环境&#xff0c;vscode的配置都是云端更新过来的&#xff0c;应该是一切正常才对&#xff0c;奇怪的是我的项目环境出现问题了&#xff0c;关于组件的ts和追踪都没有效果&#xff…

pandas教程:Introduction to pandas Data Structures pandas的数据结构

文章目录 Chapter 5 Getting Started with pandas5.1 Introduction to pandas Data Structures1 Series2 DataFrame3 Index Objects (索引对象) Chapter 5 Getting Started with pandas 这样导入pandas&#xff1a; import pandas as pde:\python3.7\lib\site-packages\numpy…

vscode设置pycharm中的项目路径和debug方法

真大佬在这 真大佬在这 必须给大佬star 命令行运行&#xff1a; export PYTHONPATH:pwd:/home/bennie/bennie/bennie_project/AI_Lab python main.py 当关闭此命令行时&#xff0c;临时路径会清除&#xff0c;可以将上述export的整条语句&#xff0c;加入~/.bashrc中 该命令中…

uniapp cli化一键游项目启动报错总结

问题1、使用hbuilder运行指令&#xff0c;开始编译后没有反应&#xff0c;使用命令构建自行结束进程 解决&#xff1a;因为使用了node16.24&#xff0c;卸载重新安装14.17后解决 问题2、 21:31:11.483 Module build failed (from ./node_modules/vue/cli-service/node_module…

一、分页嵌套查询

情况说明,简化 现在要查询A表和B表的数据&#xff0c;A和B的关系是一对多&#xff0c;B中有A.ID 例&#xff1a; A&#xff08;ID,NAME,TYPE,CREATE_TIME&#xff09; B&#xff08;ID,A_ID,ONE,TWO&#xff09; 要求根据B.TWO为条件&#xff0c;模糊查询所有满足条件的数据 //…

从零开始搭建React+TypeScript+webpack开发环境-自定义配置化的模拟服务器

技术栈 我们将使用Node.js和Express.js作为我们的后端框架&#xff0c;以及Node.js的文件系统(fs)模块来操作文件和文件夹。此外&#xff0c;我们将使用Node.js的require和delete require.cache来加载和更新模拟数据。 项目结构 首先&#xff0c;让我们定义一个简单的项目结…

Modbus封装库(Com,tcp,udp一应俱全)

自行封装在用的Modbus通迅库,集成了com,tcp,udp, 做个笔记吧&#xff0c; 以下头文件&#xff0c; #pragma once #include <functional> #include <vector> #include <string> #include <memory> #ifdef LIBMODBUS_EXPORTS #define LIBMODBUS_EXPORT_…

重磅发布 OpenAI 推出用户自定义版 ChatGPT

文章目录 重磅发布 OpenAI 推出用户自定义版 ChatGPT个人简介 重磅发布 OpenAI 推出用户自定义版 ChatGPT OpenAI 首届开发者大会 (OpenAI DevDay) 于北京时间 11 月 7 日凌晨 02:00 开始&#xff0c;大会上宣布了一系列平台更新。其中一个重要更新是用户可以创建他们自己的自定…

从零开始的C++(十四)

继承&#xff1a; 作用&#xff1a;减少重复代码&#xff0c;简化程序。 用法&#xff1a; class b&#xff1a;public a {//...b中成员 } 在如上代码中&#xff0c;b类以public的方式继承了a类。规定a类是父类、基类&#xff0c;b类是子类、派生类。 关于继承方式&#xf…