ピクセルプロファイルを計算するピクセル面積アルゴリズム

2744 ワード

ピクセルプロファイルを計算するピクセル面積アルゴリズム
このアルゴリズムは、閉じた画素プロファイル、または非閉じた画素プロファイル、いわゆる画素領域の面積サイズを求めるのに適している.ここで、画素輪郭点は、一定の順序で並べられた離散点シーケンスでなければならないが、本稿では反時計回りを例に、読者が興味を持っている場合は、時計回り方向を順序とするコードに自分で修正することができる.
Contourは輪郭空間点の構造体で、使用時にmallocで連続するメモリブロックを割り当て、contourApproxAreaMark関数の画素面積はほぼ整数に統一され、rContoursは、入力された面積フィルタ対象の輪郭空間点メモリブロック、Widthは、輪郭がある画像の幅、Heightは輪郭のある画像の高さです.MinAreaは輪郭画素面積下限、MaxAreaは輪郭画素面積の上限であり、戻り値は面積範囲内の輪郭を除去した後の輪郭空間点である.
typedef struct Contours
{
	int height;
	int width;
	int stateFlag;
} contour;
contour* contourApproxAreaMark( contour* _rContours,
				const int _Width, const int _Height,
				const int _MinArea, const int _MaxArea )
{
	int point_Count_Now = 0;//       
	int i = 0, j = 0;//     
	int start_I = 0, start_J = 0;//        
	int vector_1[2] = {0}, vector_2[2] = {0};//                 
	int temp_Triangle_Area = 0;//              
	int temp_Area = 0;//        
	int set0_Count = 0;//             
	int temp_Offset = 0;//       
	contour* contour_New_Ptr = NULL;//            


	point_Count_Now = _rContours[0].stateFlag;
	_rContours[0].stateFlag = 1;
	while ( _rContours[i].height > 0 )
	{
		set0_Count = 0;
		temp_Area = 0;
		if ( 0 != _rContours[i].stateFlag )
		{
			start_I = _rContours[i].height;
			start_J = _rContours[i].width;
			set0_Count ++;
			while ( 0 == _rContours[i+set0_Count].stateFlag )
			{
				vector_1[0] = _rContours[i+set0_Count].width - start_J;//         
				vector_1[1] = _rContours[i+set0_Count].height - start_I; 
				vector_2[0] = _rContours[i+set0_Count+1].width - _rContours[i+set0_Count].width;//         
				vector_2[1] = _rContours[i+set0_Count+1].height - _rContours[i+set0_Count].height;
				temp_Triangle_Area = vector_1[0]*vector_2[1] - vector_1[1]*vector_2[0];//        
				//      :       ;     :       。       
				temp_Area += temp_Triangle_Area;//        
				set0_Count ++;
			}
			temp_Area = abs(temp_Area);
			temp_Offset = set0_Count + 1;//     
			if ( temp_Area*0.5 < _MinArea || temp_Area*0.5 > _MaxArea )
			{
				point_Count_Now -= (set0_Count+1);
				while ( set0_Count )
				{
					_rContours[i+set0_Count].stateFlag = 3;
					set0_Count --;
				}
				_rContours[i].stateFlag = 3;
			}
		}
		i += temp_Offset;
	}

	contour_New_Ptr = ( contour *)malloc( point_Count_Now * sizeof(contour) );//     
	i = 0; j = 0;
	while ( _rContours[i].height > 0 )
	{
		if ( 3 != _rContours[i].stateFlag )
		{
			contour_New_Ptr[j].height = _rContours[i].height;
			contour_New_Ptr[j].width = _rContours[i].width;
			contour_New_Ptr[j].stateFlag = _rContours[i].stateFlag;
			j ++;
		}
		i ++;
	}
	contour_New_Ptr[0].stateFlag = point_Count_Now;//                      
	free(_rContours);
	return contour_New_Ptr;
}