⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 segmenterms.h

📁 这是一个分水岭程序
💻 H
字号:
// SegmenterMS.h: interface for the SegmenterMS class.
// from《Robust Analysis of Feature Spaces》
// author:Dorin Comaniciu & Peter Meer
// Source is available from
// http://www.caip.rutgers.edu/~meer/RIUL/uploads.html
// which is an alpha version of the code and works with ppm images only.
// I edited it a little, so that it can now run in VC,
// and a single independent class, and support some other format, etc.
// by dzj, 04.07.02
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_SEGMENTERMS_H__C6BA7DBA_3725_44D6_B9AE_BF92A2B59DBB__INCLUDED_)
#define AFX_SEGMENTERMS_H__C6BA7DBA_3725_44D6_B9AE_BF92A2B59DBB__INCLUDED_

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

/*
class SegmenterMS  
{
public:
SegmenterMS();
virtual ~SegmenterMS();

  };
*/
//Color Image Segmentation
//This is the implementation of the algorithm described in 
//D. Comaniciu, P. Meer, 
//Robust Analysis of Feature Spaces: Color Image Segmentation,
//http://www.caip.rutgers.edu/~meer/RIUL/PAPERS/feature.ps.gz
//appeared in Proceedings of CVPR'97, San Juan, Puerto Rico.
// ===========================================================================
// =====      Module: segm_hh
// ===== -------------------------------------------------------------- ======
// =====      Version 01   Date: 04/22/97
// ===== -------------------------------------------------------------- ======
// ===========================================================================
// =====      Written by Dorin Comaniciu
// =====      e-mail:  comanici@caip.rutgers.edu
// ===========================================================================
// Permission to use, copy, or modify this software and its documentation
// for educational and research purposes only is hereby granted without
// fee, provided that this copyright notice appear on all copies and
// related documentation.  For any other uses of this software, in original
// or modified form, including but not limited to distribution in whole
// or in part, specific prior permission must be obtained from
// the author(s).
//
// THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
// EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
// WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
//
// IN NO EVENT SHALL RUTGERS UNIVERSITY BE LIABLE FOR ANY SPECIAL,
// INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY
// DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
// WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY
// THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE
// OR PERFORMANCE OF THIS SOFTWARE.
// ===========================================================================
//


#include <assert.h>
#define         ORG_SIZE

#define		DEBUG

//#define	TRACE

#define         Max_rects       50

#define MIN(x,y)         ((x) <= (y) ? (x) : (y))
#define Min3(x,y,z)      (MIN((x),(y)) <= (z) ? MIN((x),(y)) : (z))

#  include <memory.h>
#  define       bzero(b,len)            memset(b,'\0',len)
#  define       bcopy(b1,b2,len)        memmove(b2,b1,len)

typedef char Boolean;		// copied from <X11/Intrinsic.h>
typedef unsigned char Octet;

#define false 0
#define true !false
#define nil 0

class XfRaster {
public:
    XfRaster() { };
    ~XfRaster() { };
	
    struct Info {
        int rows;
        int columns;
        int origin_x;
        int origin_y;
    };
};

enum DataType {			// Values of data type:
	eDATA_OCTET  =  10,	// unsigned char data
        eDATA_FLOAT		// floating point data
};


class RasterIpChannels : public XfRaster {
public:
	
    RasterIpChannels(
		const XfRaster::Info& info, const int n_channels,
		const DataType, Octet* data[], const Boolean
		);
    ~RasterIpChannels();
	
    Octet**	chdata() const;
    Octet*	chdata(int i) const;
    int		n_channels() const;
    DataType	dtype() const;
    void	clipf(Boolean cf);
    Boolean	clipf() const;
	
    void raster_info(Info& i);
    static unsigned char** raster_float_to_Octet( RasterIpChannels& ras );
	
    int		rows_;
    int		columns_;
    DataType	dtype_;
    Octet**	chdata_;
    int		n_channels_;
    Boolean	clipf_;// flag that determines wheter to clip or not
				//   when converting from eDATA_FLOAT to Octet
};

inline Octet** RasterIpChannels::chdata() const   { return chdata_; }
inline Octet* RasterIpChannels::chdata(int i) const {
    assert((0 <= i) && (i < n_channels_));
    return chdata_[i];
}

inline int RasterIpChannels::n_channels() const   { return n_channels_; }
inline DataType RasterIpChannels::dtype() const   { return dtype_; }
inline void RasterIpChannels::clipf(Boolean cf)   { clipf_ = cf; }
inline Boolean RasterIpChannels::clipf() const   { return clipf_; }

const int	p_max	      =	3;	// max space dim;  MAX(p_max) == 6 !!

typedef struct region_str
{
	int my_contor;
	int my_class;
	int my_label;
	int *my_region;
	struct region_str *next_region_str;
}REGION;

class SegmenterMS {
	
public:
	
	SegmenterMS( );
	~SegmenterMS();
	
	struct sRectangle {
		int x, y;				// upper left corner
		unsigned int width, height;	        // rectangle dimensions
	};
	
	RasterIpChannels*	result_ras_;	// result of the visit to a raster
	BOOL*               result_contour; // mean shift contour, add by dzj;
	
	Boolean	ms_segment( RasterIpChannels*, sRectangle*, int, long,
		unsigned int, Boolean);
	// add by dzj;
	Boolean write_Result_file( CString outfname, RasterIpChannels* signal );
	Boolean my_write_Contour_file( CString outfname, Octet* signal, int _rows, int _colms );//输出结果轮廓图像;
    void SaveContour2Buf(Octet* signal, int _rows, int _colms);//保存结果轮廓
	RasterIpChannels* read_IMG_file( CString filename );
	
	protected:
		
		int		_p;		// parameter space dimension
		int		_p_ptr;		// counter for the number of components already
		// stored in _data_all
		int**	        _data_all;	// input data
		int*_data0,*_data1,*_data2;   //to speed up
		
		int		_colms, _rows;	// width, height dimensions of the input data
		int           _ro_col;        // how many points in input data
		int**         _data;		// region of the input data currently segmented
		int		_rcolms, _rrows;// width, height dimensions of the region
		int		_n_points;	// number of data points (per channel)
		float		_min_per;       // minimum/maximum cluster size
		int		_NJ;		// maximum number of subsamples
		Boolean       auto_segm;
		int*          gen_remain;     //the map of remaining points            
		Octet*        gen_class;      //labels
		Octet*        taken;
		int*          conn_selected;  //used by connected component
		int           n_remain;       //# of remaining points 
		int           _n_colors;      //# of colors
		int**         _col_all;       //colors in the image (LUV)
		int*_col0,*_col1,*_col2;      //to speed up
		int *         _col_RGB;       //colors in the image (RGB)
		int *         _col_index;     //color address
		int *         _col_misc;      //misc use in histogram and conversion
		int*          _m_colors;      //how many of each color
		
		int*          _col_remain;    //the map of remaining colors 
		int*          _m_col_remain;  //table of remaining colors
		int           _n_col_remain;  //# of remaining colors
		
		void convert_RGB_LUV( RasterIpChannels* , long );
		void cut_rectangle( sRectangle* );
		void init_matr(void);
		float my_sampling( int, float T[Max_rects][p_max]);
		int  subsample( float* );
		void test_neigh(Octet* , int *, int*, int);
		void my_actual(Octet*);
		void init_neigh(void);
		void conn_comp(Octet *, int* , Octet* ,float [] [p_max],int,int);
		void find_other_neigh(int, int *, REGION *);
		void new_auto_loop(float *, Octet*);
		void nauto_loop(float *, int *, Octet *, int *); 
		void optimize(float [][p_max], int);
		void get_codeblock(float [][p_max], int);
		void get_codeblock1(float [][p_max], int);
		void new_codebook(float [][p_max], int);
		void my_clean(float [][p_max], int);
		void my_histogram(RasterIpChannels*, long);
		void eliminate_class(Octet *,int *,int *,int, Octet *, float [][p_max],REGION *);
		void eliminate_region(int *,int,float [][p_max],REGION *);
		void destroy_region_list(REGION *);
		REGION *create_region_list(int *, int);
		void initializations(RasterIpChannels*, sRectangle [], int *, long , int *);
		
		//new add
		int test_same_cluster(int rect, float T[][p_max]);// Test if the clusters have the same mean
		void reverse_map(Octet *inv_map, Octet *my_map, int *n_rects, Octet *valid_class, float T[][p_max]);// Inverse of the mapping array used in color elimination
		void mean_s(const int N, const int p, int J[], int **data, float T[]);// Compute the mean of N points given by J[]
		void covariance_w(const int N, int M, const int p,  int **data
			, int *w, float T[], float C[p_max][p_max]);// Compute the weighted covariance of N points 
		void set_RADIUS(int gen_gen_contor, int final);// Set the Radius of the window
		void my_convert(int selects, float *final_T, int *TI);// LUV (final_T[]) to RGB (TI[]) conversion
};

// List of color components; the possible cases are:

#define RedColor		(1<<0)
#define GreenColor		(1<<1)
#define BlueColor		(1<<2)
#define Lightness		(1<<3)
#define Ustar   		(1<<4)
#define Vstar   		(1<<5)

#define MAXV 256

#endif // !defined(AFX_SEGMENTERMS_H__C6BA7DBA_3725_44D6_B9AE_BF92A2B59DBB__INCLUDED_)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -