步骤
- 导入图表库
- 在ui界面新建一个wight窗口并提升为那个图表库的类型
- 写函数 输入参数是(图表,待处理图片)
- 图表的横轴是像素值 从0-255 纵轴是此灰度的像素点数量或者占比
- 所以要挨个判断图像里的每一个像素点 确认灰度值之后计数
- 然后用画图表的指令就可以了
我下面为什么引用了 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格式基本上不用对齐,但是也有需要对齐的时候。。。
例如保存BMP格式的图像时,BMP要求图像数据按四字节对齐,此时就需要对Mat中的数据进行补零
对齐方法就是在每一行尾部补零,零的个数可能是1~3个但其实大部分时候,Mat的内存都是连续的,只有极个别时候需要担心这个问题,这里有说明,和这里