删除小面积区域

//删除小面积区域
/*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