//删除小面积区域
/*deleteSmallArea参数说明:
deleteSmallArea(
Uchar* ioput, 输入/输出二值图像
int rowSize, 行数
int colSize, 列数
int areaThr 小于该阈值点去掉
)
*/
static void deleteSmallArea(Uchar* ioput, int rowSize, int colSize,int areaThr)
{
Uchar backFlag = 0;
Uchar targetFlag = MAXIMUM_PIXEL_VALUE;
//区域标记
int* connectArea = (int*)malloc(rowSize * colSize * sizeof(int)); //记录各区域面积
memset(connectArea, 0, rowSize * colSize * sizeof(int));
//int connectArea[NUMBER_OF_PIXELS] ={};
int areaNumber = 0;
Uchar* connectFlag = (Uchar*)malloc(rowSize * colSize * sizeof(Uchar));
memcpy(connectFlag, ioput, rowSize * colSize * sizeof(Uchar));
ConnectivityMark(connectFlag, 8,connectArea, &areaNumber, rowSize, colSize, backFlag, targetFlag);
int smallAreaNum = 0;//面积小于areaThr的区域数量
//标记值为该值的区域面积小于areaThr
int* areaValue = (int*)malloc(areaNumber * sizeof(int));//areaValue从1开始,可取1~areaNumber。(毕竟一共areaNumber个区域)
//areaFlag从1开始
for (int areaFlag = 1; areaFlag <= areaNumber; areaFlag++)
{
if (connectArea[areaFlag] < areaThr)
{
areaValue[smallAreaNum] = areaFlag;
smallAreaNum = smallAreaNum + 1;
}
}
int wide = OFF_BORDER_WIDTH;
for (int k=0; k < smallAreaNum;k++)
{
for (int i = wide; i < rowSize - wide; i++)
{
for (int j = wide; j < colSize - wide; j++)
{
if (connectFlag[i * colSize + j] == areaValue[k])
{
ioput[i * colSize + j] = backFlag;
}
}
}
}
free(connectArea);
connectArea = NULL;
free(connectFlag);
connectFlag = NULL;
free(areaValue);
areaValue = NULL;
}
删除小面积区域
猜你喜欢
转载自blog.csdn.net/u013297911/article/details/88058088
今日推荐
周排行