qt画个灰度直方图

步骤

  1. 导入图表库
  2. 在ui界面新建一个wight窗口并提升为那个图表库的类型
  3. 写函数 输入参数是(图表,待处理图片)
  4. 图表的横轴是像素值 从0-255 纵轴是此灰度的像素点数量或者占比
  5. 所以要挨个判断图像里的每一个像素点 确认灰度值之后计数
  6. 然后用画图表的指令就可以了

我下面为什么引用了 Qt:OpenCV::Mat与Qt::QImage相互转换 的知识呢。。。因为一开始我参考的例程导入的是qimage的图片。我觉得mat可能好用一点。。。。结果发现我不用转,直接把图片导入成mat格式来用就好了,我个憨憨。

void MainWindow::graydata(QCustomPlot * plot, Mat img)
{
        double yrange=0;
        QVector<double>datax;
        QVector<double>datay;

        plot->clearGraphs();
        datay.resize(256);
        for (double i=0;i<256;i++) {
            datax.push_back(i);
        }

        unsigned char* data=img.data;
        int width = img.rows-50;
        int hight = img.cols-50;
        for (int i=50;i<hight;i++) {
            for (int j=50;j<width;j++) {
                datay[data[i*hight+j]]+=1;
            }
        }

        QVector<double>::iterator it;
        for (it=datay.begin();it!=datay.end();it++) {
            if(*it>yrange)
                yrange=*it;
        }

        plot->xAxis->setRange(-5,260);
        plot->yAxis->setRange(0,(int)yrange);

        QCPBars *bars=new QCPBars(plot->xAxis,plot->yAxis);

        bars->setData(datax,datay);
        bars->setPen(QColor(0,0,0));
        plot->replot();
}

QImage::Format这个方法可以查询图片的颜色类型
Qt:OpenCV::Mat与Qt::QImage相互转换

假设存在一个 3\times3 的图像,如下图所示,数组x 统计的是像素点的灰度级,数组y
统计的是具有该灰度级的像素个数。其中,灰度为1的像素共3个,灰度为2的像素共1个,灰度为3的像素共2个,灰度为4的像素共1个,灰度为5的像素共2个。

qt画个灰度直方图
数字图像处理(15): 灰度直方图(matplotlib 和OpenCV
绘制直方图)

QCustomPlot简单介绍和例程
qt超强精美绘图控件 – QCustomPlot一览 及 安装使用教程

下面两个链接 第一个说qimage格式有对齐,mat格式不用对齐
第二个说 mat格式基本上不用对齐,但是也有需要对齐的时候。。。

qt画个灰度直方图
把QImage转换为cv::Mat

例如保存BMP格式的图像时,BMP要求图像数据按四字节对齐,此时就需要对Mat中的数据进行补零
对齐方法就是在每一行尾部补零,零的个数可能是1~3个
但其实大部分时候,Mat的内存都是连续的,只有极个别时候需要担心这个问题,这里有说明,和这里
【学习OpenCV】Mat::data指针

Original: https://blog.csdn.net/qq_42635852/article/details/121232622
Author: 晓蓝WQuiet
Title: qt画个灰度直方图

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/645811/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球