利用GDAL和QWT绘制图像直方图2--QWT绘制直方图

 转自: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为界面绘制类。我们也不说闲话了,先看直方图绘制类的头文件吧。

//Hisgram为直方图的数据类
class Histogram: public QwtPlotHistogram
{
public:
    Histogram(const QString &, const QColor &);

   //设置直方图绘制的颜色和符号
    void setColor(const QColor &);
 
  //设置直方图的数据
  //numValues为统计的间隔数,这在篇1中有介绍
 //dfmin为统计图像波段的最小值
 //dfmax为统计图像波段的最大值
//pArray为直方图数组,大小为numValues
    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);//设置统计间隔,这个感觉是QWT的设计的过人之处


        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();

四、实现界面效果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kupeThinkPoem

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值