利用QT画图像的直方图

news/2024/7/21 6:07:58 标签: 图像处理

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.niftyadmin.cn/n/5163749.html

相关文章

Scala爬虫如何实时采集天气数据?

这是一个基本的Scala爬虫程序&#xff0c;使用了Scala的http library来发送HTTP请求和获取网页内容。在爬取天气预报信息时&#xff0c;我们首先需要创建一个代理对象proxy&#xff0c;并将其用于发送HTTP请求。然后&#xff0c;我们使用http库的GET方法获取网页内容&#xff0…

【AI编程】ai编程插件汇总iFlyCode、codegeex

1、iFlyCode 开发公司&#xff1a;讯飞 支持IDE: VS Code、IntelliJ IDEA、CLion、PyCharm、WebStorm 支持语言: Python、JavaScript、C、Java 下载地址&#xff1a;https://iflycode.xfyun.cn/ iFlyCode 快捷键列表&#xff1a;  Tab 采纳建议  Esc 拒绝建议  Alt\ 主动…

什么是大数据架构

大数据架构是用于摄取和处理大量数据&#xff08;通常称为“大数据”&#xff09;的总体系统&#xff0c;以便可以出于业务目的对其进行分析。该架构可以被视为基于组织业务需求的大数据解决方案的蓝图。大数据架构旨在处理以下类型的工作&#xff1a; 大数据源的批处理。 大数…

【C++】多态(重写)的实现过程及其原理【核心知识点精讲】(22)

前言 大家好吖&#xff0c;欢迎来到 YY 滴C系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; 目录 一.基础知识介绍1&#xff09;虚函数&a…

智慧燃气管网监测系统功能简要介绍

关键词&#xff1a;智慧燃气、智慧燃气管网、智慧燃气管网监测、智慧燃气管网监测系统、智慧燃气解决方案 燃气作为城市主要燃料&#xff0c;遍布整个城区&#xff0c;其安全运行直接关系到居民的生命安全&#xff0c;不可不重视。 智慧燃气中的GIS和SCADA系统&#xff0c;可…

什么是高敏感型人格,高敏型人格如何改变自己

什么是高敏感型人格&#xff1f; 高敏感型人格&#xff0c;指的是个体情绪敏感度高&#xff0c;有好处也有不好的地方&#xff0c;比如说好处吧&#xff0c;高敏感型人格他们对情绪的感知更加细腻&#xff0c;这种特征在创作和设计方面&#xff0c;往往能到达常人所不能达到的…

JVM Native内存泄露的排查分析(64M 问题)

我们有一个线上的项目&#xff0c;刚启动完就占用了使用 top 命令查看 RES 占用了超过 1.5G&#xff0c;这明显不合理&#xff0c;于是进行了一些分析找到了根本的原因&#xff0c;下面是完整的分析过程&#xff0c;希望对你有所帮助。 会涉及到下面这些内容 Linux 经典的 64M…

ClickHouse介绍和使用

ClickHouse介绍和使用 1. 简介2. ClickHouse特点3. 数据类型3.1. 整型3.2. 浮点型3.3. Decimal型3.4. 布尔型3.5. 字符串3.6. 枚举类型3.7. 时间类型 4. 表引擎4.1. TinyLog4.2. Memory4.3. MergeTree4.3.1. partition by分区&#xff08;可选&#xff09;4.3.2. primary key 主…