转自:http://blog.csdn.net/kupepoem/article/details/20144697
系统环境:win7
开发环境:vs2010,qt4.7,qwt6.01,GDAL1.9
参考:..\qwt-6.0.1\examples\tvplot工程
参考:http://blog.csdn.net/e5max/article/details/8854682
利用GDAL和QWT绘制图像直方图1--Gdal统计直方图篇我们已经得到了图像的直方图,下面我们利用QWT工具来进行直方图的绘制(QWT的编译和使用请查看我的博客使用qwt作曲线图)。下面我们看看怎么利用QWT绘制GDAL统计出来的直方图。
一、QWT框架简介
Qwt框架提供了几种标准的图元实现。如网格(QwtPlotGrid类)、标签(QwtPlotMarker类)、标尺(QwtPlotScaleItem类)、显示SVG格式图形文件的图元(QwtPlotSvgItem类)、频谱图(QwtPlotSpectrogram类)、曲线(QwtPlotCurve类)、柱状图(QwtPlotHistogram类)、间隔区域(QwtPlotIntervalCurve类)、三维散点图(QwtPlotSpectroCurve类)等。用户可以继承QwtPlotItem实现符合自己需要的图元。具体请参考http://blog.csdn.net/e5max/article/details/8854682。
二、直方图绘制类实现
QWT继承QT的特点,数据和界面进行分离,具体的我还没深入研究。在此次直方图绘制中Histogram类为数据类,CHisPlot为界面绘制类。我们也不说闲话了,先看直方图绘制类的头文件吧。
-
- class Histogram: public QwtPlotHistogram
- {
- public:
- Histogram(const QString &, const QColor &);
-
-
- void setColor(const QColor &);
-
-
-
-
-
-
- void setValues(double dfmin,double dfmax,uint numValues, const double *pArray);
- };
-
- class CHisPlot: public QwtPlot
- {
- Q_OBJECT
-
- public:
- CHisPlot(QWidget * = NULL);
-
-
- void setHis(double dfmin,double dfmax,const QVector<double> & vecHis ,const QString &strHisName);
-
-
- private:
-
- Histogram *m_hisGram;
- };
好了我们看实现吧
-
- Histogram::Histogram(const QString &title, const QColor &symbolColor):
- QwtPlotHistogram(title)
- {
-
- setStyle(QwtPlotHistogram::Columns);
-
- setColor(symbolColor);
- }
-
- void Histogram::setColor(const QColor &symbolColor)
- {
- QColor color = symbolColor;
- color.setAlpha(180);
-
- setPen(QPen(Qt::black));
- setBrush(QBrush(color));
-
- QwtColumnSymbol *symbol = new QwtColumnSymbol(QwtColumnSymbol::Box);
- symbol->setFrameStyle(QwtColumnSymbol::Raised);
- symbol->setLineWidth(2);
- symbol->setPalette(QPalette(color));
- setSymbol(symbol);
- }
-
-
- void Histogram::setValues(double dfmin,double dfmax,uint numValues, const double *values)
- {
- QVector<QwtIntervalSample> samples(numValues);
-
- double dscale=(dfmax-dfmin)/numValues;
-
- for ( uint i = 0; i < numValues; i++ )
- {
- QwtInterval interval(dfmin+i*dscale, (i+1)*dscale+dfmin);
-
-
- interval.setBorderFlags(QwtInterval::ExcludeMaximum);
-
- samples[i] = QwtIntervalSample(values[i], interval);
- }
-
- setData(new QwtIntervalSeriesData(samples));
- }
-
- CHisPlot::CHisPlot(QWidget *parent):
- QwtPlot(parent)
- {
-
-
- setCanvasBackground(QColor(Qt::gray));
- plotLayout()->setAlignCanvasToScales(true);
-
- setAxisTitle(QwtPlot::yLeft, tr("Frequency"));
- setAxisTitle(QwtPlot::xBottom, tr("Band"));
-
-
- }
-
-
- void CHisPlot::setHis(double dfmin,double dfmax,const QVector<double> & vecHis ,const QString & strHisName)
- {
-
-
- m_hisGram = new Histogram(strHisName, Qt::red);
-
- int ncount=vecHis.count();
- m_hisGram->setValues( dfmin, dfmax,ncount, &vecHis[0]);
- m_hisGram->attach(this);
- replot();
-
- etAutoReplot(true);
-
-
- }
三、直方图的类使用
实现的类写完了,我们看看怎么用CHisPlot类吧。不多说了,先放代码
- CHisPlot*pHisPlot=new CHisPlot();
- pHisPlot->setHis(pMinMax[0],pMinMax[1],vecHis,"his1");
- pHisPlot->show();
四、实现界面效果
![](https://img-blog.csdn.net/20140228173811000?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQva3VwZXBvZW0=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)