利用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));

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值