Exemplo n.º 1
0
static int find_regional_maxima (unsigned short numrows, 
                                 unsigned short numcols,
                                 simple_REGION_list **mr_first,
                                 simple_REGION_list **mr_last,
                                 short *num_regions,
                                 double **greyvalues)
{
   /*******************************************************************/
   /* Es werden Listen von regionalen Maxima erzeugt                  */
   /*******************************************************************/
   
   unsigned short row;
   unsigned short col;
   short maxflag;
   short ind_plateau;
   simple_PIXEL_list *currpix;
   simple_REGION_list *last_but_one = NULL;
  
   unsigned char **vis;


   vis = (unsigned char **) matrix_all_alloc (numrows, numcols, 'U', 0);

   new_region_in_region_list (mr_first, mr_last);

   *num_regions = 0;
  

   for (row = 0; row < numrows; row ++)
   {
	  //#pragma omp parallel for
      for (col = 0; col < numcols; col ++)
      {
         if (vis [row][col] != 0)
            continue;
            
         maxflag = 1;
         ind_plateau = 0;
   
         single_check_neighbours (numrows, numcols, row, col, greyvalues, &maxflag, &ind_plateau);

         /*************************************************************/
         /* Das aktuelle Pixel der Schleife wird hier als besucht     */
         /* markiert, auch wenn es das erste Pixel eines Plateaus     */
         /* ist (die uebrigen Pixel des Plateaus werden dann in       */
         /* check_plateau_us markiert).                               */
         /*************************************************************/

         vis [row][col] = 1;
                                     
         if (ind_plateau == 0)
         {
            /**********************************************************/
            /* Kein Nachbarpixel hat denselben Grauwert wie das       */
            /* aktuelle Pixel                                         */
            /**********************************************************/
            
            if (maxflag == 1)
            {
               /*******************************************************/
               /* Ein Maximum, bestehend aus einem einzigen Pixel     */
               /*******************************************************/
               
               last_but_one = *mr_last;    
               new_pixel_in_region (*mr_last, row, col);
               (*num_regions) ++;
               new_region_in_region_list (mr_first, mr_last);
            }
            else
            {
               ;
               
               /*******************************************************/
               /* Kein Maximum, da tun wir gar nichts                 */
               /*******************************************************/
            }
            
            continue;  
         }
         

         /*************************************************************/
         /* Es ist ein Plateau                                        */
         /*************************************************************/
         
         new_pixel_in_region (*mr_last, row, col);
         //#pragma omp parallel for
         for (currpix = (*mr_last) -> first; currpix != NULL; currpix = currpix -> next)
         {
            check_plateau (numrows, numcols, greyvalues, vis, *mr_last, currpix, &maxflag);
         }
		 
         if (maxflag == -1)
            free_pixlist_of_region (*mr_last);
         else
         {
            /**********************************************************/
            /* Ein neues Maximum-Plateau                              */
            /**********************************************************/
            last_but_one = *mr_last;    
            new_region_in_region_list (mr_first, mr_last);

            (*num_regions) ++;
         }
      }
   }

   free_last_region (mr_first, mr_last, last_but_one);
   matrix_all_free ((void **) vis);
   
   return 0;
}
bool Cconnectivity_analysis::On_Execute(void)
{
	CSG_Grid *pinpgrid, *bingrid, *symb_grid, *hgrid;
	CSG_Shapes *pOutlines;

	bool filter, corners_centers, remove_marginal_regions;
	unsigned short numrows;
	unsigned short numcols;
	unsigned char center;
	double xmin;
	double ymin;
	short interm_grid_created;
    simple_REGIONC_list *reg_first;
    simple_REGIONC_list *reg_last;
	simple_REGIONC_list *reg_curr;

	pinpgrid = Parameters ("INPUT_GRID")->asGrid();
	bingrid = Parameters ("FILTERED_MASK")->asGrid();
	filter = Parameters ("FILTER")->asBool();
	corners_centers = Parameters ("BORDER_PIXEL_CENTERS")->asBool();
	remove_marginal_regions = Parameters ("REMOVE_MARGINAL_REGIONS")->asBool();
	pOutlines = Parameters("OUTLINES")->asShapes();
	symb_grid = Parameters ("SYMBOLIC_IMAGE")->asGrid();
	CSG_String	sName = pOutlines->Get_Name();
	pOutlines->Destroy();
	pOutlines->Set_Name(sName);
	pOutlines->Add_Field(SG_T("ID"), SG_DATATYPE_Int);

	numrows=pinpgrid->Get_NY()+2;
	numcols=pinpgrid->Get_NX()+2;
//	xmin=pinpgrid->Get_XMin()-2*pinpgrid->Get_Cellsize();
//	ymin=pinpgrid->Get_YMin()-2*pinpgrid->Get_Cellsize();

	xmin=pinpgrid->Get_XMin();
	ymin=pinpgrid->Get_YMin();

	unsigned char **bin_image;
	long **symb_image;

	if (corners_centers)
		center = 1;
	else
		center = 0;

	bin_image = (unsigned char **) matrix_all_alloc (numrows, numcols, 'U', 0);
	symb_image = (long **) matrix_all_alloc (numrows, numcols, 'L', 0);

	interm_grid_created = 0;

	//SG_Free(bin_image);
	//CSG_Grid *pTmp = new CSG_Grid();
	//delete pTmp;

	if (filter)
	{
		if (bingrid == NULL)
		{
			SG_UI_Msg_Add(_TL("Filtered mask will be created automatically ..."), true);

			bingrid = SG_Create_Grid(SG_DATATYPE_Char,
				                     pinpgrid->Get_NX(),
									 pinpgrid->Get_NY(),
									 pinpgrid->Get_Cellsize(),
									 pinpgrid->Get_XMin(),
									 pinpgrid->Get_YMin());

			if (bingrid == NULL)
			{
				SG_UI_Msg_Add_Error(_TL("Unable to create filtered mask grid!"));
	            matrix_all_free ((void **) bin_image);
	            matrix_all_free ((void **) symb_image);

				return (false);
			}

			Parameters("FILTERED_MASK")->Set_Value(bingrid);
			interm_grid_created = 1;
		}


		//-----------------------------------------------------
		RUN_MODULE("grid_filter"			, 13,
				SET_PARAMETER("INPUT_GRID"  , pinpgrid)
			&&	SET_PARAMETER("OUTPUT_GRID"	, bingrid)
			&&	SET_PARAMETER("RADIUS"		, Parameters ("SIZE")->asInt())
		)

		hgrid = bingrid;
	}
	else
	{
	    hgrid = pinpgrid;
	}

    for (int y = 0; y < hgrid->Get_NY () && Set_Progress(y, hgrid->Get_NY()); y++)
	{
	    for (int x = 0; x < hgrid->Get_NX(); x++)
		{
            if (hgrid->is_NoData(x,y))
		        bin_image[y+1][x+1] = 0;
			else
		        bin_image[y+1][x+1] = hgrid->asChar(x,y);
		}
	}


	// Here the regions are removed which have contact with the image margins;
	// this is achieved by a region growing

	if (remove_marginal_regions)
	{
		for (int y = 1; y < numrows - 1; y++)
		{
			if (bin_image [y][1] != 0)
				background_region_growing (bin_image, numrows, numcols, y, 1);

			if (bin_image [y][numcols - 2] != 0)
				background_region_growing (bin_image, numrows, numcols, y, numcols-2);
		}

		for (int x = 1; x < numcols - 1; x++)
		{
			if (bin_image [1][x] != 0)
				background_region_growing (bin_image, numrows, numcols, 1, x);

			if (bin_image [numrows-2][x] != 0)
				background_region_growing (bin_image, numrows, numcols, numrows-2, x);
		}

		if (filter)
		{
		    for (int y = 0; y < bingrid->Get_NY (); y++)
 	        {
     		    #pragma omp parallel for
		        for (int x = 0; x < bingrid->Get_NX(); x++)
		        {
			        bingrid->Set_Value(x, y, bin_image[y+1][x+1]);
		        }
	        }
		}
	}

	if (interm_grid_created)
		bingrid->Destroy();


	// The function which does the proper work: 
	// computation of the symbolic image, construction of the border chains (shapes)
	
	comb_contour_region_marking (numrows,
                                 numcols,
                                 bin_image,
                                 symb_image,
                                 &reg_first,
                                 &reg_last,
                                 center);


	for (int y = 0; y < symb_grid->Get_NY () && Set_Progress(y, symb_grid->Get_NY()); y++)
 	{
		#pragma omp parallel for
		for (int x = 0; x < symb_grid->Get_NX(); x++)
		{
			symb_grid->Set_Value(x, y, symb_image[y+1][x+1]);
		}
	}


	// Here the shapes are generated

	int iPolygon;

	for (iPolygon = 0, reg_curr = reg_first; reg_curr != NULL; reg_curr = reg_curr -> next, iPolygon++)
	{
		CSG_Shape	*pShape = pOutlines->Add_Shape();

		pShape->Set_Value(0, iPolygon);		// set ID field (= first field in table) to polygon ID

		for (simple_PIXELC_list *pix_curr = reg_curr->first_pix; pix_curr != NULL; pix_curr = pix_curr->next)
		{
			TSG_Point point = symb_grid->Get_System().Get_Grid_to_World(pix_curr->col - 1, pix_curr->row - 1);
			pShape->Add_Point(point, 0);
		}

		int iHoles;
		simple_INNER_REGION_list *inner_curr;

		for (iHoles=0, inner_curr = reg_curr->inner_first;
			 iHoles < reg_curr->num_holes;
			 iHoles++, inner_curr = inner_curr->next)
		{
			for (simple_PIXELC_list *pix_curr = inner_curr->first_pix; pix_curr != NULL; pix_curr = pix_curr->next)
			{
				TSG_Point point = symb_grid->Get_System().Get_Grid_to_World(pix_curr->col - 1, pix_curr->row - 1);
				pShape->Add_Point(point, iHoles+1);
			}
		}

        if (!corners_centers)
            shift_shape (pShape, -Get_Cellsize()/2.0, -Get_Cellsize()/2.0);
	}

	matrix_all_free ((void **) bin_image);
	matrix_all_free ((void **) symb_image);
	free_regions (&reg_first, &reg_last);

	return( true );
}
bool Cbin_erosion_reconst::On_Execute(void)
{
	CSG_Grid *pinpgrid, *bingrid, *poutgrid;

	unsigned short numrows;
	unsigned short numcols;
	char **mask;
	char **marker;

	pinpgrid = Parameters ("INPUT_GRID")->asGrid ();
	poutgrid = Parameters ("OUTPUT_GRID")->asGrid ();

	numrows=pinpgrid->Get_NY();
	numcols=pinpgrid->Get_NX();

	// bingrid is not an output grid here, so it must be created ad hoc

	bingrid = SG_Create_Grid(SG_DATATYPE_Char,
	                         pinpgrid->Get_NX(),
							 pinpgrid->Get_NY(),
							 pinpgrid->Get_Cellsize(),
							 pinpgrid->Get_XMin(),
							 pinpgrid->Get_YMin());

	if (bingrid == NULL)
	{
	    SG_UI_Msg_Add_Error(_TL("Unable to create grid for the eroded image!"));

		return (false);
	}

	RUN_TOOL("grid_filter"			, 8,
	       SET_PARAMETER("INPUT"		, pinpgrid)
	    && SET_PARAMETER("RESULT"		, bingrid)
	    && SET_PARAMETER("MODE"		, 1)
		&& SET_PARAMETER("RADIUS"		, Parameters ("RADIUS")->asInt())
		&& SET_PARAMETER("METHOD"		, 1)
    )

	mask = (char **) matrix_all_alloc (numrows, numcols, 'C', 0);
	marker = (char **) matrix_all_alloc (numrows, numcols, 'C', 0);

	for (int y = 0; y < numrows; y++)
	{
       #pragma omp parallel for
       for (int x = 0; x < numcols; x++)
       {
		  if (pinpgrid->is_NoData(x,y)) // check if there are no_data in input datasets
		  {
		 	 mask [y][x] = 0;
		 	 marker [y][x] = 0;
		  }
		  else
		  {
			 mask [y][x] = pinpgrid->asChar(x,y);
			 marker [y][x] = bingrid->asChar(x,y);
		  }
       }
	}

	bingrid->Destroy();

    binary_geodesic_morphological_reconstruction (numrows, numcols, mask, marker);

    for (int y = 0; y < Get_NY () && Set_Progress(y, Get_NY()); y++)
    {
	    #pragma omp parallel for
	    for (int x = 0; x < Get_NX (); x++)
	    {
		    if (pinpgrid->is_NoData(x,y))
		        poutgrid->Set_NoData(x,y);
		    else
		        poutgrid->Set_Value(x,y, marker[y][x]);
	    }
    }


	matrix_all_free ((void **) mask);
    matrix_all_free ((void **) marker);

    return( true );
}
Exemplo n.º 4
0
bool Ckff_synthesis::On_Execute(void)
{
	CSG_Grid *poutgrid;

	int numlat = 0;
	int numlong = 0;
	int maxdegree = 0;
	int mindegree = 0;
	int rc = 0;
	double inc = 0.0;
	double lat_start = 0.0;
	double end_lat = 0.0;
	double long_start = 0.0;
	double end_long = 0.0;
	CSG_String fileName;
    double **c_lm;
	double **s_lm;
	double **gitter;
	char *error_liste = "nix";

	//poutgrid = Parameters ("OUTPUT GRID")->asGrid ();

	fileName	= Parameters("FILE")->asString();
	inc = Parameters ("INC")->asDouble ();
	mindegree = Parameters ("MINDEGREE")->asInt ();
	maxdegree = Parameters ("MAXDEGREE")->asInt ();
	lat_start = Parameters ("LAT_START")->asDouble ();
	end_lat = Parameters ("END_LAT")->asDouble ();
	long_start = Parameters ("LONG_START")->asDouble ();
	end_long = Parameters ("END_LONG")->asDouble ();

	numlat = static_cast <int> (floor ((end_lat - lat_start) / inc) + 1);
	numlong = static_cast <int> (floor ((end_long - long_start) / inc) + 1);
	gitter = (double **) matrix_all_alloc (numlat, numlong, 'D', 0);

	read_coefficients (fileName.b_str(),
		               mindegree,
                       maxdegree,
                       &c_lm,
                       &s_lm);


	rc = kff_synthese_regel_gitter_m (inc,
                                    lat_start,
                                    end_lat,
                                    long_start,
									end_long,
									numlat,
									numlong,
                                    'A',
                                    mindegree,
                                    maxdegree,
                                    c_lm,
                                    s_lm,
                                    gitter,
                                    &error_liste);

	poutgrid	= SG_Create_Grid(SG_DATATYPE_Double, numlong, numlat, inc, long_start, lat_start);
	poutgrid	->Set_Name(_TL("Synthesized Grid"));

	for (int y = 0; y < numlat; y++)
	{
		#pragma omp parallel for
       for (int x = 0; x < numlong; x++)
       {
		    poutgrid->Set_Value(x,y, gitter[y][x]);
	   }
   }

   Parameters("OUTPUT_GRID")->Set_Value(poutgrid);

   matrix_all_free ((void **) gitter);
   matrix_all_free ((void **) c_lm);
   matrix_all_free ((void **) s_lm);

   return( true );
}