ピクセルプロファイルを計算するピクセル面積アルゴリズム
ピクセルプロファイルを計算するピクセル面積アルゴリズム
このアルゴリズムは、閉じた画素プロファイル、または非閉じた画素プロファイル、いわゆる画素領域の面積サイズを求めるのに適している.ここで、画素輪郭点は、一定の順序で並べられた離散点シーケンスでなければならないが、本稿では反時計回りを例に、読者が興味を持っている場合は、時計回り方向を順序とするコードに自分で修正することができる.
Contourは輪郭空間点の構造体で、使用時にmallocで連続するメモリブロックを割り当て、contourApproxAreaMark関数の画素面積はほぼ整数に統一され、rContoursは、入力された面積フィルタ対象の輪郭空間点メモリブロック、Widthは、輪郭がある画像の幅、Heightは輪郭のある画像の高さです.MinAreaは輪郭画素面積下限、MaxAreaは輪郭画素面積の上限であり、戻り値は面積範囲内の輪郭を除去した後の輪郭空間点である.
このアルゴリズムは、閉じた画素プロファイル、または非閉じた画素プロファイル、いわゆる画素領域の面積サイズを求めるのに適している.ここで、画素輪郭点は、一定の順序で並べられた離散点シーケンスでなければならないが、本稿では反時計回りを例に、読者が興味を持っている場合は、時計回り方向を順序とするコードに自分で修正することができる.
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;
}