bool T_Closeness::SetRisk( const vector<EqvClass*>& rVecPtEqv, vector<float>& rVecRisk )
{
	long num_eqv = rVecPtEqv.size();
	long num_tuple = 0;
	long i;

	map<UnitValue, long>::const_iterator sv_pos;

	map<UnitValue, long> mapEqClsCnt = (rVecPtEqv[0])->m_mapSenCnt;
	for (sv_pos = (rVecPtEqv[0])->m_mapSenCnt.begin(); sv_pos != (rVecPtEqv[0])->m_mapSenCnt.end(); ++sv_pos)
	{
// 		map<UnitValue, long>::iterator temp_pos = mapEqClsCnt.find( (*sv_pos).first );
// 		if (temp_pos == mapEqClsCnt.end())
// 		{
// 			mapEqClsCnt.insert( *sv_pos );
// 		}
// 		else
// 		{
// 			(*temp_pos).second += (*sv_pos).second;
// 		}
		num_tuple += (*sv_pos).second;
	}

	for (i = 1; i < num_eqv; ++i)
	{
		const map<UnitValue, long>& r_sa_map = (rVecPtEqv[i])->m_mapSenCnt;
		for (sv_pos = r_sa_map.begin(); sv_pos != r_sa_map.end(); ++sv_pos)
		{
			map<UnitValue, long>::iterator temp_pos = mapEqClsCnt.find( (*sv_pos).first );
			if (temp_pos == mapEqClsCnt.end())
			{
				mapEqClsCnt.insert( *sv_pos );
			}
			else
			{
				(*temp_pos).second += (*sv_pos).second;
			}
			num_tuple += (*sv_pos).second;
		}
	}

	float emd = EMD( m_nTuples, num_tuple, m_vecSenId, m_mapSenDistn, mapEqClsCnt );

	list<long>::const_iterator tpl_pos;
	for (i = 0; i < num_eqv; ++i)
	{
		const EqvClass& r_eqv = *rVecPtEqv[i];
		for (tpl_pos = r_eqv.m_lstTplId.begin(); tpl_pos != r_eqv.m_lstTplId.end(); ++tpl_pos)
		{
			rVecRisk[*tpl_pos] = emd;
		}
	}	

	return true;
}
bool T_Closeness::Verify( const EqvClass& rEqvCls )
{
	long total = 0;

	map<UnitValue, long>::const_iterator sen_pos;
	for (sen_pos =  rEqvCls.m_mapSenCnt.begin(); sen_pos != rEqvCls.m_mapSenCnt.end(); ++sen_pos)
	{
		total += (*sen_pos).second;
	}

	float emd = EMD( m_nTuples, rEqvCls.m_lstTplId.size(), m_vecSenId, m_mapSenDistn, rEqvCls.m_mapSenCnt );

	if ( emd > m_fT )
	{
		return false;
	}

	return true;
}
Пример #3
0
//Perform statistical comparison 
int IMCSEngine::compare(const char* image_file2, 
						double&		result,
						int&		result_type,
						int&		message_len,
						char*		message) {


	//Check if prepared successfully 
	if (im_prepared == false) {
		message_len = snprintf(message, message_len, "Invalid prepared state: %d", im_prepared);
		return ST_INVALID_PARAMETERS;	
	}


	//Read image file data
	image2 = imread(image_file2, CV_LOAD_IMAGE_COLOR);
	if (image2.empty() == true || image2.channels() != 3) {
		message_len = snprintf(message, message_len, "Invalid image file: %s", image_file2);
		return ST_INVALID_IMAGE;
	}


	//Reduce image colors
	if (im_reduce_factor >= RF_MIN) {
		colorReduce(image2, im_reduce_factor);
	}
	

	//Create image histogram 
	calcHistBGR(image2, image_histo2, im_dim_size);


	#ifdef IMCS_DEBUG_TIMES
	double tStart = getTimingStart();													//Start timing
	#endif

	double identity = 0.0;																//Used only in IM_COMP_INTERSECT

	switch (im_compare_method){
		case COMP_CORREL:
			result = compareHist(image_histo1, image_histo2, CV_COMP_CORREL);			//Comparison result (1 is perfect)
			result = (result > 0) ? result : 0;											//Eliminate negative values
			result_type = RES_TYPE_PERCENT;
			break;

		case COMP_CHISQR:
			result = compareHist(image_histo1, image_histo2, CV_COMP_CHISQR);			//Comparison result (0 is perfect)
			result_type = RES_TYPE_VALUE;
			break;

		case COMP_INTERSECT:
			identity = compareHist(image_histo1, image_histo1, CV_COMP_INTERSECT);		//Calculate "identity" value for image1 histogram
			result = compareHist(image_histo1, image_histo2, CV_COMP_INTERSECT);		//Comparison result (higher score is better match)
			result = (result / identity);												//Express as identity fraction
			result_type = RES_TYPE_PERCENT;
			break;

		case COMP_BHATTACHARYYA:
			result = compareHist(image_histo1, image_histo2, CV_COMP_BHATTACHARYYA);	//Comparison result (0 is perfect match)
			result = (1.0 - result);													//Invert scale (1 is perfect)										 
			result_type = RES_TYPE_PERCENT;
			break;

		case COMP_EMD_L1:
			calcEMDSig(image_histo2, emd_sig2, im_dim_size);
			result = EMD(emd_sig1, emd_sig2, CV_DIST_L1);								//Calculate distance (0 is perfect match)
			result_type = RES_TYPE_VALUE;
			break;

		case COMP_EMD_L2:
			calcEMDSig(image_histo2, emd_sig2, im_dim_size);
			result = EMD(emd_sig1, emd_sig2, CV_DIST_L2);								//Calculate distance (0 is perfect match)
			result_type = RES_TYPE_VALUE;
			break;
	}


	#ifdef IMCS_DEBUG_TIMES
	double tElapsed = getTimingResult(tStart);											//Get timing result
	printf("image_compare_stat() exec time: %fms\n", tElapsed);							//Display timing results
	#endif


	//Info message on success
	if (result_type == RES_TYPE_PERCENT) {
		message_len = snprintf(message, message_len, "Result: %f%% for compare method: %d", (result * 100), im_compare_method);
	} else {
		message_len = snprintf(message, message_len, "Result: %f for compare method: %d", result, im_compare_method);
	}

	//Success
	return ST_OK;
}