code2

// msImageProcessor.h: interface for the msImageProcessor class.
//
//

#if !defined(AFX_MSIMAGEPROCESSOR_H__55169B04_4FDC_4B19_8920_006B81E67ECA__INCLUDED_)
#define AFX_MSIMAGEPROCESSOR_H__55169B04_4FDC_4B19_8920_006B81E67ECA__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#include "MeanShift.h"

//include prototypes of additional strucuters
//used for image segmentation...

//include region list used to store boundary pixel
//indeces for each region
#include	"RegionList.h"

//include region adjacency list class used for
//region pruning and transitive closure
#include	"RAList.h"

//define constants

	//image pruning
#define	TOTAL_ITERATIONS	14
#define BIG_NUM				0xffffffff	//BIG_NUM = 2^32-1
#define NODE_MULTIPLE		10

	//data space conversion...
const double Xn			= 0.95050;
const double Yn			= 1.00000;
const double Zn			= 1.08870;
//const double Un_prime	= 0.19780;
//const double Vn_prime	= 0.46830;
const double Un_prime	= 0.19784977571475;
const double Vn_prime	= 0.46834507665248;
const double Lt			= 0.008856;

	//RGB to LUV conversion
const double XYZ[3][3] = {	{  0.4125,  0.3576,  0.1804 },
							{  0.2125,  0.7154,  0.0721 },
							{  0.0193,  0.1192,  0.9502 }	};

	//LUV to RGB conversion
const double RGB[3][3] = {	{  3.2405, -1.5371, -0.4985 },
							{ -0.9693,  1.8760,  0.0416 },
							{  0.0556, -0.2040,  1.0573 }	};

//define data types
typedef unsigned char byte;

//define enumerations
enum imageType {GRAYSCALE, COLOR};

//define prototype
class msImageProcessor: public MeanShift {

public:

  /*/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\*/
  /* Class Constructor and Destructor */
  /*\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/*/

  msImageProcessor( void );        //Default Constructor
 ~msImageProcessor( void );        //Class Destructor

 /*/\/\/\/\/\/\/\/\/\/\/\/\/\*/
 /* Input Image Declaration  */
 /*\/\/\/\/\/\/\/\/\/\/\/\/\/*/

  //--\\||//--\\||//--\\||//--\\||//--\\||//--\\||//--\\||//
  //<--------------------------------------------------->|//
  //|                                                    |//
  //|	Method Name:								     |//
  //|   ============								     |//
  //|				  * Define Image *                   |//
  //|                                                    |//
  //<--------------------------------------------------->|//
  //|                                                    |//
  //|	Description:								     |//
  //|	============								     |//
  //|                                                    |//
  //|   Uploads an image to be segmented by the image    |//
  //|   segmenter class.                                 |//
  //|                                                    |//
  //|   An image is defined by specifying the folloing:  |//
  //|                                                    |//
  //|   <* data *>                                       |//
  //|   A one dimensional unsigned char array of RGB     |//
  //|   vectors.                                         |//
  //|                                                    |//
  //|   <* type *>                                       |//
  //|   Specifies the image type: COLOR or GREYSCALE.    |//
  //|                                                    |//
  //|   <* height *>                                     |//
  //|   The image height.                                |//
  //|                                                    |//
  //|   <* width *>                                      |//
  //|   The image width.                                 |//
  //|                                                    |//
  //|   This method uploads the image and converts its   |//
  //|   data into the LUV space. If another conversion   |//
  //|   is desired data may be uploaded into this class  |//
  //|   via the procedure MeanShift::UploadInput().      |//
  //|                                                    |//
  //<--------------------------------------------------->|//
  //|                                                    |//
  //|	Usage:      								     |//
  //|   ======      								     |//
  //|		DefineImage(data, type, height, width)       |//
  //|                                                    |//
  //<--------------------------------------------------->|//
  //--\\||//--\\||//--\\||//--\\||//--\\||//--\\||//--\\||//

  void DefineImage(byte*,imageType, int, int);
  void DefineBgImage(byte*, imageType , int , int );


 /*/\/\/\/\/\/\*/
 /* Weight Map */
 /*\/\/\/\/\/\/*/

  //--\\||//--\\||//--\\||//--\\||//--\\||//--\\||//--\\||//
  //<--------------------------------------------------->|//
  //|                                                    |//
  //|	Method Name:								     |//
  //|   ============								     |//
  //|			     * Set Weight Map *                  |//
  //|                                                    |//
  //<--------------------------------------------------->|//
  //|                                                    |//
  //|	Description:								     |//
  //|	============								     |//
  //|                                                    |//
  //|   Uploads weight map specifying for each pixel     |//
  //|   in the image a value between 0 and 1 - 1 indica- |//
  //|   ting the presence of an edge and 0 the absense   |//
  //|   of an edge.                                      |//
  //|                                                    |//
  //|   The arguments to this method are:                |//
  //|                                                    |//
  //|   <* weightMap *>                                  |//
  //|   A floating point array of size (height x width)  |//
  //|   specifying at location (i,j) the edge strength   |//
  //|   of pixel (i,j). (e.g. pixel (i,j) has an edge    |//
  //|   strength of weightMap[j*width+i]).               |//
  //|                                                    |//
  //|   <* epsilon *>                                    |//
  //|   A floating point number specifying the threshold |//
  //|   used to fuse regions during transitive closure.  |//
  //|                                                    |//
  //|   Note: DefineImage must be called prior to call-  |//
  //|         ing this method. DefineImage is used to    |//
  //|         define the dimensions of the image.        |//
  //|                                                    |//
  //<--------------------------------------------------->|//
  //|                                                    |//
  //|	Usage:      								     |//
  //|   ======      								     |//
  //|		SetWeightMap(weightMap, epsilon)             |//
  //|                                                    |//
  //<--------------------------------------------------->|//
  //--\\||//--\\||//--\\||//--\\||//--\\||//--\\||//--\\||//

  void SetWeightMap(float*, float);

  //--\\||//--\\||//--\\||//--\\||//--\\||//--\\||//--\\||//
  //<--------------------------------------------------->|//
  //|                                                    |//
  //|	Method Name:								     |//
  //|   ============								     |//
  //|			   * Remove Weight Map *                 |//
  //|                                                    |//
  //<--------------------------------------------------->|//
  //|                                                    |//
  //|	Description:								     |//
  //|	============								     |//
  //|                                                    |//
  //|   Removes weight map. An error is NOT flagged      |//
  //|   if a weight map was not defined prior to calling |//
  //|   this method.                                     |//
  //|                                                    |//
  //<--------------------------------------------------->|//
  //|                                                    |//
  //|	Usage:      								     |//
  //|   ======      								     |//
  //|		RemoveWeightMap(void)                        |//
  //|                                                    |//
  //<--------------------------------------------------->|//
  //--\\||//--\\||//--\\||//--\\||//--\\||//--\\||//--\\||//

  void RemoveWeightMap(void);

 /*/\/\/\/\/\/\/\/\/\*/
 /* Image Filtering  */
 /*\/\/\/\/\/\/\/\/\/*/

  //--\\||//--\\||//--\\||//--\\||//--\\||//--\\||//--\\||//
  //<--------------------------------------------------->|//
  //|                                                    |//
  //|	Method Name:								     |//
  //|   ============								     |//
  //|                   *  Filter  *                     |//
  //|                                                    |//
  //<--------------------------------------------------->|//
  //|                                                    |//
  //|	Description:								     |//
  //|	============								     |//
  //|                                                    |//
  //|   Apply mean shift filter to the defined image,    |//
  //|   defined either via MeanShift::DefineLInput or    |//
  //|   msImageProcessor::DefineImage. The resulting     |//
  //|   segmented image is stored in the private data    |//
  //|   members of the image segmenter class which can   |//
  //|   be obtained by calling image msImageProcessor::  |//
  //|   GetResults().                                    |//
  //|                                                    |//
  //|   The arguments to this method are:                |//
  //|                                                    |//
  //|   <* sigmaS *>                                     |//
  //|   The spatial radius of the mean shift window.     |//
  //|                                                    |//
  //|   <* sigmaR *>                                     |//
  //|   The range radius of the mean shift window.       |//
  //|                                                    |//
  //|   <* speedUpLevel *>                               |//
  //|   Determines if a speed up optimization should be  |//
  //|   used to perform image filtering. A value of      |//
  //|   NO_SPEEDUP turns this optimization off and a     |//
  //|   value of SPEEDUP turns this optimization on.     |//
  //|                                                    |//
  //<--------------------------------------------------->|//
  //|                                                    |//
  //|	Usage:      								     |//
  //|   ======      								     |//
  //|		Filter(sigmaS, sigmaR, speedUpLevel)         |//
  //|                                                    |//
  //<--------------------------------------------------->|//
  //--\\||//--\\||//--\\||//--\\||//--\\||//--\\||//--\\||//

  void Filter(int, float, SpeedUpLevel);

 /*/\/\/\/\/\/\/\/\/\/\/\*/
 /* Image Region Fusing  */
 /*\/\/\/\/\/\/\/\/\/\/\/*/

  //--\\||//--\\||//--\\||//--\\||//--\\||//--\\||//--\\||//
  //<--------------------------------------------------->|//
  //|                                                    |//
  //|	Method Name:								     |//
  //|   ============								     |//
  //|				  *  Fuse Regions  *                 |//
  //|                                                    |//
  //<--------------------------------------------------->|//
  //|                                                    |//
  //|	Description:								     |//
  //|	============								     |//
  //|                                                    |//
  //|   Fuses the regions of a filtered image,           |//
  //|   defined either via MeanShift::DefineLInput or    |//
  //|   msImageProcessor::DefineImage. The resulting     |//
  //|   segmented image is stored in the private data    |//
  //|   members of the image segmenter class which can   |//
  //|   be obtained by calling image msImageProcessor::  |//
  //|   GetResults().                                    |//
  //|                                                    |//
  //|   The arguments to this method are:                |//
  //|                                                    |//
  //|   <* sigmaR *>                                     |//
  //|   The range radius that defines similar color      |//
  //|   amongst image regions.                           |//
  //|                                                    |//
  //|   <* minRegion *>                                  |//
  //|   The minimum density a region may have in the     |//
  //|   resulting segmented image. All regions have      |//
  //|   point density < minRegion are pruned from the    |//
  //|   image.                                           |//
  //|                                                    |//
  //<--------------------------------------------------->|//
  //|                                                    |//
  //|	Usage:      								     |//
  //|   ======      								     |//
  //|		FuseRegions(sigmaR, minRegion)               |//
  //|                                                    |//
  //<--------------------------------------------------->|//
  //--\\||//--\\||//--\\||//--\\||//--\\||//--\\||//--\\||//

  void FuseRegions(float, int);

 /*/\/\/\/\/\/\/\/\/\/\*/
 /* Image Segmentation */
 /*\/\/\/\/\/\/\/\/\/\/*/

  //--\\||//--\\||//--\\||//--\\||//--\\||//--\\||//--\\||//
  //<--------------------------------------------------->|//
  //|                                                    |//
  //|	Method Name:								     |//
  //|   ============								     |//
  //|				     *  Segment  *                   |//
  //|                                                    |//
  //<--------------------------------------------------->|//
  //|                                                    |//
  //|	Description:								     |//
  //|	============								     |//
  //|                                                    |//
  //|   Segments the defined image, defined either via   |//
  //|   MeanShift::DefineLInput or msImageProcessor::De- |//
  //|   fineImage. The resulting segmented image is      |//
  //|   stored in the private data members of the image  |//
  //|   processor class which can be obtained by calling |//
  //|   ImageSegmenter::GetResults().                    |//
  //|                                                    |//
  //|   The arguments to this method are:                |//
  //|                                                    |//
  //|   <* sigmaS *>                                     |//
  //|   The spatial radius of the mean shift window.     |//
  //|                                                    |//
  //|   <* sigmaR *>                                     |//
  //|   The range radius of the mean shift window.       |//
  //|                                                    |//
  //|   <* minRegion *>                                  |//
  //|   The minimum density a region may have in the     |//
  //|   resulting segmented image. All regions have      |//
  //|   point density < minRegion are pruned from the    |//
  //|   image.                                           |//
  //|                                                    |//
  //|   <* speedUpLevel *>                               |//
  //|   Determines if a speed up optimization should be  |//
  //|   used to perform image filtering. A value of      |//
  //|   NO_SPEEDUP turns this optimization off and a     |//
  //|   value of SPEEDUP turns this optimization on.     |//
  //|                                                    |//
  //<--------------------------------------------------->|//
  //|                                                    |//
  //|	Usage:      								     |//
  //|   ======      								     |//
  //|		Segment(sigmaS, sigmaR, minRegion,           |//
  //|                       speedUpLevel)                |//
  //|                                                    |//
  //<--------------------------------------------------->|//
  //--\\||//--\\||//--\\||//--\\||//--\\||//--\\||//--\\||//
 
  void Segment(int, float, int, SpeedUpLevel);

  /*/\/\/\/\/\/\/\/\/\/\/\/\*/
  /* Data Space Conversion  */
  /*\/\/\/\/\/\/\/\/\/\/\/\/*/

  //--\\||//--\\||//--\\||//--\\||//--\\||//--\\||//--\\||//
  //<--------------------------------------------------->|//
  //|                                                    |//
  //|	Method Name:								     |//
  //|   ============								     |//
  //|				 *  RGB To LUV  *                    |//
  //|                                                    |//
  //<--------------------------------------------------->|//
  //|                                                    |//
  //|	Description:								     |//
  //|	============								     |//
  //|                                                    |//
  //|   Converts an RGB vector to LUV.                   |//
  //|                                                    |//
  //|   The arguments to this method are:                |//
  //|                                                    |//
  //|   <* rgbVal *>                                     |//
  //|   An unsigned char array containing the RGB        |//
  //|   vector.                                          |//
  //|                                                    |//
  //|   <* luvVal *>                                     |//
  //|   A floating point array containing the LUV        |//
  //|   vector.                                          |//
  //|                                                    |//
  //<--------------------------------------------------->|//
  //|                                                    |//
  //|	Usage:      								     |//
  //|   ======      								     |//
  //|		RGBtoLUV(rgbVal, luvVal)                     |//
  //|                                                    |//
  //<--------------------------------------------------->|//
  //--\\||//--\\||//--\\||//--\\||//--\\||//--\\||//--\\||//

  void RGBtoLUV(byte*, float*);

  //--\\||//--\\||//--\\||//--\\||//--\\||//--\\||//--\\||//
  //<--------------------------------------------------->|//
  //|                                                    |//
  //|	Method Name:								     |//
  //|   ============								     |//
  //|				 *  LUV To RGB  *                    |//
  //|                                                    |//
  //<--------------------------------------------------->|//
  //|                                                    |//
  //|	Description:								     |//
  //|	============								     |//
  //|                                                    |//
  //|   Converts an LUV vector to RGB.                   |//
  //|                                                    |//
  //|   The arguments to this method are:                |//
  //|                                                    |//
  //|   <* luvVal *>                                     |//
  //|   A floating point array containing the LUV        |//
  //|   vector.                                          |//
  //|                                                    |//
  //|   <* rgbVal *>                                     |//
  //|   An unsigned char array containing the RGB        |//
  //|   vector.                                          |//
  //|                                                    |//
  //<--------------------------------------------------->|//
  //|                                                    |//
  //|	Usage:      								     |//
  //|   ======      								     |//
  //|		LUVtoRGB(luvVal, rgbVal)                     |//
  //|                                                    |//
  //<--------------------------------------------------->|//
  //--\\||//--\\||//--\\||//--\\||//--\\||//--\\||//--\\||//

  void LUVtoRGB(float*, byte*);

  /*/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\*/
  /*  Filtered and Segmented Image Output */
  /*\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/*/

  //--\\||//--\\||//--\\||//--\\||//--\\||//--\\||//--\\||//
  //<--------------------------------------------------->|//
  //|                                                    |//
  //|	Method Name:								     |//
  //|   ============								     |//
  //|			      *  Get Raw Data  *                 |//
  //|                                                    |//
  //<--------------------------------------------------->|//
  //|                                                    |//
  //|	Description:								     |//
  //|	============								     |//
  //|                                                    |//
  //|   Returns the resulting filtered or segmented im-  |//
  //|   age data after calling Filter() or Segment().    |//
  //|                                                    |//
  //|   The arguments to this method are:                |//
  //|                                                    |//
  //|   <* outputImageData *>                            |//
  //|   A floating point array containing the vector     |//
  //|   data of the filtered or segmented image.         |//
  //|                                                    |//
  //|   NOTE: If DefineImage was used to specify the     |//
  //|         the input to this class, outputImageData   |//
  //|         is in the LUV data space.                  |//
  //|                                                    |//
  //<--------------------------------------------------->|//
  //|                                                    |//
  //|	Usage:      								     |//
  //|   ======      								     |//
  //|		GetRawData(outputImageData)                  |//
  //|                                                    |//
  //<--------------------------------------------------->|//
  //--\\||//--\\||//--\\||//--\\||//--\\||//--\\||//--\\||//

  void GetRawData(float*);

  //--\\||//--\\||//--\\||//--\\||//--\\||//--\\||//--\\||//
  //<--------------------------------------------------->|//
  //|                                                    |//
  //|	Method Name:								     |//
  //|   ============								     |//
  //|				 *  Get Results  *                   |//
  //|                                                    |//
  //<--------------------------------------------------->|//
  //|                                                    |//
  //|	Description:								     |//
  //|	============								     |//
  //|                                                    |//
  //|   Returns the resulting filtered or segmented im-  |//
  //|   age after calling Filter() or Segment().         |//
  //|                                                    |//
  //|   The arguments to this method are:                |//
  //|                                                    |//
  //|   <* outputImage *>                                |//
  //|   An unsigned char array containing the RGB        |//
  //|   vector data of the output image.                 |//
  //|                                                    |//
  //|   To obtain the un-converted (LUV) data space      |//
  //|   output one may use                               |//
  //|   msImageProcessor::GetRawData().                  |//
  //<--------------------------------------------------->|//
  //|                                                    |//
  //|	Usage:      								     |//
  //|   ======      								     |//
  //|		GetResults(outputImage)                      |//
  //|                                                    |//
  //<--------------------------------------------------->|//
  //--\\||//--\\||//--\\||//--\\||//--\\||//--\\||//--\\||//

  void GetResults(byte*);

  //--\\||//--\\||//--\\||//--\\||//--\\||//--\\||//--\\||//
  //<--------------------------------------------------->|//
  //|                                                    |//
  //|	Method Name:								     |//
  //|   ============								     |//
  //|				 *  Get Boundaries  *                |//
  //|                                                    |//
  //<--------------------------------------------------->|//
  //|                                                    |//
  //|	Description:								     |//
  //|	============								     |//
  //|                                                    |//
  //|   Returns the boundaries of each region of the     |//
  //|   segmented image using a region list object,      |//
  //|   available after filtering or segmenting the      |//
  //|   defined image.                                   |//
  //|                                                    |//
  //<--------------------------------------------------->|//
  //|                                                    |//
  //|	Usage:      								     |//
  //|   ======      								     |//
  //|		regionList = GetBoundaries()                 |//
  //|                                                    |//
  //<--------------------------------------------------->|//
  //--\\||//--\\||//--\\||//--\\||//--\\||//--\\||//--\\||//

  RegionList *GetBoundaries( void );

  //--\\||//--\\||//--\\||//--\\||//--\\||//--\\||//--\\||//
  //<--------------------------------------------------->|//
  //|                                                    |//
  //|	Method Name:								     |//
  //|   ============								     |//
  //|			        * Get Regions *                  |//
  //|                                                    |//
  //<--------------------------------------------------->|//
  //|                                                    |//
  //|	Description:								     |//
  //|	============								     |//
  //|                                                    |//
  //|   Returns the regions of the processed image.      |//
  //|   Each region in the image is uniquely character-  |//
  //|   ized by its location and color (e.g. RGB).       |//
  //|   GetRegions() therefore returns the following     |//
  //|   information about the regions of the processed   |//
  //|   image:                                           |//
  //|                                                    |//
  //|   <* regionCount *>                                |//
  //|   An integer that specifies the number of regions  |//
  //|   contained in the processed image.                |//
  //|                                                    |//
  //|   <* modes *>                                      |//
  //|   A floating point array of length regionCount*N   |//
  //|   containing the feature space component of each   |//
  //|   region (e.g. LUV), and indexed by region label.  |//
  //|                                                    |//
  //|   <* labels *>                                     |//
  //|   An integer array of length (height*width) which  |//
  //|   contains at every pixel location (x,y) a label   |//
  //|   relating that pixel to a region whose mode is    |//
  //|   specified by modes and whose area is specified   |//
  //|   by modePointCounts.                              |//
  //|                                                    |//
  //|   <* modePointCounts *>                            |//
  //|   An integer array of length regionCount and ind-  |//
  //|   exed by region label, that specifies the region  |//
  //|   area (in pixels) for each segmented image reg-   |//
  //|   ion. (e.g. Area of region having label specif-   |//
  //|   ified by l, has area modePointCounts[l] (pix-    |//
  //|   els).)                                           |//
  //|                                                    |//
  //|   NOTE: Memory for the above integer and floating  |//
  //|         point arrays is allocated inside this      |//
  //|         method.                                    |//
  //|                                                    |//
  //|         Also modes stored by the modes array are   |//
  //|         not in the RGB space. Instead if the       |//
  //|         method DefineImage was used, these data    |//
  //|         points are in the LUV space, and if the    |//
  //|         method DefineLInput was used these data    |//
  //|         points are in whatever space you specified |//
  //|         them to be in when calling DefineLInput.   |//
  //|                                                    |//
  //<--------------------------------------------------->|//
  //|                                                    |//
  //|	Usage:      								     |//
  //|   ======      								     |//
  //|		regionCount = GetRegions(labels, modes       |//
  //|                                modePointCounts)    |//
  //|                                                    |//
  //<--------------------------------------------------->|//
  //--\\||//--\\||//--\\||//--\\||//--\\||//--\\||//--\\||//

  int GetRegions(int**, float**, int**);


  void SetSpeedThreshold(float);
private:

  //========================
  // *** Private Methods ***
  //========================

	/*/\/\/\/\/\/\/\/\/\*/
	/*  Image Filtering */
	/*\/\/\/\/\/\/\/\/\/*/

	void NonOptimizedFilter(float, float);	// filters the image applying mean shift to each point
											// Advantage	: most accurate
											// Disadvantage	: time expensive
   void NewNonOptimizedFilter(float, float);

	void OptimizedFilter1(float, float);	// filters the image using previous mode information
											// to avoid re-applying mean shift to some data points
											// Advantage	: maintains high level of accuracy,
											//				  large speed up compared to non-optimized
											//				  version
											// Disadvantage	: POSSIBLY not as accurate as non-optimized
											//				  version
   void NewOptimizedFilter1(float, float);


	void OptimizedFilter2(float, float);	//filter the image using previous mode information
											//and window traversals to avoid re-applying mean shift to
											//some data points
											// Advantage	: huge speed up - maintains accuracy good enough
											//				  for segmentation
											// Disadvantage	: not as accurate as previous filters
   void NewOptimizedFilter2(float, float);



   /***********************************************华丽的分割线**************************************************/
	/*/\/\/\/\/\/\/\/\/\/\/\*/
	/* Image Classification */
	/*\/\/\/\/\/\/\/\/\/\/\/*/

	void Connect( void );					// classifies mean shift filtered image regions using
											// private classification structure of this class

	void Fill(int, int);					// used by Connect to perform label each region in the
											// mean shift filtered image using an eight-connected
											// fill

	/*/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\*/
	/* Transitive Closure and Image Pruning */
	/*\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/*/

	void BuildRAM( void );					// build a region adjacency matrix using the region list
											// object

	void DestroyRAM( void );				// destroy the region adjacency matrix: de-allocate its memory
											// initialize it for re-use

	void TransitiveClosure( void );			// use the RAM to apply transitive closure to the image modes

	void ComputeEdgeStrengths( void );		// computes the weights of the weighted graph using the weight
											// map

	//Usage: Prune(minRegion)
	void Prune(int);						// use the RAM to prune the image of spurious regions (regions
											// whose area is less than minRegion pixels, where minRegion is
											// an argument of this method)

	/*/\/\/\/\/\/\/\/\/\/\/\/\/\/\*/
	/*  Region Boundary Detection */
	/*\/\/\/\/\/\/\/\/\/\/\/\/\/\/*/

	void DefineBoundaries( void );			// defines the boundaries of each region using the classified segmented
											// image storing the resulting boundary locations for each region using
											// a region list object


	/***********************************************华丽的分割线**************************************************/
	/*/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\*/
	/*  Image Data Searching/Distance Calculation */
	/*\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/*/

	//Usage: InWindow(modeIndex1, modeIndex2)
	bool InWindow(int, int);				//returns true if the range data of the specified data points
											//are within the defined search window (defined by kernel
											//bandwidth h[1])

	float SqDistance(int, int);				// computes the normalized square distance between two modes 

	/*/\/\/\/\/\/\/\/\/\/\*/
	/* Memory Management  */
	/*\/\/\/\/\/\/\/\/\/\/*/

	void InitializeOutput( void );			//Allocates memory needed by this class to perform image
											//filtering and segmentation

	void DestroyOutput( void );				//De-allocates memory needed by this class to perform image
											//filtering and segmentation

  //=============================
  // *** Private Data Members ***
  //=============================

   //##########################################
   //#######    IMAGE CLASSIFICATION   ########
   //##########################################

	/Image Boundaries/
	RegionList		*regionList;			// stores the boundary locations for each region

	/Image Regions
	int				regionCount;			// stores the number of connected regions contained by the
											// image

	/8 Connected Neighbors/
	int				neigh[8];

	/Index Table/
	int				*indexTable;			//used during fill algorithm

	/LUV_data/
   //int            *LUV_data;           //stores modes in integer format on lattice
	float				*LUV_data;				//stores modes in float format on lattice
   float          LUV_treshold;        //in float mode this determines what "close" means between modes


   //##########################################
   //#######   OUTPUT DATA STORAGE     ########
   //##########################################

	Raw Data (1 to 1 correlation with input)
	float			*msRawData;				// Raw data output of mean shift algorithm
											// to the location of the data point on the lattice

	Data Modes
	int				*labels;				// assigns a label to each data point associating it to
											// a mode in modes (e.g. a data point having label l has
											// mode modes[l])

	float			*modes;					// stores the mode data of the input data set, indexed by labels
	// 存储模态点

	int				*modePointCounts;		// stores for each mode the number of point mapped to that mode,
											// indexed by labels

   //##########################################
   //#######  REGION ADJACENCY MATRIX  ########
   //##########################################

	//Region Adjacency List/
	RAList			*raList;				// an array of RAList objects containing an entry for each
											// region of the image

	//RAMatrix Free List///
	RAList			*freeRAList;			// a pointer to the head of a region adjacency list object
											// free list

	RAList			*raPool;				// a pool of RAList objects used in the construction of the
											// RAM

   //##############################################
   //#######  COMPUTATION OF EDGE STRENGTHS #######
   //##############################################

	//Epsilon///
	float			epsilon;				//Epsilon used for transitive closure

	//Visit Table//
	unsigned char	*visitTable;			//Table used to keep track of which pixels have been
											//already visited upon computing the boundary edge strengths

   //##########################################
   //#######       IMAGE PRUNING       ########
   //##########################################

	Transitive Closure/
	float			rR2;					//defines square range radius used when clustering pixels
											//together, thus defining image regions

   float speedThreshold; // the % of window radius used in new optimized filter 2.
};

#endif

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值