[GRASS-SVN] r68521 - sandbox/bo/i.segment.gsoc2016/i.segment
svn_grass at osgeo.org
svn_grass at osgeo.org
Wed May 25 20:30:24 PDT 2016
Author: hao2309
Date: 2016-05-25 20:30:24 -0700 (Wed, 25 May 2016)
New Revision: 68521
Added:
sandbox/bo/i.segment.gsoc2016/i.segment/MeanShift_pseudo_2016_05_25_MM
Log:
add pseudo code
Added: sandbox/bo/i.segment.gsoc2016/i.segment/MeanShift_pseudo_2016_05_25_MM
===================================================================
--- sandbox/bo/i.segment.gsoc2016/i.segment/MeanShift_pseudo_2016_05_25_MM (rev 0)
+++ sandbox/bo/i.segment.gsoc2016/i.segment/MeanShift_pseudo_2016_05_25_MM 2016-05-26 03:30:24 UTC (rev 68521)
@@ -0,0 +1,128 @@
+'''
+Module Name: Meanshift pseudo code
+
+Created on May 24, 2016
+
+ at author: Bo Yang, Moritz Lennert, Markus Metz
+
+GRASS GSoC2016 project, All Rights Reserved
+'''
+
+#==================================================================================
+# input parameters
+#==================================================================================
+
+# sampling window radius = spatial bandwidth in number of pixels
+radius = 3.5
+
+# range bandwidth (spectral bandwidth) for normalized difference between old and new values
+# must be 0 < range bandwidth < 1
+range_bandwidth = 0.1
+
+# threshold to control when iterations should stop
+# stop if the maximum difference between old and new values is < threshold
+threshold_factor= 0.01
+
+# maximum number of iterations
+max_iter = 20
+
+
+#===================================================================================
+# input Raster
+#===================================================================================
+
+# use existing functions in i.segment
+
+
+#===================================================================================
+# gaussian weight difference (S=||B1-A1||)
+#===================================================================================
+
+# window size in number of pixels
+window_size = (int)radius * 2 + 1
+
+# initialize
+
+# copy input raster to output raster
+rastout = rastin
+
+# iteration counter
+iter = 0
+
+# number of changed pixels with change > threshold
+n_changes = 1
+
+while (iter < max_iter && n_changes > 0 {
+
+ # make output raster of last iteration input raster of this iteration
+ rasttmp = rastin
+ rastin = rastout
+ rastout = rasttmp
+
+ # go through all rows
+ for (row = 0; row < nrows; row++) {
+
+ # go through all columns
+ for (col = 0; col < ncols; col++) {
+
+ # figure out moving window, clip to region if necessary
+ mwrow1 = row - (int)radius
+ mwrow2 = mwrow1 + window_size
+ if (mwrow1 < 0)
+ mwrow1 = 0
+ if (mwrow2 > nrows)
+ mwrow2 = nrows
+
+
+ mwcol1 = col - (int)radius
+ mwcol2 = mwcol1 + window_size
+ if (mwcol1 < 0)
+ mwcol1 = 0
+ if (mwcol2 > ncols)
+ mwcol2 = ncols
+
+ # read band values from rastin for row, col
+
+ sum_of_weights = 0
+ # go through the window
+ for (mwrow = mwrow1; mwrow < mwrow2; mwrow++) {
+ for (mwcol = mwcol1; mwcol < mwcol2; mwcol++) {
+
+ # check spatial distance
+ if the spatial distance to focus pixel is <= radius {
+
+ # set the weight, here 1, can be changed to gaussian weight
+ weight = 1
+
+ # read band values from rastin for mrow, mcol as oldvalue
+
+ # check spectral distance
+ if the spectral distance to focus pixel is <= range_bandwidth {
+
+ # adjust the weight, here 1, can be changed to gaussian weight
+ # the weight is a function of the spectral distance, one weight for all bands
+ weight *= 1
+ sum_of_weights += weight
+ for all bands
+ newvalue = oldvalue * weight
+ }
+ }
+ }
+ }
+ # end of moving window
+
+ newvalue /= sum_of_weights
+
+ write newvalue to rastout
+
+ if the spectral distance between old and new value is > threshold
+ # not yet converged
+ n_changes++
+
+ }
+ # end columns
+ }
+ # end rows
+}
+# end iterations
+
More information about the grass-commit
mailing list