Skip to content

Commit c517a90

Browse files
committedJul 20, 2012
raster single band gray cumulative pixel count cut
1 parent 193c3c2 commit c517a90

File tree

4 files changed

+66
-10
lines changed

4 files changed

+66
-10
lines changed
 

‎src/gui/raster/qgsrasterrendererwidget.cpp

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,36 @@ bool QgsRasterRendererWidget::bandMinMax( LoadMinMaxAlgo loadAlgo, int band, dou
7575
{
7676
mRasterLayer->computeMinimumMaximumFromLastExtent( band, minMaxValues );
7777
}
78+
else if ( loadAlgo == CumulativeCut )
79+
{
80+
// Currently 2 - 98% cumulative pixel count cut
81+
bool myIgnoreOutOfRangeFlag = true;
82+
bool myThoroughBandScanFlag = false;
83+
mRasterLayer->populateHistogram( band, RASTER_HISTOGRAM_BINS, myIgnoreOutOfRangeFlag, myThoroughBandScanFlag );
84+
85+
QgsRasterBandStats myRasterBandStats = mRasterLayer->bandStatistics( band );
86+
double myBinXStep = myRasterBandStats.range / RASTER_HISTOGRAM_BINS;
87+
int myCount = 0;
88+
int myMinCount = ( int ) qRound( 0.02 * myRasterBandStats.elementCount );
89+
int myMaxCount = ( int ) qRound( 0.98 * myRasterBandStats.elementCount );
90+
bool myMinFound = false;
91+
QgsDebugMsg( QString( "RASTER_HISTOGRAM_BINS = %1 range = %2 minimumValue = %3 myBinXStep = %4" ).arg( RASTER_HISTOGRAM_BINS ).arg( myRasterBandStats.range ).arg( myRasterBandStats.minimumValue ).arg( myBinXStep ) );
92+
for ( int myBin = 0; myBin < RASTER_HISTOGRAM_BINS; myBin++ )
93+
{
94+
int myBinValue = myRasterBandStats.histogramVector->value( myBin );
95+
myCount += myBinValue;
96+
if ( !myMinFound && myCount > myMinCount )
97+
{
98+
minMaxValues[0] = myRasterBandStats.minimumValue + myBin * myBinXStep;
99+
myMinFound = true;
100+
}
101+
if ( myCount > myMaxCount )
102+
{
103+
minMaxValues[1] = myRasterBandStats.minimumValue + myBin * myBinXStep;
104+
break;
105+
}
106+
}
107+
}
78108
else
79109
{
80110
return false;

‎src/gui/raster/qgsrasterrendererwidget.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,8 @@ class GUI_EXPORT QgsRasterRendererWidget: public QWidget
3333
{
3434
Estimate,
3535
Actual,
36-
CurrentExtent
36+
CurrentExtent,
37+
CumulativeCut // 2 - 98% cumulative cut
3738
};
3839

3940
virtual QgsRasterRenderer* renderer() = 0;

‎src/gui/raster/qgssinglebandgrayrendererwidget.cpp

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -98,18 +98,23 @@ void QgsSingleBandGrayRendererWidget::on_mLoadPushButton_clicked()
9898
{
9999
ok = bandMinMax( CurrentExtent, band, minMaxValues );
100100
}
101-
102-
if ( ok )
101+
else if ( mCumulativeCut->isChecked() )
103102
{
104-
mMinLineEdit->setText( QString::number( minMaxValues[0] ) );
105-
mMaxLineEdit->setText( QString::number( minMaxValues[1] ) );
103+
ok = bandMinMax( CumulativeCut, band, minMaxValues );
106104
}
107105
else if ( mUseStdDevRadioButton->isChecked() )
108106
{
109107
QgsRasterBandStats rasterBandStats = mRasterLayer->bandStatistics( band );
110108
double diff = mStdDevSpinBox->value() * rasterBandStats.stdDev;
111109
minMaxValues[0] = rasterBandStats.mean - diff;
112110
minMaxValues[1] = rasterBandStats.mean + diff;
111+
ok = true;
112+
}
113+
114+
if ( ok )
115+
{
116+
mMinLineEdit->setText( QString::number( minMaxValues[0] ) );
117+
mMaxLineEdit->setText( QString::number( minMaxValues[1] ) );
113118
}
114119
else
115120
{

‎src/ui/qgssinglebandgrayrendererwidgetbase.ui

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@
7070
</property>
7171
</widget>
7272
</item>
73-
<item row="4" column="1" colspan="4">
73+
<item row="5" column="1" colspan="4">
7474
<spacer name="horizontalSpacer_5">
7575
<property name="orientation">
7676
<enum>Qt::Horizontal</enum>
@@ -96,14 +96,14 @@
9696
</property>
9797
</spacer>
9898
</item>
99-
<item row="3" column="0" colspan="3">
99+
<item row="4" column="0" colspan="3">
100100
<widget class="QRadioButton" name="mUseStdDevRadioButton">
101101
<property name="text">
102102
<string>Use standard deviation</string>
103103
</property>
104104
</widget>
105105
</item>
106-
<item row="3" column="3">
106+
<item row="4" column="3">
107107
<widget class="QDoubleSpinBox" name="mStdDevSpinBox">
108108
<property name="sizePolicy">
109109
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
@@ -116,7 +116,7 @@
116116
</property>
117117
</widget>
118118
</item>
119-
<item row="3" column="4">
119+
<item row="4" column="4">
120120
<spacer name="horizontalSpacer_4">
121121
<property name="orientation">
122122
<enum>Qt::Horizontal</enum>
@@ -129,13 +129,33 @@
129129
</property>
130130
</spacer>
131131
</item>
132-
<item row="4" column="0">
132+
<item row="5" column="0">
133133
<widget class="QPushButton" name="mLoadPushButton">
134134
<property name="text">
135135
<string>Load</string>
136136
</property>
137137
</widget>
138138
</item>
139+
<item row="3" column="0">
140+
<widget class="QRadioButton" name="mCumulativeCut">
141+
<property name="text">
142+
<string>2 - 98% cumulative pixel count cut</string>
143+
</property>
144+
</widget>
145+
</item>
146+
<item row="3" column="2" colspan="3">
147+
<spacer name="horizontalSpacer_6">
148+
<property name="orientation">
149+
<enum>Qt::Horizontal</enum>
150+
</property>
151+
<property name="sizeHint" stdset="0">
152+
<size>
153+
<width>40</width>
154+
<height>20</height>
155+
</size>
156+
</property>
157+
</spacer>
158+
</item>
139159
</layout>
140160
</widget>
141161
</item>

0 commit comments

Comments
 (0)
Please sign in to comment.