[GRASS-SVN] r68678 - sandbox/bo/i.segment.gsoc2016/i.segment
svn_grass at osgeo.org
svn_grass at osgeo.org
Mon Jun 13 12:41:39 PDT 2016
Author: hao2309
Date: 2016-06-13 12:41:39 -0700 (Mon, 13 Jun 2016)
New Revision: 68678
Removed:
sandbox/bo/i.segment.gsoc2016/i.segment/mean_shift_2016_05_30_yb.c
Log:
move stand-alone codes to sub folder
Deleted: sandbox/bo/i.segment.gsoc2016/i.segment/mean_shift_2016_05_30_yb.c
===================================================================
--- sandbox/bo/i.segment.gsoc2016/i.segment/mean_shift_2016_05_30_yb.c 2016-06-13 19:32:07 UTC (rev 68677)
+++ sandbox/bo/i.segment.gsoc2016/i.segment/mean_shift_2016_05_30_yb.c 2016-06-13 19:41:39 UTC (rev 68678)
@@ -1,224 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <math.h>
-#define FILEPATH "testing/test_map.ascii"
-
-/* =============input parameters=============== */
-//input spatial bandwidth = moving window radius
-#define RADIUS 2
-
-//input range bandwidth in normalized difference
-#define RANGEWIDTH 0.1
-
-//EPSILON to control when iterations should stop
-#define EPSILON 0.01
-
-//max number of iterations
-#define MAXITER 20
-
-//Threhold to cluster image
-#define CLUSTER_BANDWIDTH 0.5
-
-// row number:
-#define ROWNUM 8
-//column number:
-#define COLNUM 8
-
-
-
-void read_matrix(float **data_matrix){
- //open the matrix file
- FILE *data_file;
- int i,j,m;
- if ((data_file = fopen(FILEPATH, "r"))==NULL){
- printf("ERROR: can not open file");
- exit(0);
- };
- //loading the head information
- char head[8][100];
- for(i=0;i<8;i++){
- fgets(head[i], 100, data_file);
- printf (head[i]);
- }
- //loading the image matrix
-
- for (i=0;i<ROWNUM;i++){
- for (j=0;j<COLNUM;j++){
- if(!fscanf(data_file,"%f",&data_matrix[i][j]))
- break;
- }
- }
- fclose(data_file);
-}
-
-//print out the matrix
-void print_matrix(float **mtr, int mtr_rows, int mtr_cols){
- int i,j;
- for (i=0;i<mtr_rows;i++)
- {
- for (j=0;j<mtr_cols;j++)
- {
- printf("\t%.2f", mtr[i][j]);
- }
- printf("\n");
- }
-}
-
-//copy matrix
-void copy_matrix(float **newmtr, float **srcmtr)
-{
- int i,j;
- for (i=0;i<ROWNUM;i++){
- for (j=0;j<COLNUM;j++){
- newmtr[i][j] = srcmtr[i][j];
- }
- }
-}
-
-//simplified cluster bandwidth method to clump image
-void clump_matrix(float **mtr){
- //the value of class
- int class_value = 0;
- //how many pixels clumped
- int px_count = 0;
- //remember the first stop location
- int first_stop_row = 0;
- int first_stop_col = 0;
- int pixel_indicator_matrix[ROWNUM][COLNUM] = {{0}};//the indicator matrix to mark if the pixel has been clumped
- //start iterations
- while(px_count<ROWNUM*COLNUM){
- class_value+=1;// change class value
- int first_change = 0;//mark if the pixel is the first non-clump pixel
- //go through all rows
- float first_stop_value = mtr[first_stop_row][first_stop_col];//based pixel to be compared with other pixels
- for (int i=0;i<ROWNUM;i++){
- //go through all cols
- for (int j=0;j<COLNUM;j++){
- //condition: use cluster-bandwidth threhold to cluster the image
- if (fabs(mtr[i][j]-first_stop_value) <= CLUSTER_BANDWIDTH && pixel_indicator_matrix[i][j]==0){
- pixel_indicator_matrix[i][j] = 1;//mark pixel in indicator matrix 0 as non-clump, 1 as clump
- mtr[i][j] = class_value;// assign the cluster value
- px_count+=1;
- }
- //mark the first non-clumped pixel
- else if(first_change == 0 && pixel_indicator_matrix[i][j]==0){
- first_change =1;// mark the first time non-clump
- first_stop_row = i;//record the pixel location of first time non-clump
- first_stop_col = j;
- }
- }//end of cols
- }//end of rows
- }//end iteration
-}
-
-int main(){
- float **in_matrix;//initialte input matrix
- float **temp_matrix;//initialte last iteration matrix
- float **out_matrix;//initialte output matrix
- //window size in pixel number
- int window_size = RADIUS*2+1;
- // iter counter
- int iter = 0;
- // number of changed pixel > epsilon
- /* ================assign mem to matrix==================== */
- int n_changes = 1;
- in_matrix = malloc(sizeof(*in_matrix) *ROWNUM);
- temp_matrix= malloc(sizeof(*in_matrix) *ROWNUM);
- out_matrix= malloc(sizeof(*in_matrix) *ROWNUM);
- for (int i=0;i<8;i++){
- in_matrix[i] = malloc(sizeof(*in_matrix[i]) * COLNUM);
- temp_matrix[i]= malloc(sizeof(*in_matrix) *ROWNUM);
- out_matrix[i]= malloc(sizeof(*in_matrix) *ROWNUM);
- }
- //end assign mem
- printf ("The head file info of the image is: \n");
- read_matrix(in_matrix);//read head info and data
- copy_matrix(out_matrix, in_matrix);//copy input raster to output raster
- while (iter<MAXITER && n_changes>0){
- //initialte the in raster, outraster and last iteration raster.
- iter += 1;
- //make output raster of last iteration input raster of this iteration
- copy_matrix(temp_matrix, in_matrix);
- copy_matrix(in_matrix, out_matrix);
- copy_matrix(out_matrix, temp_matrix);
- //go through all rows
- for (int current_row=0;current_row<ROWNUM;current_row++){
- //# go through all columns
- for (int current_col=0;current_col<COLNUM;current_col++){
- //create moving window, resize in the image edge
- int window_row_north = current_row - RADIUS;//left bound of the window
- int window_row_south = window_row_north + window_size;//right bound of the window
- //clip window in the edge
- if (window_row_north<0){
- window_row_north = 0;
- }
- if (window_row_south>ROWNUM){
- window_row_south = ROWNUM;
- }
- int window_col_west = current_col - RADIUS;//upper bound of the window
- int window_col_east = window_col_west + window_size;//lower bound of the window
- if (window_col_west<0){
- window_col_west = 0;
- }
- if (window_col_east>ROWNUM){
- window_col_east = ROWNUM;
- }
- float sum_of_weights = 0;
- float new_raster_value = 0;
- //start of the moving window
- for (int current_window_row = window_row_north;current_window_row<window_row_south;current_window_row++){
- for (int current_window_col = window_col_west;current_window_col<window_col_east;current_window_col++){
- //check spatial distance (bandwidth)
- float weight = 1;
- if (sqrt(pow((current_window_row - current_row),2)+pow((current_window_col - current_col),2))<=RADIUS){
- //check range bandwidth
- if (fabs((in_matrix[current_window_row][current_window_col]-in_matrix[current_row][current_col])/in_matrix[current_row][current_col])<=RANGEWIDTH){
- weight *=1;
- sum_of_weights += weight;
- new_raster_value += in_matrix[current_window_row][current_window_col]*weight;
- }
- }
- }
- }//end of moving window
- new_raster_value /= sum_of_weights;
- out_matrix[current_row][current_col] = new_raster_value;
- //condition: if the pixel converged(less than epsilon)
- if (fabs(new_raster_value - temp_matrix[current_row][current_col])>EPSILON){
- n_changes++;
- }
-
- }//end of all all columns
- }//end of all rows
- }//end of iteration
- printf ("The image after mean filtering is: \n");
- print_matrix(out_matrix,ROWNUM,COLNUM);
-/* =================clustering image ============================ */
- printf ("The image after clustering is: \n");
- clump_matrix(out_matrix);
- print_matrix(out_matrix,ROWNUM,COLNUM);
- //===================free matrix=============================
- for (int i=0;i<8;i++){
- free(in_matrix[i]);
- free(temp_matrix[i]);
- free(out_matrix[i]);
- }
- free(in_matrix);
- free(temp_matrix);
- free(out_matrix);
- printf ("Program finished running\n");
- return 0;
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
More information about the grass-commit
mailing list