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);//向量扩容到256并填充为0  用来计数
        for (double i=0;i<256;i++) {
            datax.push_back(i);//x向量填0 1 ……255  作为横坐标
        }
        //QImage countimg=img->copy();
        unsigned char* data=img.data;//bits()直接返回图像第一个字节的地址
        int width = img.rows-50;
        int hight = img.cols-50;//图像边缘随手隔了50个像素不读
        for (int i=50;i<hight;i++) {
            for (int j=50;j<width;j++) {
                datay[data[i*hight+j]]+=1;
            }
        }
        //y轴最大值
        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个。
在这里插入图片描述
数字图像处理(15): 灰度直方图(matplotlib 和OpenCV
绘制直方图)

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

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

在这里插入图片描述
把QImage转换为cv::Mat

例如保存BMP格式的图像时,BMP要求图像数据按四字节对齐,此时就需要对Mat中的数据进行补零
对齐方法就是在每一行尾部补零,零的个数可能是1~3个

但其实大部分时候,Mat的内存都是连续的,只有极个别时候需要担心这个问题,这里有说明,和这里

【学习OpenCV】Mat::data指针

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值