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

[cpp]  view plain  copy
  1. //Hisgram为直方图的数据类  
  2. class Histogram: public QwtPlotHistogram  
  3. {  
  4. public:  
  5.     Histogram(const QString &, const QColor &);  
  6.   
  7.    //设置直方图绘制的颜色和符号  
  8.     void setColor(const QColor &);  
  9.    
  10.   //设置直方图的数据  
  11.   //numValues为统计的间隔数,这在篇1中有介绍  
  12.  //dfmin为统计图像波段的最小值  
  13.  //dfmax为统计图像波段的最大值  
  14. //pArray为直方图数组,大小为numValues  
  15.     void setValues(double dfmin,double dfmax,uint numValues, const double *pArray);  
  16. };  
  17. //实际界面绘制类  
  18. class CHisPlot: public QwtPlot  
  19. {  
  20.     Q_OBJECT  
  21.   
  22. public:  
  23.     CHisPlot(QWidget * = NULL);  
  24.   
  25.     //设置直方图数据  
  26.      void setHis(double dfmin,double dfmax,const QVector<double> & vecHis ,const QString &strHisName);  
  27.   
  28.   
  29. private:  
  30.   
  31.     Histogram *m_hisGram;  
  32. };  

好了我们看实现吧

[cpp]  view plain  copy
  1. //直方图数据类实现  
  2. Histogram::Histogram(const QString &title, const QColor &symbolColor):  
  3.     QwtPlotHistogram(title)  
  4. {  
  5.    //设置柱状直方图  
  6.     setStyle(QwtPlotHistogram::Columns);  
  7. //设置颜色  
  8.       setColor(symbolColor);  
  9. }  
  10.   
  11. void Histogram::setColor(const QColor &symbolColor)  
  12. {  
  13.     QColor color = symbolColor;  
  14.     color.setAlpha(180);  
  15.   
  16.     setPen(QPen(Qt::black));  
  17.     setBrush(QBrush(color));  
  18.   
  19.     QwtColumnSymbol *symbol = new QwtColumnSymbol(QwtColumnSymbol::Box);  
  20.     symbol->setFrameStyle(QwtColumnSymbol::Raised);  
  21.     symbol->setLineWidth(2);  
  22.     symbol->setPalette(QPalette(color));  
  23.     setSymbol(symbol);  
  24. }  
  25.   
  26. //设置数据  
  27. void Histogram::setValues(double dfmin,double dfmax,uint numValues, const double *values)  
  28. {  
  29.     QVector<QwtIntervalSample> samples(numValues);  
  30.   
  31.     double dscale=(dfmax-dfmin)/numValues;  
  32.   
  33.     for ( uint i = 0; i < numValues; i++ )  
  34.     {  
  35.         QwtInterval interval(dfmin+i*dscale, (i+1)*dscale+dfmin);//设置统计间隔,这个感觉是QWT的设计的过人之处  
  36.   
  37.   
  38.         interval.setBorderFlags(QwtInterval::ExcludeMaximum);  
  39.           
  40.         samples[i] = QwtIntervalSample(values[i], interval);  
  41.     }  
  42.   
  43.     setData(new QwtIntervalSeriesData(samples));  
  44. }  
  45.   
  46. CHisPlot::CHisPlot(QWidget *parent):  
  47.     QwtPlot(parent)  
  48. {  
  49.    
  50.   //设置背景  
  51.   setCanvasBackground(QColor(Qt::gray));  
  52.     plotLayout()->setAlignCanvasToScales(true);  
  53. //设置坐标标题  
  54.     setAxisTitle(QwtPlot::yLeft, tr("Frequency"));  
  55.     setAxisTitle(QwtPlot::xBottom, tr("Band"));  
  56.      
  57.   
  58. }  
  59.   
  60. //设置直方图数据  
  61. void CHisPlot::setHis(double dfmin,double dfmax,const QVector<double> & vecHis ,const QString & strHisName)  
  62. {  
  63.   
  64.   
  65.     m_hisGram = new Histogram(strHisName, Qt::red);  
  66.   
  67.     int ncount=vecHis.count();  
  68.     m_hisGram->setValues( dfmin, dfmax,ncount, &vecHis[0]);  
  69.     m_hisGram->attach(this);  
  70.     replot();  
  71.   
  72.     etAutoReplot(true);  
  73.   
  74.       
  75. }  

三、直方图的类使用

实现的类写完了,我们看看怎么用CHisPlot类吧。不多说了,先放代码

[cpp]  view plain  copy
  1. CHisPlot*pHisPlot=new CHisPlot();  
  2. pHisPlot->setHis(pMinMax[0],pMinMax[1],vecHis,"his1");  
  3. pHisPlot->show();  

四、实现界面效果

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
gdal是一个用于空间数据处理的库,它提供了许多功能来处理栅格数据,如图像处理、地理坐标转换等。Python是一种常用的编程语言,gdal库可以与Python结合使用,以便更方便地处理栅格数据。 直方图均衡是一种图像增强的技术,用于增强图像的对比度和亮度。在gdal python中,可以使用HistogramEqualization函数来实现直方图均衡。 首先,我们需要打开要进行直方图均衡的图像文件。可以使用gdal.Open函数来打开图像文件,并将其读取为一个gdal数据集。然后,可以使用GetRasterBand方法来获取图像的每个波段。接下来,可以使用ReadAsArray方法将波段数据读取为一个numpy数组。 然后,我们可以使用numpy.histogram函数来计算图像直方图直方图是对图像中不同像素值的统计。然后,可以使用numpy.cumsum函数计算累积分布函数(CDF),并将其标准化为0到255之间的范围。 接下来,我们可以使用numpy.interp函数来对图像的像素值进行重新映射,并使用numpy.uint8类型将其限制在0到255之间。然后,可以使用gdal.Band.WriteArray方法将修改后的数据写入原始图像文件中。 最后,我们应该注意,直方图均衡可能会导致图像的某些区域过亮或过暗,这可能需要进一步的处理来调整图像的对比度。例如,可以使用线性拉伸和直方图规定化等技术来进一步增强图像。 总之,gdal python提供了直方图均衡的功能,可以通过打开图像文件、计算直方图、进行像素值重新映射和写入修改后的数据来实现。直方图均衡是一种常用的图像增强技术,可以提高图像的对比度和亮度。但需要注意,直方图均衡可能导致某些图像区域变得过亮或过暗,可能需要进一步处理来调整图像的对比度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值